Crypto ++ RSAおよび「無効な暗号」
-
13-09-2019 - |
質問
さて、私は最近私の個人的な地獄を経験してきました
RSAを使用して暗号化されたメッセージを復号化するのに苦労していますが、「RSA/OAEP-MGF1(SHA-1):無効なciphertext」で常に失敗しています。
base64にエンコードされた秘密鍵があり、ロードします。
RSA::PrivateKey private_key; StringSource file_pk(PK,true,new Base64Decoder); private_key.Load( file_pk );
次に、次のようにメッセージをデコードします。
RSAES_OAEP_SHA_Decryptor decryptor(private_key); AutoSeededRandomPool rng; string result; StringSource(ciphertext, true, new PK_DecryptorFilter(rng, decryptor, new StringSink(result) ) );
私が知る限り、メッセージは問題なく解析されるべきです。 ciphertextはstd :: stringですので、最後には予想外の何かを行うことはありません。
私はちょうど何か、そして秘密鍵が正しくないが、BERデコードエラーを投げることなくとにかくロードできる場合はどうでしょう。復号化するとき、それは何を投げますか?
誰もがこれに光を当てることができることを願っています。
乾杯
解決
キーが実際に破損している場合、負荷関数が失敗するはずです。ただし、鍵をセルフテストするように依頼することができます。自己テストは、腐敗を検出する必要があります。 Validate
, 、 お気に入り:
bool key_ok = private_key.Validate(rng, 3);
2番目のパラメーター(ここ、3)は、実行するチェックの量を指定します。 RSAの場合、これにより、利用可能なすべてのテスト、さらには遅い/高価なテストでも実行されます。
デコードが失敗するもう1つの理由は、キーが単に元のメッセージを暗号化するために使用されたものではない場合です。
明らかに、暗号文化は、暗号化側で元々生成されたものと完全に同一でなければなりません。デバッグについては、これをチェックする良い方法の1つは、両側の暗号文をハッシュ関数(もちろん既に利用可能な便利に)にフィードし、出力を比較することです。 hexまたはbase64が送信用に暗号文をエンコードした場合、RSA復号化装置にそれを与える前に元に戻す必要があります。