1

我想知道如何使用一组数字作为 rc4 加密的密钥。根据互联网和维基,KEY 实际上是一串字母,但使用了字节。但在我的程序中,我需要使用 6 位数字作为 KEY。我应该将它转换为字符串还是如何。

Key Sheudling 算法如下所示。

void ksa(u_char *State, u_char *key) {
int byte, i, keylen, j=0;

keylen = (int) strlen((char *) key);

for(i=0; i<256; i++) {
    j = (j + State[i] + key[i%keylen]) % 256;
    swap(&State[i], &State[j]);
}

我该如何修改代码,或者我应该将数字转换为字符串。

4

1 回答 1

1

字符串和数字都是字节。这是一个接受无符号字符键的有效 RC4 代码:

#include<stdio.h>
#include<string.h>

#define SIZE 256

unsigned char SBox[SIZE];
int i;
int j;

void initRC4(unsigned char Key[]);
unsigned char getByte(void);

void initRC4(unsigned char Key[])
{
    unsigned char tmp;
    unsigned char KBox[SIZE];

    for(i=0;i<SIZE;i++)
        SBox[i]=i;

    for(i=0;i<SIZE;i++)
        KBox[i]=Key[i % strnlen(Key,SIZE)];

    for(j=0,i=0;i<SIZE;i++)
    {
        j=(j+SBox[i]+KBox[i]) % SIZE;
        tmp=SBox[i];
        SBox[i]=SBox[j];
        SBox[j]=tmp;
    }
}

unsigned char getByte(void)
{
    unsigned char tmp;

    i=(i+1)%SIZE;
    j=(j+SBox[i])%SIZE;
    tmp=SBox[i];
    SBox[i]=SBox[j];
    SBox[j]=tmp;

    return SBox[(SBox[i]+SBox[j])%SIZE];
}

首先,初始化 RC4 流:

initRC4(key);

然后你做:

getByte()

...它总是从您设置的 RC4 流中返回 1 个字节。

不过要记住一件事——字符串中的一个字母并不总是等于 1 个字节。字符串中的整数和数字符号也是如此。确实,在弄乱密码之前,您必须阅读计算机编程简介。

以下是整数字符串中字节的不同之处的演示:

#include <string>

int main(int argc, char **argv) {

    const int n=67898;
    const std::string str = "67898";    

    const int arrayLength = sizeof(int);
    const int stringArrayLength = str.size();
    unsigned char *bytePtr=(unsigned char*)&n;


    printf("Bytes for integer: ");
    for(int i=0;i<arrayLength;i++)
    {
       printf("%X ", bytePtr[i]);
    }
    printf("\n");

    printf("Bytes for string: ");
    for(int i=0;i<stringArrayLength;i++)
    {
       printf("%X ", str.at(i));
    }
    printf("\n");


    return 0;

}

输出:

Bytes for integer: 3A 9 1 0
Bytes for string: 36 37 38 39 38

字符串末尾通常会有一个终止字节,因此您可以将 +1 字节添加到字符串大小。

于 2013-05-01T11:29:47.987 回答