Python 加密库无法使用我的 PEM 格式加载_pem_public_key

标签 python cryptography

我们目前正在开发一个项目,我们必须从数据库中获取用户的公钥并加密该用户的字符串。

不幸的是,我们的加密库出现错误 (cryptography==1.2.1)。

公钥:

-----BEGIN PUBLIC KEY-----MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAy2SBwad+TZRyCPDUdxZkGqBipyY7UmTTdGOKL/dgOOsuITXFy/COCi2ylo/owI7u+/K5lkdoBunn1OEu+UFzxRy4bKQK2OkpP6dtAHfyexracpeiHVccRIkQB743DpfupDVtR5TweZsjkRM2SDcpwXZJbnSpa8pzxl6mHvZhV/D2kDkSPLQnI6iWchExt5e/psorpWvy22smaL1xvINztaaRSXFqMQILtSxv/2lJJGc6PRyQacQ4XxDk2DwKBKPyFYHYelYpjGFErUIRz7/EdY4vc3pzr2HMo0AFvvu51ezKIrFGDXt9I7xwEEOSY59mNtA9u9oPyd7UhXkK1JB7OSI458rfHZEXUsvmqqpHH8FKC4dBCZasEHqzMdter05h/v2hMbPV/QgqrArs1p/P6KMpnlYvhnTrIj9p30kOIq7WSfCyXBlTjAb8unYST6vtHXB21TOM6e6szea8fWgCnO3e/xD4M/xdVEqgGxDJWr7qOeHL+l1I93f0wBpO4qlmdMgFz+UqO2p+7dtN4JQO5PwCYHOLgE9bJJZKzaB61BeM4xznqiVfUxOBmtN0k5m1DnKL0lUagSyitwq0H7AY802O91n7ykFYO/gsFkfqNFtdgsGX56lqILU1dYKX3fVsd8r5rENndBE7J0HEUjYz9JHjS+m8EMJ+57kKztP0EgUCAwEAAQ==-----END PUBLIC KEY-----

注意:当我将代码粘贴到 sublime 中时,没有空格或换行符!这只是一根线。 <-- 这已经是问题了吗?

它来自 django 模型中的数据库,它是一个 unicode/字符串。

我从 https://cryptography.io/en/latest/hazmat/primitives/asymmetric/rsa/#key-loading 获取了代码

失败的行是:

key = load_pem_public_key(bytes(pem_public_key), backend=default_backend())

错误是:

ValueError: Could not unserialize key data.

来自:

            assert errors[0][1] in (
                self._lib.ERR_LIB_EVP,
                self._lib.ERR_LIB_PEM,
                self._lib.ERR_LIB_ASN1,
            )
            raise ValueError("Could not unserialize key data.")

之所以这样称呼是因为:

            if rsa_cdata != self._ffi.NULL:
                rsa_cdata = self._ffi.gc(rsa_cdata, self._lib.RSA_free)
                evp_pkey = self._rsa_cdata_to_evp_pkey(rsa_cdata)
                return _RSAPublicKey(self, rsa_cdata, evp_pkey)
            else:
                self._handle_key_loading_error()

当断言if rsa_cdata != self._ffi.NULL:失败时,会引发错误。

是什么阻止了 load_pem_public_key 函数正确读取公钥?

最佳答案

好的,经过进一步的谷歌搜索,我在这里找到了答案: https://crypto.stackexchange.com/questions/19043/can-i-remove-new-lines-in-a-public-key

结果是:

pem_public_key = pem_public_key.replace("-----BEGIN PUBLIC KEY-----", "")
pem_public_key = pem_public_key.replace("-----END PUBLIC KEY-----", "")
pem_public_key = re.sub("(.{64})", "\\1\n", pem_public_key, 0, re.DOTALL)
pem_public_key = "-----BEGIN PUBLIC KEY-----\n" + pem_public_key
pem_public_key = pem_public_key + "\n-----END PUBLIC KEY-----"

实际上,64 个字符后是一个新行。

关于Python 加密库无法使用我的 PEM 格式加载_pem_public_key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37541248/

相关文章:

python - 如何获取 Pandas 数据帧每一行中特定值的频率

java - 将 AndroidKeyStoreRSAPrivateKey 转换为 RSAPrivateKey 时崩溃

java - java中的AES加密和使用CryptoJS的javascript解密

ios - 基于椭圆曲线 Diffie–Hellman 和 CommonCrypto 的共享 secret

encryption - 使用 RSA_set0_key(key, n,e,d) 时 RSA_public_decrypt 失败?

python - 可以生成大型 Pandas 数据框 View 的 bool 索引?

python - 重新导入别名/阴影 python 内置方法

python - 递归函数-Collat​​z

python - 为什么使用 `arg=None` 修复 Python 的可变默认参数问题?

Java javax.crypto 和 PHP openssl_decrypt 不相同