Javascript 加密++;低水平AES API(一个标准的SJCL)

Javascript 加密++;低水平AES API(一个标准的SJCL),javascript,c++,encryption,aes,crypto++,Javascript,C++,Encryption,Aes,Crypto++,我正试图从javascript实现中逆向工程一个协议,但我一直坚持使用AES加密方法。我在C++中用密码+ +库编程。它使用SJCL库,并调用ciphertext=(新的SJCL.cipher.aes(key)).encrypt(明文)。从SJCL文档中,我可以看出这是一个低级接口ciphertext、key和plaintext都是32位整数的4元素数组。据我所知,在google上也能找到,Crypto++只提供高级接口。有没有办法让Crypto++完成SJCL正在做的事情?另外,这个加密方法到

我正试图从javascript实现中逆向工程一个协议,但我一直坚持使用AES加密方法。我在C++中用密码+ +库编程。它使用SJCL库,并调用
ciphertext=(新的SJCL.cipher.aes(key)).encrypt(明文)
。从SJCL文档中,我可以看出这是一个低级接口
ciphertext
key
plaintext
都是32位整数的4元素数组。据我所知,在google上也能找到,Crypto++只提供高级接口。有没有办法让Crypto++完成SJCL正在做的事情?另外,这个
加密
方法到底做了什么

编辑:我注意到javascript代码将
plantext
从字符串转换为int,我想我尝试了改变每个变量的endianess的各种组合。无论如何,我尝试了所有有意义的组合。我还尝试创建
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);
}
和JavaScript:

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

是的,您应该使用整数作为字节数组的大端表示。所以最高的字节应该在左边。然后,对于128位AES,您将获得16字节的输入/输出。您可以在ECB模式下使用Crypto++或其他更高级别的加密LIB执行块加密/解密


请注意,SJCL
aes
类仅实现原语。它在SJCL中用作一种或多种加密模式的实现。这些模式依次被便利库使用,但是——如果我没记错的话——直接使用JSON编码/解码,这对您来说可能太远了。

PS我曾经创建了一个库来模拟Java中的SJCL,它在Github上。我或多或少地放弃了它,因为我不确定我是否相信一个人的加密项目(就像SJCL看起来那样)。例如,我发现它没有对便利库中的其他关联数据执行任何身份验证。似乎也没有执行任何兼容性测试,JSON编码也没有完全指定……我尝试过更改endianness,但更改3个变量的endianness组合都不起作用。也许可以在SJCL的论坛或列表中询问Mike Hamburg?您应该能够根据计数器模式加密的使用方式对其进行反向工程,但这很难……我已经用Java编写了程序,并使用了big-endian表示法。我没有问题就得到了JavaScript输出,但是C++通常使用小的EnDeNe(当然取决于目标机器,而不是语言本身)。改变了输入的二进制数和甚至比特顺序,但是没有用。我试图阅读Crypto++类和方法,但很快我就被那可怕的API搞得灰心丧气。
plain = 2479122403,2108737444,3518906241,22203222
key = 1885434739,2003792484,1885434739,2003792484
cipher = -1974659585,-1567997661,-1863224381,-318378846