首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用单个公钥加密python和.net的不同答案

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

Stack Overflow用户
提问于 2017-11-05 15:00:54
回答 1查看 354关注 0票数 2

我在.net中有以下代码:

代码语言:javascript
运行
复制
RSACryptoServiceProvider cipher = new RSACryptoServiceProvider();
cipher.FromXmlString(publicKey);
byte[] data = Encoding.UTF8.GetBytes(input);
byte[] cipherText = cipher.Encrypt(data, false);
result = Convert.ToBase64String(cipherText);

以及python中的代码:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCETtzC9pZ+dnQ0z0pXL6pNrkn4vGdbLTf3fhH5
MsVYsFIPuuaUSC9EnbTa8G9p1AIKNsjQaBbzfkvgdu5Tz8qEXZfYQV2bnSCtl/87M7Xn0raAmGTr
jSliTdsxMyJHObzAPkamjHemAxHd9VkwXfZOPAh00ueag+buTAkbzL1MlQIDAQAB
-----END PUBLIC KEY-----

输入:

代码语言:javascript
运行
复制
"6000306"

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

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

有什么问题吗?我是不是遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-05 21:33:59

对于python代码,您忽略了使用您导入的PKCS1_v1_5模块。因此,您可以使用普通的RSA加密,而不需要填充。这不是你想要的。如果您的代码是:

代码语言:javascript
运行
复制
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即可。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47123010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档