Python RSA加密计算明文有效长度

Python RSA Encryption calculate valid length of plaintext

我正在开发一个使用 RSA 加密和解密的程序(在 python 中)。我读到仅使用 RSA 是不安全的,建议使用 PCKS 来做到这一点。我的主要问题是如何有效地计算我可以使用 PCKS 加密和解密的纯文本的长度(考虑到我使用的是 4096 位密钥,它应该小于 512 字节,我想我必须占用一些字节PCKS 在帐户中使用)。

总结一下:我如何有效地获取(或拆分)纯文本的长度以便encrypt/decrypt(以及我现在如何管理去 PCSK 需要多少字节)?

额外问题:为什么仅使用 RSA 加密明文是不安全的?

编辑:正如评论中所建议的,我将使用 AES 对称密钥 encrpyt/decrypt 并与 RSA 共享密钥。根据这个变化,python 会自己计算所有明文的 encrpytion/decryption 还是我必须拆分它(以及如果可以的话如何有效地做到这一点)?

谢谢你的帮助。

首先让我说,很容易错误地实现密码学,所以除非你已经花了很多年研究它(你没有——从你写问题的方式中可以清楚地看出),否则你不应该正在编写用于生产的加密代码。例如,您 return 的错误可用于破解 Bleichenbacher attack 中的密码。但是,如果您只是为了学习活动而这样做,那么这里有一些指导。

您可以选择实施不安全 PKCS #1 v1.5 padding or the more secure PKCS #1 v2.x OAEP padding。您需要知道的一切都在标准中:您应该遵循它直到 T。

为了回答您的问题,对于 OAEP 版本,您需要消息长度 ≤ 模数长度 – 2 * 哈希函数输出长度 – 2,其中长度以字节为单位。

使用 SHA256 哈希的 2048 位模数示例。 2048 位是 256 字节。哈希函数有 256 位输出,即 32 个字节。所以你的消息必须≤ 256 - 2*32 - 2 = 256 - 64 - 2 = 190 字节。

既然您了解 RSA 应该用于加密 AES 等对称密钥,您就知道此类密钥的长度不超过 256 位,即 32 字节。它完全符合 190 字节的限制。

为什么教科书 RSA 不安全?好吧,三十年的密码学已经将一个有趣的概念 (RSA) 转变为我们想要像因式分解一样难以破解的概念,我们几乎可以证明在一些疯狂的随机 oracle 假设下打破它与因式分解一样困难。我们获得这个更安全版本 (OAEP) 的唯一方法是排除不断被破坏的启发式版本。如果您想深入阅读失败设计的历史,最好的论文是 Twenty Years of Attacks on the RSA Cryptosystem.

但是,让我给你一点洞察教科书RSA错误的理论。即使只有一点信息被加密,密码系统也应该是安全的。假设 Markov 向 Sanchez 发送一条加密消息,其中明文是一位。如果张某看到密文,他能确定明文是什么吗?有了教科书RSA,答案是肯定的。他所要做的就是用相同的 public 密钥加密“1”和“0”,然后查看哪一个与他捕获的密文相匹配。经验教训:为了安全起见,您需要对同一消息进行两次加密不会两次产生相同的密文。因此,安全加密需要随机性!