【问题标题】:Python Crypto RSA textbook encryption versus openssl - what is it doing?Python Crypto RSA 教科书加密与 openssl - 它在做什么?
【发布时间】:2013-12-05 03:20:20
【问题描述】:

我有一组现有的 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 中复制它?

【问题讨论】:

    标签: encryption openssl rsa public-key-encryption pycrypto


    【解决方案1】:

    如果您查看 RSA_NO_PADDING 的文档,他们会解释:

    此模式仅应用于实现加密声音 应用程序代码中的填充模式。直接加密用户数据 使用 RSA 是不安全的。

    换句话说,RSA_NO_PADDING 适用于您要自己处理填充的情况,因此 OpenSSL 需要适当大小的输入。这并不意味着“教科书 RSA”。

    您不能更改 Python 代码是否有令人信服的理由?教科书 RSA 不安全,使用它会冒很大的风险。

    【讨论】:

    • 你是对的 - 我继续将填充方案更改为推荐的方案。
    • 如果使用 NO_PADDING,在开始模幂运算之前,只需使用 PKCS#1 中的 I2OSP 原语(即从整数生成八位字节字符串)即可。这几乎是您可以在不从数字开始的情况下获得教科书 RSA 的最接近的程度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 2017-06-10
    相关资源
    最近更新 更多