2017-02-11 49 views
0

私は、C++で3つの関数を書いて、Crypto ++を使用してキーペアを生成し、文字列を暗号化して解読します。 Crypto++ sideCrypto ++ RSA暗号文を解読すると例外が発生する

//Decode public key 
RSA::PublicKey pbKeyDecoded; 
StringSource ss2(publicKey, true, new Base64Decoder); 
pbKeyDecoded.BERDecode(ss2); 

Integer m = Integer((const byte*)plaintext.data(), plaintext.size()); 
Integer crypted = pbKeyDecoded.ApplyFunction(m); 
... 

私は何をすべきかは、DERはそれをエンコードして、Base64でそれをエンコードし、鍵を生成する、です。その後、私は公開鍵を介して平文を暗号化し、秘密鍵と暗号をbase64でエンコードされた文字列として2つの別々のファイルに保存します。

Now to C#。私はbase64の文字列を読んで、それらをデコードし、AsnParser経由で読み込みます。それからDecryptと呼んでいます。 C# side

AsnKeyParser keyParser = new AsnKeyParser("rsa-public.der"); 
RSAParameters publicKey = keyParser.ParseRSAPublicKey(); 

CspParameters csp = new CspParameters; 
csp.KeyContainerName = "RSA Test (OK to Delete)";  
csp.ProviderType = PROV_RSA_FULL; // 1 
csp.KeyNumber = AT_KEYEXCHANGE;  // 1 

RSACryptoServiceProvider rsp = new RSACryptoServiceProvider(csp); 
rsp.PersistKeyInCsp = false; 
rsp.ImportParameters(privateKey); 

//Causes exception here.. 
var data = rsp.Decrypt(cipherArr, true); 
... 

しかし、私はfOAEP = trueでそれを解読しようとすると、私は、例外エラーを取得しています:CryptographicException:OAEPパディングのデコード中にエラーが発生しました。私がfOAEP = falseを渡すと、が得られます。CryptographicException:パラメータが間違っています。

Crypto ++暗号テキストを復号化しようとすると、C#で例外が発生するのはなぜですか?

+1

pastebinにリンクするのではなく、質問にあなたのコードを載せてください。そうしないと、あなたの質問が閉じられる可能性があります。また、MCVE(http://stackoverflow.com/help/mcve)を実行できない場合は、ここに投稿する前に無関係なコードをすべて削除してください。 –

答えて

1

...復号化しようとすると、例外エラーが発生します。CryptographicException:OAEPパディングの復号中にエラーが発生しました。それは私がfalseに渡す場合、私はfalseEPブールの真実を渡す場合は、私は得るCryptographicException:パラメータが間違っています。

あなたはEncrypt and Decrypt a message using raw RSA algorithim in Crypto++?と同じ問題を有するHow to sync Crypto++ RSA with C# RSA crypto service provider?されているそれは、「生のRSA」のスキームのための私達の月でなければなりません...式の暗号++側で

you are performing raw RSA

:PKCS#1.5パディングやOAEPパディングのいずれかでPKCS#1を使用して、物事のC#の側で

//Decode public key 
RSA::PublicKey pbKeyDecoded; 
StringSource ss2(publicKey, true, new Base64Decoder); 
pbKeyDecoded.BERDecode(ss2); 

Integer m = Integer((const byte*)plaintext.data(), plaintext.size()); 
Integer crypted = pbKeyDecoded.ApplyFunction(m); 
... 

you are performing RSA decryption:あなたは、単に累乗であるフォワード機能を適用している、とあなたはメッセージをフォーマットされていません

RSACryptoServiceProvider rsp = new RSACryptoServiceProvider(csp); 
rsp.PersistKeyInCsp = false; 
rsp.ImportParameters(privateKey); 

//Causes exception here.. 
var data = rsp.Decrypt(cipherArr, true); 

あなたのコードのC#バージョンでは、特定のバージョンのCLRが必要なため、OAEP埋め込みを実行できるかどうかはわかりません。あなたは、PKCSのパッディングしか利用できないかもしれません。


私はあなたに2つの選択肢があると信じています。まず、Crypto ++で標準のRSA暗号化方式を使用できます。暗号++ウィキはRSA CryptographyRSA Encryption Schemesでそれらを示しています

typedef RSAES<PKCS1v15>::Decryptor RSAES_PKCS1v15_Decryptor; 
typedef RSAES<PKCS1v15>::Encryptor RSAES_PKCS1v15_Encryptor; 

typedef RSAES<OAEP<SHA> >::Decryptor RSAES_OAEP_SHA_Decryptor; 
typedef RSAES<OAEP<SHA> >::Encryptor RSAES_OAEP_SHA_Encryptor; 

第二に、あなたは、C#で生RSAを実行する必要があります。 C#でRaw RSAを実行するには、BigIntegerクラスを取得し、逆関数を手動で適用する必要があります。

OAEPパディング付きのRSA暗号化を使用することをお勧めします。 OAEPが利用できない場合、2番目の選択肢はPKCSパディングです。最後に、あなたが持っているものがすべてRaw RSAであれば、Raw RSAはあまり安全ではないので、私は別の暗号化システムを探します。

+0

さて、私はちょっと馬鹿だと感じています。すべてを修正するには、RSAES_OAEP_SHA_Encryptor&Decryptorと明記したとおり、Crypto ++側に行って使用しましたが、今はすべてうまく動作します。 – Kyojin

関連する問題