【问题标题】:C - One-time pad encryption via a bit-by-bit process using StdIn and StdOutC - 通过使用 StdIn 和 StdOut 的逐位过程进行一次性加密
【发布时间】:2023-12-11 20:32:01
【问题描述】:

我想了解如何使用密钥文件进行 XOR 加密,而不是仅使用单个数字进行 k。我发现这个问题的挑战是:

  1. 我们如何才能使用密钥文件逐字节加密输入文件?
  2. 我们如何检查密钥是否比消息长?
  3. 我们能否使用相同的 XOR 运算恢复原始消息?

我的代码如下:

    while ((c = fgetc(in)) != EOF) { //problem lies here

        k = fgetc(k); // <- ERROR:  incompatible integer to pointer conversion assigning to 'FILE *

        fputc(c ^ k, out);
    }

【问题讨论】:

  • 1.使用循环。 2.为什么重要,回到关键的开头。 3. 是的,XOR 是它自己的逆。
  • 如果明文文件比密钥长,你总是可以只包装异或密钥。
  • k = fgetc(k);。您对文件和从中读取的值使用相同的变量。
  • 具体来说,您需要一个可以阅读的int d;d = fgetc(k);
  • 2.如果在从输入文件中读取EOF之前先从密钥文件中读取EOF,那么密钥文件太短了。

标签: c file encryption stdin xor


【解决方案1】:

当您到达密钥文件的末尾时,倒回到开头。

您还需要为从密钥文件中读取的字符使用不同的变量,而不是重复使用k

while ((c = fgetc(in)) != EOF) {
    int kc = fgetc(k);
    if (kc == EOF) {
        rewind(k);
        kc = fgetc(k);
    }
    fputc(c ^ kc, out);
}

同样的技术也适用于解密,因为 XOR 是对称的。 (c ^ kc) ^ kc == c

【讨论】:

    最近更新 更多