2016-05-24 18 views
3

エンコードする文字列と公開鍵をPKCS#1形式のbase64エンコード文字列として受け取ってエンコードされた文字列を返す関数を作成しようとしています。C#RSA指定されたPKCS#1公開鍵を使用してテキストを暗号化する

public static string EncryptRsa(string stringPublicKey, string stringDataToEncrypt) 
{ 
    byte[] publicKey = Convert.FromBase64String(stringPublicKey); 

    // Code to create an RSACryptoServiceProvider with the public key 
    // var rsa = new RSACryptoServiceProvider(??) 

    byte[] dataToEncrypt = Encoding.UTF8.GetBytes(stringDataToEncrypt); 
    var encryptedData = rsa.Encrypt(dataToEncrypt, true); 
    return Convert.ToBase64String(encryptedData); 
} 

私は、特に(RSAアルゴリズムを使用して暗号化する方法について、過去数日間にわたり多くの質問と回答を見てきましたが、私はすでに既存のキーを持っている場合RSACryptoServiceProviderを作成する方法についての情報を発見していませんPKCS#1形式で)、キーペアの生成方法のみを示します。

たとえば、次の文字列を指定すると、RSA暗号化を使用してデータを暗号化するにはどうすればよいですか?

----- BEGIN PUBLIC KEY ----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqGKukO1De7zhZj6 + H0qtjTkVxwTCpvKe4eCZ0 FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/ 3J + skZ6UtW + 5u09lHNsj6tQ51s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQAB

----- END PUBLIC KEY -----

ありがとうございます!

+0

を多分これは役立ちます - それはあなたのフォーマットに HTTPに合うかどうかを知るしないでください。 //stackoverflow.com/questions/1528928/using-a-previously-generated-rsa-public-private-key-with-the-net-framework –

答えて

3

BouncyCastleは、PKCS#1形式のキーから暗号化と復号化に使用できる実際のキーパラメーターに変換できる.NETライブラリです。

公開鍵はPKCS#1のbase64でエンコードされた値としてフォーマットされているためです。次に、BouncyCastleを次のように使用して、公開鍵をASN.1オブジェクトとしてデコードすることができます。

'----- BEGIN PUBLIC KEY -----'と '----- END PUBLIC KEY ----- 'をstringPublicKeyから削除してください。

Asn1Object obj = Asn1Object.FromByteArray(Convert.FromBase64String(stringPublicKey)); 

その後、RFC 3447 (A 1.1)に指定されている:

DerSequence publicKeySequence = (DerSequence)obj; 

DerBitString encodedPublicKey = (DerBitString)publicKeySequence[1]; 
DerSequence publicKey = (DerSequence)Asn1Object.FromByteArray(encodedPublicKey.GetBytes()); 

DerInteger modulus = publicKey[0]; 
DerInteger exponent = publicKey[1]; 

をここで、あなたは、公開鍵を作成するために必要なすべてを持っている。そして、

RsaKeyParameters keyParameters = new RsaKeyParameters(false, modulus.PositiveValue, exponent.PositiveValue); 

を、はBouncyCastleは、変換する簡単な方法を提供しますこれは.NETと互換性がありますRSAParameters

RSAParameters parameters = DotNetUtilities.ToRSAParameters(keyParameters); 

あなたは、簡単にRSACryptoServiceProviderに重要なパラメータをインポートすることができます。

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 
rsa.ImportParameters(parameters); 

を最後に、あなたの暗号化を実行します。

byte[] dataToEncrypt = Encoding.UTF8.GetBytes(stringDataToEncrypt); 
byte[] encryptedData = rsa.Encrypt(dataToEncrypt, true); 
return Convert.ToBase64String(encryptedData); 
+0

ありがとう!働くように思える –

関連する問題