如何在 Python 中实现类似 C# RSACryptoServiceProvider 的加密?

Posted

技术标签:

【中文标题】如何在 Python 中实现类似 C# RSACryptoServiceProvider 的加密?【英文标题】:How to achieve C# RSACryptoServiceProvider-like encryption in Python? 【发布时间】:2013-08-06 16:49:02 【问题描述】:

所以,在 C# 中我有以下代码:

public static void Main (string[] args)

    publicKeyXml = "<Modulus>mFCubVhPGG+euHuVQbNObqod/Ji0kRe+oh2OCFR7aV09xYiOklqFQ8jgIgAHvyCcM1JowqfFeJ5jV9up0Lh0eIiv3FPRu14aQS35kMdBLMebSW2DNBkfVsOF3l498WWQS9/THIqIaxbqwRDUxba5btBLTN0/A2y6WWiXl05Xu1c=</Modulus><Exponent>AQAB</Exponent>";
    RSACryptoServiceProvider rSACryptoServiceProvider = new RSACryptoServiceProvider ();
    rSACryptoServiceProvider.FromXmlString (publicKeyXml);
    Console.WriteLine(Convert.ToBase64String (rSACryptoServiceProvider.Encrypt (Encoding.ASCII.GetBytes(args[0]), false)));

当我用来加密消息时,它在远程服务器上工作得很好(我没有源代码)。但是,当尝试在 Python 中使用 PyCrypto 做类似的事情时,远程服务器无法解密。

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5

KEY = RSA.importKey(open('login.key').read()) # Converted to standard format
KEY_CIPHER = PKCS1_v1_5.new(KEY)

testmsg = KEY_CIPHER.encrypt("test msg").encode('base64').replace('\n', '')
# send testmsg down a socket
# Response: "info":"java.lang.IllegalArgumentException: Could not decrypt.","msg":"Fail"

对于为什么会出现这种情况有什么想法吗?

【问题讨论】:

login.key 有哪些格式? 乍一看,签名方案看起来相同...密钥的格式(可能还有值)可能不同。 我尝试了两种不同的方法,在这种情况下。第一,我找到了一个使用 BouncyCastle 将 XML Pubkey 转换为 XML 的工具。另一个解决方案是我将 PyCrypto 的构造与 q 和 e 一起使用。这些都不起作用。 经过进一步调查,我偶然发现***.com/questions/3260319/… 说明了为什么我的解决方案不起作用的差异。然而,这只是签名,而不是加密,但可能会导致同样的不兼容? 呃,在第一条评论中,我的意思是“对 PEM”。现在编辑它为时已晚。 你从服务器得到什么信息? 【参考方案1】:

好的,就我而言,这很奇怪。服务器端期待我的东西向后。为了解决,我只是这样做了:

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5

KEY = RSA.importKey(open('login.key').read()) # Converted to standard format
KEY_CIPHER = PKCS1_v1_5.new(KEY)

testmsg = KEY_CIPHER.encrypt("test msg").encode('base64').replace('\n', '')
testmsg = "".join(reversed([testmsg[i:i+2] for i in range(0, len(testmsg), 2)]))

【讨论】:

【参考方案2】:
Modulus = "mFCubVhPGG+euHuVQbNObqod/Ji0kRe+oh2OCFR7aV09xYiOklqFQ8jgIgAHvyCcM1JowqfFeJ5jV9up0Lh0eIiv3FPRu14aQS35kMdBLMebSW2DNBkfVsOF3l498WWQS9/THIqIaxbqwRDUxba5btBLTN0/A2y6WWiXl05Xu1c="
Exponent = "AQAB"

mod_raw = b64decode(Modulus)
exp_raw = b64decode(Exponent)
mod = int(mod_raw.encode('hex'), 16)
exp = int(exp_raw.encode('hex'), 16)
seq = asn1.DerSequence()
seq.append(mod)
seq.append(exp)
der = seq.encode()
keyPub = RSA.importKey(der)
print base64.b64encode(keyPub.encrypt('test msg', 0)[0])

【讨论】:

以上是关于如何在 Python 中实现类似 C# RSACryptoServiceProvider 的加密?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中实现 3 层架构

如何使用 c# 在 paypal 中实现 DoDirectPayment

在 Python 中实现类似列表的索引访问

如何在Python中实现EXCEL的查找功能

如何在 C# 中实现 sdbm 哈希函数?

如何在 C# 中实现 ORM