-1

我想实现以下功能:

  • 我正在使用 Mersenne-Twister-Algorithm(来自 Wikipedia)作为我的伪随机数生成器。
  • 这是一个流密码
  • 伪代码为:密文=CLEARTEXT XOR STREAM;“流”被定义为 PSEUDORANDOM_NUMBER XOR KEY

我写了以下函数:

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部分)不可读的东西。我的错误在哪里?还是整个代码错了?

4

2 回答 2

1

如果你试图xored用其他东西打印一个字符,你真的会经常得到奇怪的字符。例如,将“M”与“P”异或将导致“\GS”(组分隔符),这是不可打印的。

于 2012-12-04T21:28:18.307 回答
1

不要将结果打印为字符。它不是一个字符:你已经对一个带有一些伪随机字节的字符进行了异或运算。结果是一个字节。碰巧,它可能是可打印的,但话又说回来,它可能不是。您应该按原样处理结果,一个字节,并按如下方式打印:

/* format a byte as 2 hex digits */
printf("%02X", result[i]);

我还要添加一个警告:不要使用这个“密码”。Mersenne twister 不是加密安全的随机数生成器,生成的密码也不安全。

如果您想学习流密码,请从简单的 Vernam 密码开始,然后阅读 RC4。两者都易于理解且易于实施。因此,可以这么说,它们有利于弄湿你的脚。

于 2012-12-04T21:44:26.537 回答