gpt4 book ai didi

javascript - Crypto++ 低级 AES API(a la SJCL)

转载 作者:行者123 更新时间:2023-11-28 03:24:24 24 4
gpt4 key购买 nike

我正在尝试从 javascript 实现中对协议(protocol)进行逆向工程,但我被困在 AES 加密方法上。我正在用 C++ 和 Crypto++ 库对此进行编程。它使用 SJCL 库,并调用 ciphertext = (new sjcl.cipher.aes(key)).encrypt(plaintext)。从 SJCL 文档中,我可以看出这是一个低级接口(interface)。 ciphertextkeyplaintext 都是 32 位整数的 4 元素数组。据我所知,并且可以在谷歌上找到,Crypto++ 只提供高级接口(interface)。有没有办法让 Crypto++ 做 SJCL 正在做的事情?另外,encrypt 方法到底做了什么?

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

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

最佳答案

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

请注意,SJCL aes 类仅实现原语。它在 SJCL 中用作 ccm 之一的实现或 ocb2加密模式。这些模式反过来被便利库使用,但是 - 如果我没记错的话 - 那个直接使用 JSON 编码/解码,这对你来说可能有点过头了。

关于javascript - Crypto++ 低级 AES API(a la SJCL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14543596/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com