【发布时间】:2011-07-04 06:11:24
【问题描述】:
我正在尝试使用 C# 中的 RSA 算法加密一条短消息,并使用 python 脚本解密该消息。
我想在 C# 端使用 .NET 类,在 python 端使用 pycrypto。我已经管理双方使用相同的密钥(这甚至不是微不足道的,因为 .NET 不直接支持标准 PEM/DER 格式)。加密/解密在双方独立工作。
我在 C# 端使用 PKCS#1 填充(将 RSACryptoServiceProvider.Encrypt 的 fOAEP 参数设置为 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)
对于密钥传输,我使用RSACryptoServiceProvider 的ToXmlString() 方法。生成的 XML 在 python 中解析,pycrypto-RSA 对象被初始化为
r = Crypto.PublicKey.RSA.construct((modulus, exponent, d, p, q))
其中modulus、exponent、d、p 和q 是 .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