2017-04-05 27 views
1

私は現在私自身のためにパスワードマネージャーに取り組んでおり、データベースの暗号化プロセスは、テストベクタとの結果を完全によく比較して動作しています。復号化中に間違ったキーを使用すると「ブロックパディング」の例外が予想されますか?

暗号文を復号化するには、Web上で見つかったコードを使用しようとしていますが、プログラムに誤った復号鍵を渡すと例外が発生します。私は、この例外をキャッチするのが安全かどうか、それが間違っているかどうかを知りたかったのです。

私が持っているコードは次のとおりです。

derivedKeyはPBKDF2によって生成 unsigned char*ある
CryptoPP::CBC_Mode<CryptoPP::AES>::Decryption aesDecryption; 
aesDecryption.SetKeyWithIV(derivedKey, sizeof(derivedKey), initVector); 

// The StreamTransformationFilter removes 
// padding as required. 
CryptoPP::StringSource ss(encryptedString, true, 
    new CryptoPP::StreamTransformationFilter(aesDecryption, 
     new CryptoPP::StringSink(decryptedData) 
    ) // StreamTransformationFilter 
); // StringSource 

initVectorunsigned char*で、encryptedStringは私が解読したいとdecryptedDataを置くための文字列であるデータを含む文字列であります解読されたデータ

このコードを右のderivedKeyを使用して実行すると、すべて正常に動作します。私は間違っderivedKeyを使用してみた場合でも、私は暗号++から次のエラーを取得する:

StreamTransformationFilter: invalid PKCS #7 block padding found 

私はStreamTransformationFitlerに指定された鍵が正しいものでない場合、これは正常であるかどうかを知りたい場合、またはしたいですこのエラーは他の何かから発生する可能性があります。

+0

はいそうです。この動作は、SSL/TLS(およびその他のプロトコルとスキーム)のパディングの基本です。認証された暗号化モードを使用する必要があります。 Crypto ++ wikiの[Authenticated Encryption](https://www.cryptopp.com/wiki/Authenticated_Encryption)も参照してください。 – jww

答えて

0

はい、これは間違ったキーで発生する可能性があります。

正しいキーでもこの例外が発生する場合、コードは間違っていますが、明らかにこれは起こっていません。

ただし、この例外は、間違ったキーで発生することが保証されているではありません。です。いくつかの間違ったキーを持つデータの一部は例外を生成し、他のものはそうしません(復号化されたデータはガベージです)。誤った鍵を信頼できる方法で確実に使用するには、安全な方法で追加の「チェックサム」部分を追加します。例えば。異なる鍵を持つCBC-MAC。

この例外の意味:
AESは16バイトサイズのデータ​​ブロックで動作します。データの長さが16の倍数でない場合(たとえば、16,32,48はOKですが1,20,45などは暗号化されません)、暗号化する前に元のデータにバイトを追加する必要があります。 16の倍数になります。これはパディングと呼ばれます。解読後、元のデータを取得するには、このパディングデータを再度削除する必要があります。
「問題」は、暗号化するときにライブラリが特定のバイト値をパディングデータとして使用するようになったことです。解読後、値が一致するかどうかをチェックします。そうでない場合は、この例外が発生します。また、暗号化キーを使用して復号化時に間違ったデータを与えると、パディング部分が正しいとは思われません。

+1

@zaphパディングに1〜16バイトの間に何かがあるとすれば、どのようにして「1 256 256チャンス」を得ますか? ...そして、理由から独立したimhoは、パディングエラー、つまりパディングエラーです。解読後に間違ったパディングデータ。他のすべてが正しいことを意味するものではありません。そしてlibはキーが間違っているかどうか、例えばMACなどがないかどうかを知ることさえできません。 – deviantfan

+0

@zaph 1:最後のバイト0と任意の値の他のバイトは真です。 https://tools.ietf.org/html/rfc5652#section-6.3 https://en.wikipedia.org/wiki/Padding_%28cryptography%29#PKCS7これは長さの検出にも役に立たない.I (1/16)*((1/256)^ 16 +(1/256)^ 15 + ...というメッセージの長さの情報分布を考えると、まだ考えている+(1/256)^ 1) ' – deviantfan

+0

'不正なパディングの原因は、不正なパディングが暗号化中に追加されたということではありません。もう一度、MACなどを使わないで間違ったキーをライブラリがどのように検出するべきだと思いますか? 「パディングエラー」または「パディングバイトに予期しない値がある」場合は、開発者はそれを理解する必要があります。 – deviantfan

関連する問題