我在.net中有以下代码:
RSACryptoServiceProvider cipher = new RSACryptoServiceProvider();
cipher.FromXmlString(publicKey);
byte[] data = Encoding.UTF8.GetBytes(input);
byte[] cipherText = cipher.Encrypt(data, false);
result = Convert.ToBase64String(cipherText);以及python中的代码:
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
from base64 import b64encode
key = open(public_key_loc, "r").read()
rsakey = RSA.importKey(key)
encrypted_data = rsakey.encrypt(input, 32)[0]
result = b64encode(encrypted_data)当我使用公钥运行这些代码时,我会在相同的输入上得到不同的答案!
我搜索并发现Crypto (python)和RSACryptoServiceProvider (.net)都在使用RSA算法。
编辑:-- .net中使用的公钥是通过从密钥中删除-----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----并将其转换为XML创建的。
示例:
PublicKey:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCETtzC9pZ+dnQ0z0pXL6pNrkn4vGdbLTf3fhH5
MsVYsFIPuuaUSC9EnbTa8G9p1AIKNsjQaBbzfkvgdu5Tz8qEXZfYQV2bnSCtl/87M7Xn0raAmGTr
jSliTdsxMyJHObzAPkamjHemAxHd9VkwXfZOPAh00ueag+buTAkbzL1MlQIDAQAB
-----END PUBLIC KEY-----输入:
"6000306".net输出: SpDXp/KCea8DlIuhow6k8+uyfGFe93r9+w39ROoSRAggF9dBU3boK5zRareOQo2//7LyMZZVVklvDCFPo/irJtgbxjn6c0C7gHrL7ubKRG7iVaa9iSF1u13gdRZvLGy/MKOxiz9G+FKLZfJYtkiOSLkJHXXMWTGSNedQsdraJZc=
Python输出: Q3H0NTJYZzymWhWDtMCSzcqZ0D/Nvumq3VqvFCvQRlib82pth48DbVcKwjrmSjT0F/ipi7mnSq8M7BLX/7wo4tQFqul9+avyI/eAW5LKbuFZiiD8eP0GMwEZZyHGurFKhxu+1Qa0dftCIeiIMVJsVaHcUD254BSkYQC04Fflvfc=
有什么问题吗?我是不是遗漏了什么?
发布于 2017-11-05 21:33:59
对于python代码,您忽略了使用您导入的PKCS1_v1_5模块。因此,您可以使用普通的RSA加密,而不需要填充。这不是你想要的。如果您的代码是:
key = open(public_key_loc, "r").read()
rsakey = RSA.importKey(key)
cipher = PKCS1_v1_5.new(rsakey)
encrypted_data = cipher.encrypt(input)
result = b64encode(encrypted_data)然后,您将看到密码每次都会发生变化,即使输入相同,就像C#端所做的那样。PKCS1版本1.5类型2填充包含一个随机组件,因此输出不应相同。
PKCS1_OAEP模块是更现代的选择,.NET支持它,只需将false更改为RSACryptoServiceProvider.Encrypt()方法中的true即可。
https://stackoverflow.com/questions/47123010
复制相似问题