Dot-Net
rsacryptoserviceprovider 使用 x509 證書 c#
我正在使用由 makecert 生成的具有私鑰和公鑰的證書。java 端使用此公鑰加密數據,.net 將其解密回來。
我正在嘗試解密 Java 的加密 64 位編碼字元串並獲取錯誤數據。
為了查看.Net 端是否一切正常,我首先嘗試使用公鑰加密,然後使用相同的證書使用私鑰解密。我的程式碼看起來像這樣。
X509Certificate2 cert = GetCert(key, StoreName.My, StoreLocation.LocalMachine); RSACryptoServiceProvider provider = (RSACryptoServiceProvider)cert.PrivateKey; RSACryptoServiceProvider publicprovider = (RSACryptoServiceProvider)cert.PublicKey.Key; if (cert.HasPrivateKey) MessageBox.Show("Got private key"); byte[] encrypted = publicprovider.Encrypt(Encoding.UTF8.GetBytes(text), false); byte[] decryptedBytes = provider.Decrypt(encrypted, false);即使在這裡我也得到了錯誤。我錯過了什麼嗎?
證書看起來對公鑰和私鑰都有效。
我在使用自簽名證書時遇到了同樣的問題,問題是我使用開關生成證書
-sky signature而不是-sky exchange(您使用簽名進行簽名並交換加密/解密)這是我對 makecert 有效的完整命令:
makecert -r -pe -a sha1 -n "CN=MyName" -ss my -sr CurrentUser -sky exchange
以下程式碼對我來說很好:
RSACryptoServiceProvider privateKey = new RSACryptoServiceProvider(); privateKey.FromXmlString("<RSAKeyValue><Modulus>wL8s+C8SnnlaaqR+VsyijmxOJOARNa4o7ZNsqfy3+9J9Ol2JNSjjMfQWoUnFtClzJBlZhU5KtuazQe8ZKXTX9YvKoJdRhlsonZkC04qiTMdO/FZIH00GrCRxeQ7XDnQnvPB9Bdsvs//7zrY3f7eLIkpIyK9cQHU+5jjJd5IT0eE=</Modulus><Exponent>AQAB</Exponent><P>83xxN7jvpg5z16pxz2tIQIdqd/EfmikR9Q2TjG2tosWkUSvtyx0xHZ9EqdTUbSGZZ+jgrabzkafYc7Mplylwew==</P><Q>yqcnYSZEXHwJvRWi2V09PNEENTozQZywcFptUUGar9TciaQvoNv3lpnfzUKNBRdhzq4lImxkamajZlTWE5buUw==</Q><DP>37HqilkbwyHwB6mOGhPkM3S1ujAK6qTk3JB2iEOTjMGrru9+7maJYz+Z47Wm3ARMXgyzrpZ9m8nqsJFfmoL11Q==</DP><DQ>v285tv8kMs2FkZYfuP/oOkwkkneBNejjj68Md2bmzlThZDCyQV2pvB1tmgPVHUsiPNCrCaKlFRISJzfa5rR8Ow==</DQ><InverseQ>fgJE2TRe/SS+YqW0/I+FtHrdfbbao0/R3pHD4r4oceZQUemlBgZ7DxOAetebHKthlOdjGkmfWYB8EU4XoWggqw==</InverseQ><D>FMLCwjy3wbAKiCANp6XFAJgz1o7365NFv0k41BpvasViTa4TgFFWH2ROJ7M9g0lPqJy+YrhrHcY9mqV5TVjTheQp0JeckrgO2B39XngPMAMMdne3rWGpf0Pfbj3FLfchMk6XYDXSZzCS2CmSeRA4aBMb+4R3YurixyJLrnGRMH0=</D></RSAKeyValue>"); RSACryptoServiceProvider publicKey = new RSACryptoServiceProvider(); publicKey.FromXmlString("<RSAKeyValue><Modulus>wL8s+C8SnnlaaqR+VsyijmxOJOARNa4o7ZNsqfy3+9J9Ol2JNSjjMfQWoUnFtClzJBlZhU5KtuazQe8ZKXTX9YvKoJdRhlsonZkC04qiTMdO/FZIH00GrCRxeQ7XDnQnvPB9Bdsvs//7zrY3f7eLIkpIyK9cQHU+5jjJd5IT0eE=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"); { string text = "foo"; byte[] encrypted = publicKey.Encrypt(Encoding.UTF8.GetBytes(text), false); byte[] decryptedBytes = privateKey.Decrypt(encrypted, false); }您能否仔細檢查導出的私鑰是否來自 cert.PrivateKey 和公鑰是否來自 cert.PublicKey.Key?