C RC4 super 奇怪的行为

标签 c encryption rc4-cipher stream-cipher

所以我在我的网站上使用了纯 C 语言的 RC4 实现。除非我输入 6 个字符的字符串,否则它工作得非常好。然后我得到内部错误页面。发现只有这个长度会导致问题。

1.Crypt.c

unsigned char S[256];
unsigned int i, j;
void swap(unsigned char *s, unsigned int i, unsigned int j) {
unsigned char temp = s[i];
s[i] = s[j];
s[j] = temp;
}

/* KSA */
void rc4_init(unsigned char *key, unsigned int key_length) {
for (i = 0; i < 256; i++)
    S[i] = i;

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

i = j = 0;
}

/* PRGA */
unsigned char rc4_output() {
i = (i + 1) & 255;
j = (j + S[i]) & 255;

swap(S, i, j);

return S[(S[i] + S[j]) & 255];
}

char *rc4_e(char *text, size_t text_length)
{
char *dup=(char *)malloc(text_length * sizeof(char));
strcpy(dup,text);
unsigned char *vector[2] = {"key", dup}; 
    int y;
    rc4_init(vector[0], strlen((char*)vector[0]));
char *out=(char *)malloc(text_length * sizeof(char) );
char *ptr=out;
    for (y = 0; y < strlen((char*)vector[1]); y++)
       ptr += sprintf(ptr,"%02X",vector[1][y] ^ rc4_output());
*(ptr + 1) = '\0';
return out;
}

2.主

#define SIZE 1000
char* pass=(char*)malloc(SIZE * sizeof(char));
char *RC4_pass=(char*)malloc(getSize(pass) * sizeof(char)); 
 strcpy(RC4_pass,rc4_e(pass,sizeof(pass))); 

非常欢迎任何建议或想法。只想知道是函数本身不好还是我的 C 代码的其余部分不好。 谢谢!

最佳答案

这一行有问题:

char *dup=(char *)malloc(text_length * sizeof(char));

您忘记为字符串末尾的终止 '\0' 添加一个额外的字节。所以在下一行:

strcpy(dup,text);

您在数组 dup 中提交越界访问,这会导致未定义的行为。

关于C RC4 super 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29639055/

相关文章:

java - RC4加密java

c - 信号量和并发编程

C 字符串反转

c++ - 如何读取当前连接的显示器 ID?

java - 无法将加密格式从 Java 复制到 PHP

ssl - 仅使用 TLSv1.2 且不使用 SSLv3 TLSv1.2 :! aNULL :! eNULL 的密码套件规范

C语言可以判断指针指向的内存是否可以访问吗?

c# - 关于使用 AES 加密进行 Zip 的廉价/免费 .NET 库的建议?

encryption - 将单行RSA私钥SSH key 转换为多行

java - 使用 RC4 加密跳过/寻找位置