python和.net上使用单个公钥加密的不同答案

2024-09-19 23:30:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我在.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中的代码:

^{pr2}$

当我用公钥运行这些代码时,我在同一个输入上得到不同的答案!在

我搜索并发现Crypto (python)和{}都在使用RSA算法。在

编辑:.net中使用的公钥是通过从密钥中删除-----BEGIN PUBLIC KEY-----和{}并将其转换为XML来创建的。在

示例:

公钥:

^{3}$

输入:

"6000306"

.net输出:SpDXp/KCea8DlIuhow6k8+uyfGFe93r9+w39ROoSRAggF9dBU3boK5zRareOQo2//7LyMZZVVklvDCFPo/irJtgbxjn6c0C7gHrL7ubKRG7iVaa9iSF1u13gdRZvLGy/MKOxiz9G+FKLZfJYtkiOSLkJHXXMWTGSNedQsdraJZc=

Python输出:Q3H0NTJYZzymWhWDtMCSzcqZ0D/Nvumq3VqvFCvQRlib82pth48DbVcKwjrmSjT0F/ipi7mnSq8M7BLX/7wo4tQFqul9+avyI/eAW5LKbuFZiiD8eP0GMwEZZyHGurFKhxu+1Qa0dftCIeiIMVJsVaHcUD254BSkYQC04Fflvfc=

有什么问题吗?我错过什么了吗?在


Tags: 代码newinputdatanetbyteutf8encoding
1条回答
网友
1楼 · 发布于 2024-09-19 23:30:13

对于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\uOAEP模块是更现代的选择,并且只需在RSACryptoServiceProvider.Encrypt()方法中将false更改为{},就可以得到.NET的支持。在

相关问题 更多 >