Python等效的RSA密钥Java代码中的密码加密部分:

huangapple go评论108阅读模式
英文:

Python equivalent of password encryption from RSA key Java code

问题

以下是使用RSA私钥(例如:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvBXTe278Lwg2MoI7iGKolSYuF+sNFKrsZplxCN9x0kItU3KIf8+1q60ILLwLewCEf7foxzpWp32j9YYU9vNBghuJ7BHcDYTffTRcv+QdNno491j701Hq7DIw13AGCQQTRcnfclvblnytIEWoQsiUvPJcdiWgqJIX3IQGA47a+uwIDAQAB)进行加密,并使用上述RSA私钥生成的公钥加密纯文本字符串test123的Java代码:

  1. byte[] array = javax.xml.bind.DatatypeConverter.parseBase64Binary(key);
  2. KeyFactory kf = KeyFactory.getInstance("RSA");
  3. PublicKey publicKey = kf.generatePublic(new X509EncodedKeySpec(array));
  4. Cipher cipher = Cipher.getInstance("RSA");
  5. cipher.init(Cipher.ENCRYPT_MODE, publicKey);
  6. byte[] result = cipher.doFinal("test123".getBytes("UTF-8"));
  7. String output = javax.xml.bind.DatatypeConverter.printBase64Binary(result);

我尝试使用Python中的m2crypto库执行相同操作的代码:

  1. import base64
  2. from M2Crypto import BIO, RSA
  3. pubkey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvBXTe278Lwg2MoI7iGKolSYuF+sNFKrsZplxCN9x0kItU3KIf8+1q60ILLwLewCEf7foxzpWp32j9YYU9vNBghuJ7BHcDYTffTRcv+QdNno491j701Hq7DIw13AGCQQTRcnfclvblnytIEWoQsiUvPJcdiWgqJIX3IQGA47a+uwIDAQAB'
  4. # 加密
  5. text = "test123".encode('utf-8') # 明文
  6. pub_bio = BIO.MemoryBuffer(pubkey.encode('utf-8')) # 公钥字符串
  7. pub_rsa = RSA.load_pub_key_bio(pub_bio) # 加载公钥
  8. secret = pub_rsa.public_encrypt(text, RSA.pkcs1_padding) # 公钥加密
  9. sign = base64.b64encode(secret) # 密文进行base64编码
  10. print(sign)

我遇到的错误是:

  1. Traceback (most recent call last):
  2. File "encrypt_rsa_public_key.py", line 13, in <module>
  3. pub_rsa = RSA.load_pub_key_bio(pub_bio) # 加载公钥
  4. File "/Users/umeshpathak/env/py3env/lib/python3.7/site-packages/M2Crypto/RSA.py", line 444, in load_pub_key_bio
  5. rsa_error()
  6. File "/Users/umeshpathak/env/py3env/lib/python3.7/site-packages/M2Crypto/RSA.py", line 333, in rsa_error
  7. raise RSAError(Err.get_error_message())
  8. M2Crypto.RSA.RSAError: no start line

如何解决这个问题?

英文:

Below is the Java code that uses rsa private key (ex: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvBXTe278Lwg2MoI7iGKolSYuF+sNFKrsZplxCN9x0kItU3KIf8+1q60ILLwLewCEf7foxzpWp32j9YYU9vNBghuJ7BHcDYTffTRcv+QdNno491j701Hq7DIw13AGCQQTRcnfclvblnytIEWoQsiUvPJcdiWgqJIX3IQGA47a+uwIDAQAB)

and encrypts a plain string test123 using rsa public key (public key generated from rsa private key above)

  1. byte[] array = javax.xml.bind.DatatypeConverter.parseBase64Binary(key); KeyFactorykf = KeyFactory.getInstance(“RSA”);
  2. publicKey = kf.generatePublic(new X509EncodedKeySpec(array)); Cipher = Cipher.getInstance(“RSA”);
  3. cipher.init(Cipher.ENCRYPT_MODE, publicKey);
  4. byte[] result = cipher.doFinal (“test123”.getBytes(“UTF-8”));
  5. String output = javax.xml.bind.DatatypeConverter.printBase64Binary(result);

I tried m2crypto library to do so in python:

  1. import base64
  2. from M2Crypto import BIO, RSA
  3. pubkey = &#39;MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvBXTe278Lwg2MoI7iGKolSYuF+sNFKrsZplxCN9x0kItU3KIf8+1q60ILLwLewCEf7foxzpWp32j9YYU9vNBghuJ7BHcDYTffTRcv+QdNno491j701Hq7DIw13AGCQQTRcnfclvblnytIEWoQsiUvPJcdiWgqJIX3IQGA47a+uwIDAQAB&#39;
  4. # encryption
  5. text = &quot;test123&quot;.encode(&#39;utf-8&#39;) # Plaintext
  6. pub_bio = BIO.MemoryBuffer(pubkey.encode(&#39;utf-8&#39;)) # Public key string
  7. pub_rsa = RSA.load_pub_key_bio(pub_bio) # Load public key
  8. secret = pub_rsa.public_encrypt(text, RSA.pkcs1_padding) # Public key encryption
  9. sign = base64.b64encode(secret) # Ciphertext base64 encoding
  10. print(sign)

The error I am getting is:

  1. Traceback (most recent call last):
  2. File &quot;encrypt_rsa_public_key.py&quot;, line 13, in &lt;module&gt;
  3. pub_rsa = RSA.load_pub_key_bio(pub_bio) # Load public key
  4. File &quot;/Users/umeshpathak/env/py3env/lib/python3.7/site-packages/M2Crypto/RSA.py&quot;, line 444, in load_pub_key_bio
  5. rsa_error()
  6. File &quot;/Users/umeshpathak/env/py3env/lib/python3.7/site-packages/M2Crypto/RSA.py&quot;, line 333, in rsa_error
  7. raise RSAError(Err.get_error_message())
  8. M2Crypto.RSA.RSAError: no start line

How can I solve this?

答案1

得分: 1

  1. 你正在使用的库可能希望以PEM格式获取公钥,即位于 `-----BEGIN PUBLIC KEY-----` `-----END PUBLIC KEY-----` 之间。因此,您需要将您的 `pubkey` 更改为:

pubkey = '-----BEGIN PUBLIC KEY-----\n'
'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvBXTe278Lwg2MoI7iGKolSYuF+sNFKrsZplxCN9x0kItU3KIf8+1q60ILLwLewCEf7foxzpWp32j9YYU9vNBghuJ7BHcDYTffTRcv+QdNno491j701Hq7DIw13AGCQQTRcnfclvblnytIEWoQsiUvPJcdiWgqJIX3IQGA47a+uwIDAQAB'
'\n-----END PUBLIC KEY-----';

  1. 换行符很重要。
英文:

The library that you are using might expect to get the public key in PEM format i.e. enclosed between -----BEGIN PUBLIC KEY----- and -----END PUBLIC KEY-----. So you would have to change your pubkey to :

  1. pubkey = &#39;-----BEGIN PUBLIC KEY-----\n&#39; \
  2. &#39;MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvBXTe278Lwg2MoI7iGKolSYuF+sNFKrsZplxCN9x0kItU3KIf8+1q60ILLwLewCEf7foxzpWp32j9YYU9vNBghuJ7BHcDYTffTRcv+QdNno491j701Hq7DIw13AGCQQTRcnfclvblnytIEWoQsiUvPJcdiWgqJIX3IQGA47a+uwIDAQAB&#39; \
  3. &#39;\n-----END PUBLIC KEY-----&#39;

the line breaks are important.

huangapple
  • 本文由 发表于 2020年5月29日 23:14:51
  • 转载请务必保留本文链接:https://go.coder-hub.com/62089196.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定