如何在Python中使用RSA/ECB/PKCS1Padding创建密钥?

6 投票
1 回答
10185 浏览
提问于 2025-04-15 22:50

我在用Python实现RSA加密时遇到了一些困难,特别是想用ECB模式和PKCS1填充方式。我查了一下pyCrypto这个库,但发现它的主版本里没有PKCS1填充(不过有一个补丁里有)。不过我找到了M2Crypto这个包,它支持RSA和PKCS1填充,但我不确定我能不能选择ECB模式...

1 个回答

13

像ECB这样的链式模式对于RSA来说没有意义,除非你用错了。

ECB是针对分组密码的:输入的数据会被分成相同大小的小块,每一块单独加密。这种方式会带来一些弱点,所以最好避免在分组密码中使用ECB模式。

而RSA并不是分组密码。具体来说,RSA加密后的消息会变大:比如用一个1024位的RSA密钥(这是比较常见的大小),你可以加密最多117字节的消息,但加密后的结果会变成128字节。

你可以想象把一个更大的消息分成117字节(或更少)的块,然后单独用RSA加密每一块,但实际上没人这么做,主要是因为这样会增加大小和CPU的开销。而且,关于这种分块和重新组合的安全问题也没有人研究过,所以结果可能会很弱。通常,当一个加密库在算法名称中需要一个填充模式,比如“RSA/ECB/PKCS1Padding”,这只是因为名称的语法限制,而链式部分(ECB)实际上是被忽略的(比如Java就是这么做的)。

在实际操作中,当需要加密的数据可能超过RSA的最大输入大小时,会使用混合加密:RSA加密的是一个随机的对称密钥(例如,一串16个随机字节),然后用这个密钥对实际数据进行对称加密(比如用AES)。这样做更节省空间(因为对称加密不会增加块的大小),而且CPU效率更高(对称加密比非对称加密快得多,尤其是RSA的解密)。

撰写回答