2013-08-06 40 views
1

所以,在C#我有以下代碼:如何在Python中實現C#RSACryptoServiceProvider-like加密?

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))); 
} 

,當我用它來加密信息,它的工作原理遠程服務器(而我有沒有源代碼)就好了。但是,當試圖用PyCrypto在Python中做類似的事情時,遠程服務器不能解密。

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"} 

有關爲什麼會出現這種情況的任何想法?

+0

什麼樣的格式呢login.key有哪些?乍一看,簽名方案看起來完全相同* ...密鑰的格式(以及可能的值)可能不同。 –

+0

在這種情況下,我嘗試了兩種不同的方法。其一,我發現了一個使用BouncyCastle將XML Pubkey轉換爲XML的工具。另一個解決方案是我用q和e使用PyCrypto的構造。這些都沒有奏效。 – user2657699

+0

經過進一步調查,我偶然發現了http://stackoverflow.com/questions/3260319/interoperability-between-rsacryptoserviceprovider-and-openssl,指出我的解決方案爲什麼不起作用的差異。然而,這只是簽名,而不是加密,但也許會導致相同的不兼容性? – user2657699

回答

0

好的,對我來說這很奇怪。服務器端期待我的東西倒退。要解決,我只是這樣做:

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)])) 
0
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])