2017-01-25 12 views
1

Crypto ++を使用して文字列を暗号化しますが、C#RSA暗号化サービスプロバイダによって暗号化を解除する場合は例外があります。Crypto ++ RSAとC#RSA暗号化サービスプロバイダを同期するには?

私のコードは、C#RSA暗号化サービスプロバイダを使用して異なる結果(暗号化文字列)が存在するのに対し、同じ文字列をCrypto ++で同じ公開鍵で暗号化すると、同じ暗号化文字列を生成します。

RSAの種類に関係するこの問題(ランタイムエラー)の主な理由は何ですか?

string message((char*)"hi", 2); 
Integer messageInteger((const byte *)message.data(), message.size()); 
Integer cipherMessage = hostPublicKey.ApplyFunction(messageInteger); 
size_t len = cipherMessage.MinEncodedSize(); 
string str; 
str.resize(len); 
cipherMessage.Encode((byte *)str.data(), str.size(), Integer::UNSIGNED); 

および暗号++復号化コードは次のとおりです:暗号++を使用して

私の暗号化コードは以下である

Integer cipherMessage1((byte *)str.data(), str.size()); 
int size1 = cipherMessage1.ByteCount(); 
Integer plainInteger = privateKey.CalculateInverse(prng, cipherMessage1); 
string recovered; 
size_t req = plainInteger.MinEncodedSize(); 
recovered.resize(req); 
plainInteger.Encode((byte *)recovered.data(), recovered.size()); 

暗号化と復号化の操作は同じ側によくやっているが、そこには言及されています相手側の復号化動作の問題。暗号化で使用するために

+2

あなたが上記には、show crypto ++コードは[ "生RSA"](httpsのように表示されます//www.cryptopp。 com/wiki/Raw_RSA)。足で自分を撃つのは簡単ですので、非常に注意してください。 * "C#RSA crypto service provider ..." * - コードを表示する必要がありますが、PKCS 1.5暗号化などを実行していると思われます。 RSA Exponentiation(Crypto ++でやっていること)とPKCS 1.5(C#でやっていること)を使ったRSA Encryptionは互換性がありません。 – jww

+1

* "C#RSA暗号化サービスプロバイダを使用して異なる結果(暗号化文字列)がある間は...." * - うん、PKCS 1.5はランダムパディングを使用する。各暗号化は、同じメッセージで同じキーの下であっても、異なって見えます。 – jww

+3

@jwwは完全に正しいです。あなたのCrypto ++は直接置き換えてください。暗号は常に暗号文のランダム化を実行する必要があるため、特定の暗号文を期待して暗号化をテストすることはできません。未処理のRSAは[全ホストの攻撃]に対して脆弱です(http://crypto.stackexchange.com/q/20085/1172)。 C#はOAEPまたはPKCS#1 v1.5パディングを使用できますが、新しく設計する場合はOAEPを選択し、メッセージに署名して完全性と信頼性を守ることを忘れないでください。または、システムのセキュリティが危険にさらされているように、プロフェッショナルを雇います。 –

答えて

1

このコード:

RSAES_OAEP_SHA_Encryptor e(publicKey); 
    string cipher; 
    StringSource stringSource(message, true, 
     new PK_EncryptorFilter(rng, e, 
      new StringSink(cipher) 
     ) 
    ); 

と復号化:

RSAES_OAEP_SHA_Decryptor d(privateKey); 
    StringSource stringSource(cipher, true, 
     new PK_DecryptorFilter(rng, d, 
      new StringSink(recovered) 
     ) 
    ); 
+0

Crypto ++ wikiの[RSA暗号化](https://www.cryptopp.com/wiki/RSA_Cryptography)および[RSA暗号化方式](https://www.cryptopp.com/wiki/RSA_Encryption_Schemes)を参照してください。 – jww