7

秘密鍵と公開鍵の両方を持つmakecertによって生成された証明書を使用しています。Java側はこの公開鍵を使用してデータを暗号化し、.netはそれを復号化して戻します。

Javaの暗号化された64ビットエンコードされた文字列を復号化しようとしていますが、不正なデータを取得しています。

すべてがon.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); 

ここでもエラーが発生します。私は何かが足りませんか?

証明書は公開鍵と秘密鍵の両方で有効に見えます。

4

4 に答える 4

5

自己署名証明書でも同じ問題がありました。問題は、-sky signature代わりにスイッチを使用して証明書を生成していたことです-sky exchange(署名には署名を使用し、暗号化/復号化には交換を使用します)。

これが機能するmakecertへの私の完全なコマンドです:

makecert -r -pe -a sha1 -n "CN=MyName" -ss my -sr CurrentUser -sky exchange
于 2010-10-04T17:34:16.720 に答える
4

次のコードは私にとってはうまくいきます:

        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 からのものであることを再確認できますか?

于 2009-10-26T13:11:48.107 に答える
2

c# を使用して x509 証明書と rsa を使用した makcert の使用例を見つけようとしていたときに、このページに出くわしましたが、残念ながらソリューションの一部しか提供していませんでした。人々が興味を持つかもしれないブログ エントリにすべての情報をまとめました 。 html

于 2011-05-16T23:30:02.003 に答える
1

私はついに問題を見つけました。キーを RSA 暗号キーとして定義するために makecert にキーを入れていませんでした。

于 2009-10-28T07:24:01.617 に答える