1

さて、私は最近、個人的な地獄を経験してきました

RSA を使用して暗号化されたメッセージの復号化に問題があり、常に「RSA/OAEP-MGF1(SHA-1): 無効な暗号文」で失敗しています。

  1. base64 でエンコードされた秘密鍵があり、それをロードします。

        RSA::PrivateKey private_key;
        StringSource file_pk(PK,true,new Base64Decoder);
        private_key.Load( file_pk );
    
  2. 次に、次のようにしてメッセージをデコードします。

    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 であるため、最後に \0 がなく、予期しないことが起こります。

秘密鍵が間違っていても、BER デコード エラーをスローせずにロードできる場合はどうでしょうか。復号化するときに何がスローされますか?

誰もがこれに光を当てることができることを願っています。

乾杯

4

1 に答える 1

0

キーが実際に破損していた場合、Load 関数は失敗しているはずです。Validateただし、次のように呼び出して、キー自体にセルフテストを要求できます。これにより、破損が検出されます。

bool key_ok = private_key.Validate(rng, 3);

2 番目のパラメーター (ここでは 3) は、実行するチェックの量を指定します。RSA の場合、これにより、低速/高価なテストであっても、利用可能なすべてのテストが実行されます。

デコードが失敗するもう 1 つの理由は、キーが元のメッセージの暗号化に使用されたものではない場合です。

明らかに、暗号文の入力は、暗号化側で最初に生成されたものと完全に同一でなければなりません。デバッグの場合、これを確認する良い方法の 1 つは、両側の暗号文をハッシュ関数 (便利なことに、もちろん既に利用可能です) にフィードし、出力を比較することです。送信用の暗号文を 16 進数または base64 でエンコードした場合は、RSA デクリプタに渡す前に元に戻す必要があります。

于 2010-06-14T18:33:22.780 に答える