RSA公钥将ASCII值加密为0,如何解密?

cud*_*mer 5 encryption rsa

自从在计算机科学讲座中学习了春季密码以来,我决定学习 RSA 加密。我掌握了 RSA 背后的想法(它非常聪明),但是在尝试编写自己的 C 程序来加密和解密字符串时,我遇到了一些问题。

我使用公钥加密每个字符的 ASCII 值,然后解密密文。然而,我发现有时我创建的公钥会将 ASCII 值加密为 0,然后就无法将其解密为 0^anything = 0。我肯定是错的,因为可以使用以下方法加密/解密二进制文件RSA。

例如

  • p = 3
  • q = 5
  • N = 15 (p*q)
  • m = (p-1)(q-1) = 8
  • e = 7(与 m 互质)
  • d = 7 (7d(mod8) = 1 ...在人们尝试之前,我只使用 7,因为它对于这个示例来说很方便(不适用于安全加密)

现在取字符“T”(ASCII 值 84)

运行加密,密文=0

0^7 (mod 8) = 0 ...不是 84!

有人可以指出我正确的方向吗?

提前致谢

sup*_*cat 5

RSA 加密仅限于加密 1 到 (p*q)-1 范围内的正数,这些正数不是 p 或 q 的倍数。在实际应用中,p*q通常会比要加密的最大消息大得多,并且消息将用随机位填充以填充1到(p*q)-1的范围。虽然从理论上讲,为消息选择的随机填充可能会导致其成为 p 或 q 的倍数,但实际上,唯一可能发生的情况是随机数生成器出现严重错误。

然而,在“玩具应用程序”中,有问题的值代表了可能消息空间的更大部分。即使您选择的 p 和 q 足够大,使得 p*q 大于您的消息(例如 13 和 17),仍然有许多可能的消息值会失败(例如 65 或 85)。我建议将 13 和 17 作为用于演示目的的合理值,但需要注意的是,并非所有消息值都适用。