我有一组现有的Python代码,它使用原始(教科书)RSA加密机制来加密小块数据。具体来说,python代码将公钥加载到变量publickey中,然后使用以下代码加密此数据:
ciphertext = publickey.encrypt(plaintext,None)
是的我已阅读免责声明"此功能执行简单的原始RSA加密(教科书)。在实际应用中,您总是需要使用适当的加密填充,..."不幸的是,我目前无法更改此代码,所以我坚持使用这个"教科书"加密命令。
请注意,即使此命令不使用任何填充方案,它仍然似乎能够加密任何(适当小)量的明文。换句话说,明文可以是任何长度,直到RSA施加的任何限制。
现在,我想在IOS应用程序中使用OPENSSL C库来执行相同的RSA加密。我无法弄清楚如何做与python函数完全相同的事情。 OPENSSL有一个方法RSA_public_encrypt,你传入明文的大小,明文本身,一个包含公钥信息的RSA对象指针,以及RSA填充机制。为了复制python在加密库中做的事情,我想我可以使用RSA_NO_PADDING作为填充机制。问题是OPENSSL在他们的文档中声明如果你使用RSA_NO_PADDING,那么要加密的明文的长度必须完全等于某个值:RSA_Size(rsa)其中rsa是一个指向传入的RSA对象的指针(对象)包含公钥。)
换句话说,python加密库似乎能够在没有填充的情况下加密可变长度明文,但是OPENSSL要求明文是固定长度的。那么python加密库究竟在做什么来处理明文的可变大小,有什么方法可以在OPENSSL中复制它?
答案 0 :(得分:-1)
如果您查看RSA_NO_PADDING的文档,他们会解释:
此模式仅应用于实现加密声音 应用程序代码中的填充模式。直接加密用户数据 与RSA不安全。
换句话说,RSA_NO_PADDING用于您自己处理填充的情况,因此OpenSSL期望输入适当的大小。它并不意味着“教科书RSA”。
有没有令人信服的理由你不能改变python代码?教科书RSA不安全,使用它会带来很大的风险。