0

JavaScript の実装からプロトコルをリバース エンジニアリングしようとしていますが、AES 暗号化方式に固執しています。Crypto++ ライブラリを使用して、C++ でこれをプログラミングしています。SJCL ライブラリを使用しており、ciphertext = (new sjcl.cipher.aes(key)).encrypt(plaintext). SJCL のドキュメントから、これが低レベルのインターフェースであることがわかります。ciphertextkey、およびplaintextは、すべて 32 ビット整数の 4 要素配列です。私の知る限り、Google で見つけることができる限り、Crypto++ は高レベルのインターフェイスのみを提供します。SJCL が行っていることを Crypto++ に実行させる方法はありますか? また、そのencryptメソッドは正確に何をしますか?

http://bitwiseshiftleft.github.com/sjcl/doc/symbols/sjcl.cipher.aes.html

編集: javascript コードplantextが文字列から int に変換されていることに気付きました。すべての変数のエンディアンを変更するすべての組み合わせを試したと思います。とにかく、意味のあるすべての組み合わせを試しました。また、 の配列を作成int32_tし、その JavaScript の行に入力されたものでそれらを初期化しようとしました。これが私が今持っているものです:

void crypto()
{
    SecByteBlock key(16);
    int32_t plain[4] = { 0x93C467E3, 0x7DB0C7A4, 0xD1BE3F81, 0x0152CB56 }, cipher[4];
    int32_t* keyBuf = (int32_t*) key.BytePtr();

    keyBuf[0] = 1885434739;
    keyBuf[1] = 2003792484;
    keyBuf[2] = 0;
    keyBuf[3] = 0;

    cout << "plain = [" << plain[0] << ", " << plain[1] << ", " << plain[2] << ", " << plain[3] << "]\n";

    cout << "key = [" << keyBuf[0] << ", " << keyBuf[1] << ", " << keyBuf[2] << ", " << keyBuf[3] << "]\n";

    ECB_Mode<AES>::Encryption e;
    e.SetKey(key, key.size());

    StringSource((const byte*) plain, 16, true, new StreamTransformationFilter( e, new ArraySink((byte*)cipher, 16) ) );

    cout << "cipher = [" << cipher[0] << ", " << cipher[1] << ", " << cipher[2] << ", " << cipher[3] << "]\n";

}

function crypto()
{
    var key = [1885434739, 2003792484, 1885434739, 2003792484];
    var plain = [0x93C467E3,0x7DB0C7A4,0xD1BE3F81,0x0152CB56];
    console.log("plain = "+plain);
    console.log("key = "+key);
    var cipher = (new sjcl.cipher.aes(key)).encrypt(plain);
    console.log("cipher = "+cipher);
}

C++ バージョンの出力は次のとおりです。

plain = [2479122403, 2108737444, 3518906241, 22203222]
key = [1885434739, 2003792484, 1885434739, 2003792484]
cipher = [3437909595, 1341853431, 2532744872, 2416113380]

および JavaScript:

plain = 2479122403,2108737444,3518906241,22203222
key = 1885434739,2003792484,1885434739,2003792484
cipher = -1974659585,-1567997661,-1863224381,-318378846
4

1 に答える 1

2

はい、整数をバイト配列のビッグ エンディアン表現として使用する必要があります。したがって、最上位バイトは左側にある必要があります。次に、128ビットAESの場合、16バイトの入出力を取得します。ECB モードで Crypto++ またはその他の高レベルの暗号化ライブラリを使用して、ブロックの暗号化/復号化を実行できます。

SJCLaesクラスはプリミティブのみを実装することに注意してください。これは、暗号化のccmまたはocb2モードのいずれかの実装として SJCL 内で使用されます。これらのモードはコンビニエンス ライブラリによって使用されますが、私の記憶が正しければ、JSON エンコーディング/デコーディングを使用することになります。

于 2013-01-27T17:09:18.153 に答える