在c中实现流密码

时间:2012-12-04 21:21:21

标签: c encryption mersenne-twister

我想实现以下功能:

  • 我使用Mersenne-Twister-Algorithm(来自维基百科)作为我的伪随机数生成器。
  • 这是一个流密码
  • 伪代码是:加密文本= CLEARTEXT XOR STREAM; '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部分)不可读的东西。 我的错误在哪里?或者整个代码是错的?

2 个答案:

答案 0 :(得分:1)

如果您尝试使用其他内容打印字符xored,您通常会遇到奇怪的字符。例如,将'M'与'P'一起使用将导致'\ GS'(组分隔符),这是不可打印的。

答案 1 :(得分:1)

不要将结果打印为字符。它是不是一个字符:你用一些伪随机字节对一个字符进行异或。结果是一个字节。它可能是偶然的可打印的,但是,它可能不是。您应该将结果视为一个字节,然后将其打印出来:

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

我还会添加一个注意事项:使用此“密码”。 Mersenne twister不是加密安全的随机数生成器,因此生成的密码也不安全。

如果您想学习流密码,请从简单的Vernam密码开始,然后阅读RC4。两者都易于理解且易于实现。因此,它们很适合让你的双脚湿透。