入力ファイルには、次のものがあります。
最初の行には、16進数で16バイトの長さでエンコードされたキーがあります。
2行目暗号化メッセージ(CBCモードのAES128、暗号化されたメッセージの前にランダムivが付いています)。
Crypto ++ライブラリを使用したCBCモード実装のAES128
これは私が解読しようとした方法である:
#include<iostream>
using namespace std;
#include <fstream>
#include <string.h>
#include <cryptopp/aes.h>
#include <cryptopp/modes.h>
#include <cryptopp/filters.h>
using namespace CryptoPP;
int main(void) {
ifstream in("input0.txt");
ofstream out("output0.txt");
string hex_key = "", hex_ct = "";
in >> hex_key >> hex_ct;
byte key[ AES::DEFAULT_KEYLENGTH ], iv[ AES::BLOCKSIZE ];
string ciphertext = "", recoveredtext = "";
for(int i = 0; i < hex_key.size(); i+=2) {
key[i/2] = (char) strtol((hex_key.substr(i, 2)).c_str(), 0, 16);
}
//then I divide iv from the text
for(int i = 0; i < AES::BLOCKSIZE*2; i+=2) {
iv[i/2] = (char) strtol((hex_ct.substr(i, 2)).c_str(), 0, 16);
}
for(int i = AES::BLOCKSIZE*2; i < hex_ct.size(); i++) {
ciphertext.push_back(hex_ct[i]);
}
//decryption
CBC_Mode<AES>::Decryption d;
d.SetKeyWithIV(key, AES::DEFAULT_KEYLENGTH, iv);
StringSink sink(recoveredtext);
StreamTransformationFilter stf (
d,
&sink
);
StringSource ss (
ciphertext,
true,
&stf
);
out << recoveredtext;
return 0;
}
私は Wiki次この実装を使用していました。
私も thisで試してみましたが、キーと暗号文をmyで置き換えずに動作しました。このコードを使用している間
AES128CBC: /usr/local/include/cryptopp/misc.h:304: void CryptoPP::memcpy_s(void*, size_t, const void*, size_t): Assertion `dest != __null' failed.
Aborted (core dumped)
:
//decryption
AES::Decryption aesDecryption(key, AES::DEFAULT_KEYLENGTH);
CBC_Mode_ExternalCipher::Decryption cbcDecryption(aesDecryption, iv);
StreamTransformationFilter stfDecryptor(
cbcDecryption,
new StringSink(recoveredtext),
BlockPaddingSchemeDef::NO_PADDING
);
stfDecryptor.Put(reinterpret_cast<const unsigned char*>(ciphertext.c_str()), ciphertext.size());
stfDecryptor.MessageEnd();
それは動作しますが、出力が文字の有効なシーケンスではありません、私はこの出力を持っている上記のコードを使用して
まあ、。
私はlibがインストールさ:私が間違っているものを見つけることができません
g++ -o AESCBC128 AESCBC128.cpp -lcryptopp
:
sudo apt-get install libcrypto++-dev libcrypto++-doc libcrypto++-utils
と私はそれをコンパイル。
ご協力いただきありがとうございます。
入力のサンプル:
140b41b22a29beb4061bda66b6747e14
4ca00ff4c898d61e1edbf1800618fb2828a226d160dad07883d04e008a7897ee2e4b7465d5290d0c0e6c6822236e1daafb94ffe0c5da05d9476be028ad7c1d81
これは演習で、私の目標は、秘密のメッセージを発見することですので、私は、出力のサンプルを知りません。バイト配列への入力に変換に
試験:
out << "KEY:\n" << hex_key << endl;
for(int i = 0; i < AES::DEFAULT_KEYLENGTH; i++) {
out << setfill('0') << setw(2) << hex << (int)key[i];
}
out << endl << "Received message:\n" << hex_ct << endl;
out << "IV:\n";
for(int i = 0; i < AES::BLOCKSIZE; i++) {
out << setfill('0') << setw(2) << hex << (int)iv[i];
}
out << endl << "CT:\n" << ciphertext << endl;
結果:彼らが期待されているように
KEY:
140b41b22a29beb4061bda66b6747e14
140b41b22a29beb4061bda66b6747e14
Received message:
4ca00ff4c898d61e1edbf1800618fb2828a226d160dad07883d04e008a7897ee2e4b7465d5290d0c0e6c6822236e1daafb94ffe0c5da05d9476be028ad7c1d81
IV:
4ca00ff4c898d61e1edbf1800618fb28
CT:
28a226d160dad07883d04e008a7897ee2e4b7465d5290d0c0e6c6822236e1daafb94ffe0c5da05d9476be028ad7c1d81
。
デバッグコード。あなたはサンプルデータと入力/対話を忘れました。キー、iv、暗号化されたデータ、望ましくは16進数で復号化されたデータを印刷する。彼らは正しいのですか?短い入力データでテストします。暗号化はPKCS#7パディングを使用しているため、復号化ではPKCS#7パディングが必要です。 – zaph
私は入力で質問を編集しましたが、いくつかのテストでは正しいです。パッドについては、パッドの影響を受けていますか?申し訳ありませんが、これは私の初めての暗号化であり、これはまた、stackoverflowの私の最初の質問です。 – user123456789
OK、StreamPransformationFilterコンストラクタにブロック埋め込みスキームパラメータ(NO_PADDING)を追加すると、2番目のコードは機能しますが、出力は文字のないシーケンスです。私は入力について確信しています、何がうまくいかなかったのですか? – user123456789