【问题标题】:RSA encryption in .NET, decryption in python.NET 中的 RSA 加密,python 中的解密
【发布时间】:2011-07-04 06:11:24
【问题描述】:

我正在尝试使用 C# 中的 RSA 算法加密一条短消息,并使用 python 脚本解密该消息。

我想在 C# 端使用 .NET 类,在 python 端使用 pycrypto。我已经管理双方使用相同的密钥(这甚至不是微不足道的,因为 .NET 不直接支持标准 PEM/DER 格式)。加密/解密在双方独立工作。

我在 C# 端使用 PKCS#1 填充(将 RSACryptoServiceProvider.EncryptfOAEP 参数设置为 false),所以我希望在 python 中解密块后我应该看到某种明文(即我的“消息”连同填充字节)

但我看到的都是垃圾:(。

是否有任何我不知道的警告/陷阱?我有点没有想法......

谢谢 马丁

示例代码

C# / 加密

Console.Write("Input string:");
var s = Console.ReadLine();
var b = Encoding.Default.GetBytes(s);
var encrypted = rsa.Encrypt(b, false);
using (var file = new FileStream(filename, FileMode.Create)) {
  file.Write(encrypted, 0, encrypted.Length);
  file.Flush();
  file.Close();
}

Python / 解密

f = open(filename, "rb")
msg = f.read()
f.close()
decrypted = rsa.decrypt(msg)
print "Decrypted message:"
print_hex(decrypted)

对于密钥传输,我使用RSACryptoServiceProviderToXmlString() 方法。生成的 XML 在 python 中解析,pycrypto-RSA 对象被初始化为

r = Crypto.PublicKey.RSA.construct((modulus, exponent, d, p, q))

其中modulusexponentdpq 是 .NET-RSAParameters 结构的各自字段。 (正如我所提到的,我可以在 python 中使用此密钥加密/解密消息,p*q 也产生modulus,所以我认为密钥导入工作正常......)

【问题讨论】:

  • 我在 Java 和 C# 之间有同样的问题。主要问题是两种语言的编码不同,所以 string.getbytes 必须使用相同的编码处理!
  • 目前,我只使用 ASCII 字符。在C#中,我验证了输入byte[]参数为encrypt(),没问题。 Python 使用 8 位字符串(至少在 2.7 版中),我正在查看字节级别的结果,所以我认为这不是编码问题。还是谢谢!
  • 你能发布一些你的加密/解密代码的sn-ps吗?
  • @Jcs 当然,我发布了相关部分...
  • 您没有发布设置密钥的代码部分,即 C# 和 Python 代码中的 rsa 对象。 (这是一个老问题,但我是通过谷歌搜索找到的。没有这部分代码,这个问题对其他人来说没有那么有用。)

标签: .net python rsa public-key-encryption pycrypto


【解决方案1】:

好的,这是我的错,我只是没有查看结果:前导零(来自 PKCS#1 填充)不是 python 结果字符串的一部分,看起来(以十六进制表示)如下:

02 a2 16 4e 51 45 aa 8d 
94 b0 de 64 4d 4c 4c bd 
0b 01 b8 d2 de dc ed 23 
0b 25 c2 11 6c 0a 0b 1f 
4f 19 d0 33 18 db e0 81 
25 33 f6 e3 70 8d 97 d2 
c7 ef 32 ef 27 3c c0 ac 
47 68 c0 5b 7b 6d 0d ba 
44 da cb bf e8 71 75 d3 
2f 9a b1 97 6b 70 4f ff 
98 6f 5a 9a 74 3c 65 94 
eb 57 52 8a 2f 73 1f 14 
7d 76 08 d3 e5 8b 82 b8 
5d ed 2b 75 52 29 b5 22 
af 76 55 bc 5d e9 41 99 
00 4d 61 72 74 69 6e 

所以,开头的02 指向随机填充(不知何故,我期待 0xff 填充...)。最后 6 个字节(在零之后)正是我所期待的“消息”,但普通的 print 并没有因为零字节而显示它们......

【讨论】:

  • Python 可以删除任何前导的“00”,因为“02”的最高有效位是 0,因此不需要“00”来表示数字的符号。假设 PKCS#1(PKCS#1 v1.5 的第 8.1 节),您的填充似乎是正确的: 02 -> 公钥操作 a2--99 -> 非零随机数据 4d 61 72 74 69 6e -> “Martin”的 ASCII 编码" :)
猜你喜欢
  • 2011-08-19
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 2014-06-02
  • 2011-02-06
  • 1970-01-01
相关资源
最近更新 更多