CodeProject でしばらくの間、RSA プロバイダーを使用して暗号化および復号化する方法を説明する記事を読みました。
2009 年の古いバージョンにはバグがありましたが、新しい 2012 バージョン (System.Numerics.BigInteger をサポート) はより信頼性が高いようです。ただし、このバージョンに欠けているのは、公開鍵で暗号化し、秘密鍵を使用して復号化する方法です。
というわけで、自分でやってみたのですが、復号化するとゴミが出てしまいます。私は RSA プロバイダーに詳しくないので、ここではわかりません。これがどのように機能するかについての詳細情報を見つけるのは困難です。
誰かがこれの何が悪いのか分かりますか? 以下は、PUBLIC キーを使用した暗号化です。
// Add 4 byte padding to the data, and convert to BigInteger struct
BigInteger numData = GetBig( AddPadding( data ) );
RSAParameters rsaParams = rsa.ExportParameters( false );
//BigInteger D = GetBig( rsaParams.D ); //only for private key
BigInteger Exponent = GetBig( rsaParams.Exponent );
BigInteger Modulus = GetBig( rsaParams.Modulus );
BigInteger encData = BigInteger.ModPow( numData, Exponent, Modulus );
return encData.ToByteArray();
これを行う場合、プロバイダーの大文字の「D」を使用する必要がありますか? 「D」を持たない公開鍵なので、おそらくそうではありません。
次に、対応する(プライベートキーを使用した復号化):
BigInteger numEncData = new BigInteger( cipherData );
RSAParameters rsaParams = rsa.ExportParameters( true );
BigInteger D = GetBig( rsaParams.D );
//BigInteger Exponent = GetBig( rsaParams.Exponent );
BigInteger Modulus = GetBig( rsaParams.Modulus );
BigInteger decData = BigInteger.ModPow( numEncData, D, Modulus );
byte[] data = decData.ToByteArray();
byte[] result = new byte[ data.Length - 1 ];
Array.Copy( data, result, result.Length );
result = RemovePadding( result );
Array.Reverse( result );
return result;
ここで「D」または指数が必要ですか?
明らかに、プライベート、パブリック、パブリック、プライベートの両方の方法で機能する暗号が必要です。どんな助けでも大歓迎です!