【问题标题】:Implementation of a Stream cipher in c在 c 中实现流密码
【发布时间】:2012-12-04 21:21:21
【问题描述】:

我想实现以下功能:

  • 我正在使用 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 部分)不可读的内容。 我的错误在哪里?还是整个代码错了?

【问题讨论】:

  • 不要这样做。 Mersenne Twister 不是加密安全的随机数生成器。
  • 我知道,但这只是一个简单的例子,可以让我理解一些事情......

标签: c encryption mersenne-twister


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      • 2012-04-16
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多