x509証明書を使用したrsacryptoserviceprovider c#
-
06-07-2019 - |
質問
iは、秘密鍵と公開鍵の両方を持つmakecertによって生成された証明書を使用しています。 Java側はこの公開鍵を使用してデータを暗号化し、.netはそれを復号化します。
Javaの暗号化された64ビットでエンコードされた文字列を復号化しようとして、不正なデータを取得しています。
すべてが正常かどうかを確認するために、私は最初に公開鍵で暗号化してから、同じ証明書を使用して秘密鍵で復号化しようとしました。私のコードは次のようになります。
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);
ここでもエラーが発生します。何か不足していますか?
証明書は公開鍵と秘密鍵の両方で有効に見えます。
解決 4
ようやく問題が見つかりました。キーをmakecertに入れてRSA Cryptoキーとして定義していませんでした。
他のヒント
自己署名証明書にも同じ問題がありました。問題は、 -sky exchange
ではなく、 -sky signature
スイッチで証明書を生成していたことです(署名に署名を使用し、暗号化/復号化のために交換します)
機能する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からのものであることを再確認できますか?
c#を使用してx509証明書とrsaでmakcertの使用例を見つけようとしていたときにこのページを偶然見つけましたが、残念ながらソリューションの一部しか提供していませんでした。人々が興味を持っているかもしれないブログエントリにすべてのビットをまとめました。それはここにあります: http://nick-howard.blogspot.com /2011/05/makecert-x509-certificates-and-rsa.html