4

CryptoPP の使用に問題があります。私は AES を使用しており、バイナリ暗号文を base64 にエンコードして表現したいと考えています。

私の問題は、次のコードを実行するとランダムにアサーション エラーが発生することです。

std::string encoded;
// ciphertext is of type std::string from AES
CryptoPP::StringSource(ciphertext, true, 
    new CryptoPP::Base64Encoder(new CryptoPP::StringSink(encoded)));

具体的なアサーション エラーは次のとおりです。

Assertion failed: m_allocated, file include\cryptopp\secblock.h, line 197

この「ランダムな」動作のため、問題は暗号文の内容にあると私は信じています。

私の質問は次のとおりです。私はこれを正しい方法で行っていますか? 私はしばらく困惑しており、成功せずに少し研究してきました。私が見つけることができる最も近いものは次のとおりです。http://www.mail-archive.com/cryptopp-users@googlegroups.com/msg06053.html

私の完全な実装は次のとおりです。

std::string key = "key";
std::string in = "This is a secret message.";

CryptoPP::SHA1 sha;

byte digest[CryptoPP::SHA1::DIGESTSIZE];
sha.CalculateDigest(digest, reinterpret_cast<const byte *>(key.c_str()), key.length());

byte iv[CryptoPP::AES::BLOCKSIZE];
memset(iv, 0x00, CryptoPP::AES::BLOCKSIZE);

CryptoPP::AES::Encryption encrypt(reinterpret_cast<const byte *>(digest), CryptoPP::AES::DEFAULT_KEYLENGTH);
CryptoPP::CBC_Mode_ExternalCipher::Encryption cbc_encrypt(encrypt, iv);

std::string ciphertext;
CryptoPP::StreamTransformationFilter encryptor(cbc_encrypt,
    new CryptoPP::StringSink(ciphertext));
encryptor.Put(reinterpret_cast<const unsigned char *>(in.c_str()), in.length() + 1);
encryptor.MessageEnd();

std::string encoded;
CryptoPP::StringSource(ciphertext, true, 
    new CryptoPP::Base64Encoder(new CryptoPP::StringSink(encoded)));
4

2 に答える 2

1

私の質問は次のとおりです。私はこれを正しい方法で行っていますか?

はい、コードは問題ありません (を除くdigest.erase();)。


私はしばらく困惑しており、成功せずに少し研究してきました。

メモリ チェッカーで実行します。Valgrind または Clang Asan (住所サニタイザー)。


私が見つけることができる最も近いものは次のとおりです。http://www.mail-archive.com/cryptopp-users@googlegroups.com/msg06053.html

私も過去にその主張に出くわしたことがあります。それが iOS だったのか Linux だったのかは覚えていません。GCCの特定のバージョン(おそらく4.4または4.5)を備えたLinuxだったと思います。


私の問題は、次のコードを実行するとランダムにアサーション エラーが発生することです。

CryptoPP::StringSource(ciphertext, true, 
    new CryptoPP::Base64Encoder(new CryptoPP::StringSink(encoded)));

上記を次のように変更します。

CryptoPP::StringSource ss(ciphertext, true, 
    new CryptoPP::Base64Encoder(new CryptoPP::StringSink(encoded)));

GCC の 1 つのバージョンには、匿名宣言に関する問題がありました。オブジェクト デストラクタの実行を開始するのが早すぎます。

于 2013-10-04T06:38:37.630 に答える
1

あなたの意図は、現時点では少し不明です。AES 暗号化のキーとして SHA ダイジェストを使用する理由は何ですか?

そして、あなたのコードのエラーについて、

最後の暗号は文字列です。そして、それを誰かに伝えたい場合は、すぐに送信できます。コードの最後で Base 64 エンコーダーを使用したのはなぜですか? 暗号化テキストがバイナリ形式であった場合、Base64 Encoder を使用して ASCII 文字列形式に変換できます。そうでない限り、コードに次の部分は必要ありません。

std::string encoded;
StringSource(ciphertext, true, new Base64Encoder(new StringSink(encoded)));
于 2012-08-27T17:11:30.150 に答える