我们目前正在开发一个项目,我们必须从数据库中获取用户的公钥,并为该用户加密字符串。
不幸的是,我们的加密库出现了错误(加密== 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 / string。
我已从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函数正确读取公钥?
答案 0 :(得分:2)
好的,所以经过进一步的谷歌搜索后,我找到了答案: 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-----"
有效地,64chars后的新行。