1

解読するストリームがあります。これをブロックに分割し、各ブロックを以下のメソッドに渡します。復号化する必要があるデータは 16 バイトのブロックで暗号化されており、最後のブロックが 16 未満の場合、残りのすべてのバイトはパディングで埋められます。次に、復号化の瞬間に、最後のブロック結果をこれらの追加のパディング バイトを含む値として取得します。異なるパディングを使用できることを考慮して、元のデータの長さを決定してそれのみを返すか、パディングバイトを決定してそれらを削除するにはどうすればよいですか?

void SymmetricAlgorithm::Decrypt(byte* buffer, size_t dataBytesSize) {    
     MeterFilter meter(new ArraySink(buffer, dataBytesSize));
     CBC_Mode<CryptoPP::Rijndael>::Decryption dec(&Key.front(), Key.size(), &IV.front());
        StreamTransformationFilter* filter = new StreamTransformationFilter(dec, new Redirector(meter), PKCS_PADDING);
        ArraySource(buffer, dataBytesSize, true, filter);
        dec.Resynchronize(&IV.front());
}

今、私は PKCS_PADDING と Rijndael を試していますが、一般的には、アルゴリズムとパディングを使用する必要があるかもしれません。

4

2 に答える 2

0

たまたま、この質問の例で時々必要なものを見つけました。あなたの助けに感謝します、Gabriel L.、しかし私は自分の方法でパディングをまったく使用したくなかった. 不明確な説明で申し訳ありませんが、パディング シンボルを含む復号化されたデータからプレーン データを抽出したかったのです。このコードの太字の行は、プレーン データのバイト数を調べる方法を示しています。

void SymmetricAlgorithm::Decrypt(byte* buffer, size_t dataBytesSize) {    
 MeterFilter meter(new ArraySink(buffer, dataBytesSize));
 CBC_Mode<CryptoPP::Rijndael>::Decryption dec(&Key.front(), Key.size(), &IV.front());
    StreamTransformationFilter* filter = new StreamTransformationFilter(dec, new Redirector(meter), PKCS_PADDING);
    ArraySource(buffer, dataBytesSize, true, filter);
    int t = meter.GetTotalBytes(); //plain data bytes count
    dec.Resynchronize(&IV.front());
}
于 2013-10-02T08:41:52.977 に答える