2013-05-01 11 views
0

我花了整整一天的努力得到它的工作解密,但沒有運氣:(加密在C#中使用RSACryptoServiceProvide和使用openssl_private_decrypt在PHP

我在C#中使用這些代碼進行加密:

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 
RSAParameters rsaParam = rsa.ExportParameters(false); 
rsaParam.Modulus = Convert.FromBase64String("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwlhAsNcNCDRgzCc49u/0iSDrdJn7yoiH/HHipbQp0QSejzg/48mMA6wb32OPQ7qzBgJNvwiQbMvi89BvGNAJ9K8vM0RW7WOqtnb/8IK9BAJVtEwJ3vvKTf5EluiUgWVbGYpWPjbl/lsD3/hRTR0uF46h7q4OlARxOupl9xVS2wQIDAQAB"); 
rsa.ImportParameters(rsaParam); 
string msg = "This is a test."; 
byte[] encValue = rsa.Encrypt(Encoding.UTF8.GetBytes(msg), true); 
Console.WriteLine(Convert.ToBase64String(encValue)); 

這是PHP代碼,我用它來解密

// Read key 
$fp = fopen($KeyPath,"r"); 
$Key = fread($fp,8192); 
fclose($fp); 
openssl_private_decrypt($data, $decrypted, openssl_get_privatekey($Key, "123456")); 

私鑰我用(Passphase 「123456」)。

-----BEGIN RSA PRIVATE KEY----- 
Proc-Type: 4,ENCRYPTED 
DEK-Info: DES-EDE3-CBC,16B167A1F1E4E61E 

A0eOxhU9Fp4ZIkmSpCUOA2VGG8evE71bEz/eO5LlUatUTt4RQcu68mFOM23PdnHl 
YqjTV7AwedUu+LsNtjDfy+NJzvvi+re/kpYAD9RWDE0buHGp86vIhxJLCA633JSt 
kcMbkFBBbJPBW74FK7Djo2tlE/jKFb4Uy6EIBEsI56pcbdOIKWHTOLHb3/gG8spx 
/jPyylR1D1Rm1Nw9mhfQ8c+GZoXYn919Zx9fvKYq5CiH8hqy6q1TCsTjUpdgdkxz 
3kDQ6nn4cOCCwCwU2F+iRpzmSE0DORPtCK/rNdhHXaVqm/SvIDSerpX6L4l8NiRx 
Vb19htQChysfB7O/XiDVxL8gqSUmMrSujP50NUlyuBEG/32JyCounlX/4JQEGvAN 
ALGkLwULhp1D2ATQVck5aNncxcbuB56laf+KZm5E83Tbeu1j4MG+JzJq+kbLVuYi 
7TJ1JqjjL4Ixlyh/M23UuViFsw1V0zuZslFhvtq0/hdNXhIgNVmMFPFadOSKMtVY 
kTkX7+coEXrtwPV+4ztoH3M2+zwZczkNECbed9H0PPw6uhrOpu+EyGR4qJ/TsMe1 
Ht60veBMuPhwC5TqKP8Luz8x57d5Y4+kBFMvQda1b38PUuXSRw2OZ+cBHk0wrET/ 
pnyOIhg3lvREPvhXpe1oyaSZZLu95xTAj9YSDG+iKToDCD8hgdaRn1Pi6VOaz8Ru 
+AUjz0L0fbwrU7jZ3x2L1AGsdwVwmwTL8Fwk/WY8sWu3KCW4olW1nQ8o/4+jO7q9 
JvrYW/HxqIxP0Mnc9ODNmaG/NH1q5v7LIPAz47bpqXwdr8hDV/L5mA== 
-----END RSA PRIVATE KEY----- 

我對加密並不熟悉,有人可以告訴我如何讓它工作嗎? PS:我認爲在php中的代碼是好的,因爲我單獨測試代碼。

回答

0

我搜索了好幾天,終於想出自己:)
我以錯誤的方式加載參數。

根據RSA公鑰結構(PEM):

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwlhAsNcNCDRgzCc49u/0iSDrdJn7yoiH/HHipbQp0QSejzg/48mMA6wb32OPQ7qzBgJNvwiQbMvi89BvGNAJ9K8vM0RW7WOqtnb/8IK9BAJVtEwJ3vvKTf5EluiUgWVbGYpWPjbl/lsD3/hRTR0uF46h7q4OlARxOupl9xVS2wQIDAQAB

其中我的字符串分割成3份(base64編碼):

部首

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC

模量:

wlhAsNcNCDRgzCc49u/0iSDrdJn7yoiH/HHipbQp0QSejzg/48mMA6wb32OPQ7qzBgJNvwiQbMvi89BvGNAJ9K8vM0RW7WOqtnb/8IK9BAJVtEwJ3vvKTf5EluiUgWVbGYpWPjbl/lsD3/hRTR0uF46h7q4OlARxOupl9xVS2wQ

指數:

IDAQAB

(請注意,我還沒有得到RSA密鑰strutures一個清晰的思路。上面是一個關鍵的結構,只是一個模糊的觀點,但對於那些誰感興趣,我建議你閱讀API Documentation "RSAParameters"RSA specification

顯然我在做什麼,對整個密鑰字符串導入到RSAParameters.Modulus 。這不是導入密鑰的方式。所以這就是爲什麼它不起作用。

執行此操作的方法是從密鑰文件中提取公用加密所需的modulusexponent。並導入到RSAParameters

RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); 
RSAParameters RSAKeyInfo = new RSAParameters(); 
RSAKeyInfo.Modulus = modulus; 
RSAKeyInfo.Exponent = exponent; 
RSA.ImportParameters(RSAKeyInfo); 

然後加密字符串:

RSA.Encrypt("HAHA I GOT IT!!", false); 

提取的方式。我建議去JavaScience瞭解更多信息。那裏有一堆cryptographic utilities

0

您可以使用此代碼來加密您的字符串。

public string EncodeData(string sData) 
{ 
    try { 
     byte[] encData_byte = new byte[sData.Length]; 
     encData_byte = System.Text.Encoding.UTF8.GetBytes(sData); 
     string encodedData = Convert.ToBase64String(encData_byte); 
     return encodedData; 
    } catch (Exception ex) { 
     throw new Exception("Error in base64Encode" + ex.Message); 
    } 
} 

爲了解密你的字符串,你可以使用這段代碼。

public string DecodeData(string sData) 
{ 
    System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding(); 
    System.Text.Decoder utf8Decode = encoder.GetDecoder(); 
    byte[] todecode_byte = Convert.FromBase64String(sData); 
    int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length); 
    char[] decoded_char = new char[charCount]; 
    utf8Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0); 
    string result = new String(decoded_char); 
    return result; 
} 

試試這個會有用。

謝謝。

+0

不,這不是我想要的。我需要使用密鑰對來加密傳輸的數據。 – user1510539 2013-05-01 14:38:22

0

您確定RSACryptoProvider正在使用您提供的格式的密鑰嗎?

我見過很多RSACryptoProvider的例子都使用基於XML的私鑰。例如。

RSA Signing with PHP and verifying with C#

"<RSAKeyValue><Modulus>3BqiIB3ouyXHDMpW43TlZrx8fkts2FVVARJKNXFRQ/WIlsthDzL2jY2KEJVN6BKE4A51X+8LMzAI+2z3vIgAQT3bRSfOwygpGBjdhhnXJwFlQ6Gf/+z0ffQfVx/DHw3+QWphcwGDBst+KIA6u6ayy+RDE+jEityyyWDiWqkR9J8=</Modulus><Exponent>AQAB</Exponent><P>8a8nuVhIANh7J2TLn4wWTXhZY1tvlyFKaslOeAOVr+wgEWLQpLZ0Jpjm8aUyyOYPXlk7xrA5BOebtz41diu4RQ==</P><Q>6SQ9y3sEMjrf/c4bHGVlhOj4LUVykradWWUNC0ya7llnR8y1djJ1uUut+EoAa1JQCGukuv4K8NvN1Ieo72Fhkw==</Q><DP>cg0VMusNN5DxNRrk2IrUL4TesfuBQpGMO6554DrY1acZTvsRuNj9IQXA3kH2IEYo9H4prk6U6dKeci/iLLze/Q==</DP><DQ>m/pZNXeZ+RkWnrFzxe24m9FZqMAbxThT0Wkf7v1Tcj9yL8EvbmKYDF4riD/KRAMP9HJABbLNExObg6M3TOAz7Q==</DQ><InverseQ>w8PvW8srrPCuOcphBKXSyoZxCZn81+rovBxuE8AB95m5X+URE8SunK7f+g7hBBin6nUOaVGohBP8jzkQEsdx1Q==</InverseQ> <D>AsVPDypxOJHkLJQLffeFv8JVqt1WNG72j/nj90JC7KEVpBhRU3inw+ZpO4Y1odtB0vQ7pAaFVJKhOlEH2Va48hNUEQujML8rE+LZXgI3lu0TlqOCIqTHIljeJry0ca30XFtFDp9kh0Kr/0CgGMqgIed+hDUjAad8ke9D2YicDok=</D></RSAKeyValue>" 
+0

是的,上面的代碼已成功加密數據,但不知何故,我只是不能解密它在PHP中。我認爲這可能是某種相反的事情。但是我嘗試了扭轉數組的每一個組合。不起作用。 – user1510539 2013-05-01 14:58:37

相關問題