2017-04-03 44 views
2
RSACryptoServiceProvider objRsaCrypto= new RSACryptoServiceProvider(); 
string xmlString = "<RSAKeyValue><Modulus>vafMwhQ1Z+zx1tpcUybDONf3M7IG8Xw6Q0eCsuWMRniqwUklnzndo9ExuAFC87oAywOcSSzSncLEgILxjiyNmnBe28whdDg+P1PJmDchmBIjzQKNpDIppOiaxGOUR8KqBwIMp24dZQtUqb9mElEEz5bOxZUwHLg2/fJ9bT+eE+VluHtYfuuS/nbhrvI6BHN2bm2CyITBAvT6loCm7mV/JZ0fT9nCsyn6rUsp+YCVbhrfMnyz9aW7NEkwncE7xz78LSIHaYgB19nPu5jkR6yUCLsNDV9wnOBjb1Xuh7NqTjt2yOAcH+Gt5ixukfKBROq67FlnQKZOa+mQNzkhytEeyw==</Modulus><Exponent>AQAB</Exponent><P>4tDAYRgWNcyB5dCN7kF8QUa4ddiw6siEblGnjcFpdrQLyJxFvCZ7Jlc/59Wmr8B/1G06coRla5NLBCtvh/Itovacfp00wNif5pBb/Tp9+quw5/GGSu/4/K/Ke0wQuhHdWNjzAriNxbpCRWD/EgzNngWS8KlufdymZyju6AWyEZk=</P><Q>1g8B7fQ3SMDZ2EyaiSscchj3lshJx9VR8EAN70aipu45LRsOWuHH7wTkfqp1LuB06LyCr7XLMwUQYrBM8mJOhtxsiissXe+Phw1kcXJo6hBrCPgfSKSkuHT8iR7OgZbzYA8zwMmr+m2WOuDsgxrQcb+hRVdC1QODqFb8C08YegM=</Q><DP>vW5Zbf4e9pmx142CLH3219HH12y9/aiwqi56QPNLML+Yo9iYiVaePdxa3DZdO6YLXRBI40HeLqVa3sWkJadHJDbRZxHG8FU73uWsXmcOtl/UpTLb1RRtICV1d9qEkdK/yiePdjNK/Nvd43HqNloJFLRVD7iCNo4lUD0ooxG2sek=</DP><DQ>BCeWaf/rcsYLdF9IQJFNpAlIBO0uQWqqhHc5zgMY9RR6l52G0czADKuTo8G7NIW2vy2pe6+TmhHnF4NEew/dZlCw6p2b5tbXek+QO4N09dYLvcjTEp3fdJUQsbifWXSMlLi20G8Zn2qxF8N107WZhhuqDaZ77ZZ737CQg8etOfE=</DQ><InverseQ>xEjq9mm61gofysxxgM6SnX5TQ5Lnpq0AvnsRBhQaatiGm8i+VnznMpk8zJgn/AspaYS62bFC/UdCd/b2VyXgZfBC/L1NdkIUNyOVAxNKhf95C4uQFFxe90RfuZjbbClFbm/tU7RmycHqciPXViI35tToF1CXMJsxd7q6M2iaXKc=</InverseQ><D>HVnfO/gBreRDJzOjDzFUDDOMK+F05qGJqMjj5sjUtUFOd9xYqLQ9Y3FoJuh3Ep4qKkEUSlTYAZdXbuYU+SJXBdw3KgAE+2YK6CUQ8XAy0ESaastm3U7wF/fxn8wjchmj07LS/4RwoycmQqD+7H3CZ1gZBwYILKGrzRBere4nCj/1i5LTbfweAMUo85KMfZDbGChlJUhd4vNiRPGmOeKCT1/xDAw/3ZKfUbhUjzBxg/1PThhLtv2wYEdkLpUq1RZmlJACtDD++fkt9x19UecfMpX7NmI43WLoc1x7ydtinrIO0b0NhFStXAPEQXlYyE4JvOSqIxJIbb/E7Vl5okVxOQ==</D></RSAKeyValue>";//my private key 
    objRsaCrypto.FromXmlString(xmlString); 
string cyphertextyear ="mell442PqhwZRDvAVawKhtspVWFsVG6x/6v7BzcaDvOFWImXOiq3hCZq6N0i7UpCkV8YVLLS/LTarWrSgrqskfQnIwA+inZIhfZLm3odUrYpBCMXJh9Y7s+6ugqiwpMu1xap9LBqhP7LdChwIV0c7GimgZKVVk7mZHBgmVOHRSx61RAx6HDkc0F7dfjBR+jUQR08knu4MUUNx7xQ6pSkg1MyTwrX4upMoodccBwni+cUFZWmIeEHazMMd2r6PkuwMvHkueFm0B4UsWnsqHtjgQuU5zmGx9rWpDIyDCKNTvWkTyB1lUrhpNk6qqeFZXVPPTsxfKcA0Pp2oz6ZF4ir";//my cypher text 

byte[] bytesCypherText = Convert.FromBase64String(cyphertextyear); 
byte[] bytesPlainTextData = objRsaCrypto.Decrypt(bytesCypherText, false); 
    string strDecryptedVal = Encoding.ASCII.GetString(bytesPlainTextData); 

我使用的RSACryptoServiceProvider解密在Windows 8工作正常,但失敗在windows server 2012 r2中有以下異常RSA解密與2048位的密鑰是Windows服務器上給人的長度340的加密文本壞數據2012 R2,而它在Windows工作正常8

System.Security.Cryptography.CryptographicException:Bad Data。

在 System.Security.Cryptography.CryptographicException.ThrowCryptographicException(的Int32 小時)在 System.Security.Cryptography.RSACryptoServiceProvider.DecryptKey(SafeKeyHandle pKeyContext,字節[] pbEncryptedKey,的Int32 cbEncryptedKey,布爾 fOAEP,ObjectHandleOnStack ohRetDecryptedKey )
在System.Security.Cryptography.RSACryptoServiceProvider.Decrypt(字節[] RGB,布爾fOAEP)在

+0

@ArtjomB感謝響應。我已經包含了私鑰和密文。 – user3459002

+0

http://stackoverflow.com/questions/1496793/rsa-encryption-getting-bad-length –

+0

@WazeAndroid數據不長.. – user3459002

回答

1

你的密文太短。

bytesCypherText的長度爲255,但您的2048位密鑰產生256字節的響應。

似乎以前版本的Windows接受太短,並有效地將值前綴爲額外的零字節,並且他們停止這樣做。 (最有可能原來的CAPI提供商有接受「太短」的行爲,但它們已經被調用到驅動CNG的相同後端的呼叫所替代;並且它可能只接受正確大小的數據)。

如果您的密文base64分別是

AJnpZeONj6ocGUQ7wFWsCobbKVVhbFRusf+r+wc3Gg7zhViJlzoqt4QmaujdIu1KQpFfGFSy0vy02q1q 
0oK6rJH0JyMAPop2SIX2S5t6HVK2KQQjFyYfWO7PuroKosKTLtcWqfSwaoT+y3QocCFdHOxopoGSlVZO 
5mRwYJlTh0UsetUQMehw5HNBe3X4wUfo1EEdPJJ7uDFFDce8UOqUpINTMk8K1+LqTKKHXHAcJ4vnFBWV 
piHhB2szDHdq+j5LsDLx5LnhZtAeFLFp7Kh7Y4ELlOc5hsfa1qQyMgwijU71pE8gdZVK4aTZOqqnhWV1 
Tz07MXynAND6dqM+mReIqw== 

你可能會有更好的運氣。

或者:

if (bytesCypherText.Length * 8 < objRsaCrypto.KeySize) 
{ 
    byte[] tmp = new byte[objRsaCrypto.KeySize/8]; 
    Buffer.BlockCopy(
     bytesCypherText, 
     0, 
     tmp, 
     tmp.Length - bytesCypherText.Length, 
     bytesCypherText.Length); 

    bytesCypherText = tmp; 
} 

byte[] bytesPlainTextData = objRsaCrypto.Decrypt(bytesCypherText, false); 
相關問題