【发布时间】:2020-05-29 15:14:51
【问题描述】:
以下是使用 rsa 私钥的 Java 代码(例如:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvBXTe278Lwg2MoI7iGKolSYuF+sNFKrsZplxCN9x0kItU3KIf8+1q60ILLwLewCEf7foxzpWp32j9YYU9vNBghuJ7BHcDYTffTRcv+QdNno491j701Hq7DIw13AGCQQTRcnfclvblnytIEWoQsiUvPJcdiWgqJIX3IQGA47a+uwIDAQAB)
并使用 rsa 公钥(从上面的 rsa 私钥生成的公钥)加密纯字符串 test123
byte[] array = javax.xml.bind.DatatypeConverter.parseBase64Binary(key); KeyFactorykf = KeyFactory.getInstance(“RSA”);
publicKey = kf.generatePublic(new X509EncodedKeySpec(array)); Cipher = Cipher.getInstance(“RSA”);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] result = cipher.doFinal (“test123”.getBytes(“UTF-8”));
String output = javax.xml.bind.DatatypeConverter.printBase64Binary(result);
我尝试在 python 中使用 m2crypto 库:
import base64
from M2Crypto import BIO, RSA
pubkey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvBXTe278Lwg2MoI7iGKolSYuF+sNFKrsZplxCN9x0kItU3KIf8+1q60ILLwLewCEf7foxzpWp32j9YYU9vNBghuJ7BHcDYTffTRcv+QdNno491j701Hq7DIw13AGCQQTRcnfclvblnytIEWoQsiUvPJcdiWgqJIX3IQGA47a+uwIDAQAB'
# encryption
text = "test123".encode('utf-8') # Plaintext
pub_bio = BIO.MemoryBuffer(pubkey.encode('utf-8')) # Public key string
pub_rsa = RSA.load_pub_key_bio(pub_bio) # Load public key
secret = pub_rsa.public_encrypt(text, RSA.pkcs1_padding) # Public key encryption
sign = base64.b64encode(secret) # Ciphertext base64 encoding
print(sign)
我得到的错误是:
Traceback (most recent call last):
File "encrypt_rsa_public_key.py", line 13, in <module>
pub_rsa = RSA.load_pub_key_bio(pub_bio) # Load public key
File "/Users/umeshpathak/env/py3env/lib/python3.7/site-packages/M2Crypto/RSA.py", line 444, in load_pub_key_bio
rsa_error()
File "/Users/umeshpathak/env/py3env/lib/python3.7/site-packages/M2Crypto/RSA.py", line 333, in rsa_error
raise RSAError(Err.get_error_message())
M2Crypto.RSA.RSAError: no start line
我该如何解决这个问题?
【问题讨论】:
-
库可能希望获得 PEM 格式的密钥,因此包含在
-----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----之间,并且每个末尾都有新行。 -
@michalk,谢谢我将
pubkey更新为:pubkey = f'-----BEGIN PUBLIC KEY-----\n{pubkey}\n-----END PUBLIC KEY-----'现在它似乎工作了!!