我想实现以下功能:
我写了以下函数:
int encrypt(char clear[1000], char key[100], int lk/*length of the cleatext*/, int ls /*length of key*/) {
int a, i;
unsigned char result[1000];
char string[1000];
for (i = 0; i <= lk; i++) {
if (i+1-ls >= 0) { /*if the key is too short*/
a = mersenne_twister();
string[i]=key[i+1-ls]^a; /*XOR */
} else {
a=mersenne_twister();
string[i] = key[i]^a; /*XOR */
}
result[i] = clear[i]^string[i];
putchar(result[i]);
}
return 1;
}
但功能不正常;它返回(putchar
部分)不可读的东西。
我的错误在哪里?或者整个代码是错的?
答案 0 :(得分:1)
如果您尝试使用其他内容打印字符xored
,您通常会遇到奇怪的字符。例如,将'M'与'P'一起使用将导致'\ GS'(组分隔符),这是不可打印的。
答案 1 :(得分:1)
不要将结果打印为字符。它是不是一个字符:你用一些伪随机字节对一个字符进行异或。结果是一个字节。它可能是偶然的可打印的,但是,它可能不是。您应该将结果视为一个字节,然后将其打印出来:
/* format a byte as 2 hex digits */
printf("%02X", result[i]);
我还会添加一个注意事项:不使用此“密码”。 Mersenne twister不是加密安全的随机数生成器,因此生成的密码也不安全。
如果您想学习流密码,请从简单的Vernam密码开始,然后阅读RC4。两者都易于理解且易于实现。因此,它们很适合让你的双脚湿透。