Crypto++ low level AES API (a la SJCL)
Crypto++ low level AES API (a la SJCL)
我正在尝试从javascript实现中对协议进行逆向工程,但我被困在AES加密方法上。我正在使用 Crypto++ 库在 C++ 中对此进行编程。它使用 SJCL 库,并调用 ciphertext = (new sjcl.cipher.aes(key)).encrypt(plaintext)
。从 SJCL 文档中,我可以看到这是一个低级接口。 ciphertext
、key
和 plaintext
都是 32 位整数的 4 元素数组。据我所知,并且可以在谷歌上找到,Crypto++仅提供高级接口。有没有办法让Crypto++做SJCL正在做的事情?另外,encrypt
方法究竟有什么作用?
http://bitwiseshiftleft.github.com/sjcl/doc/symbols/sjcl.cipher.aes.html
编辑:我注意到javascript代码将plantext
从字符串转换为ints,我想我尝试了更改每个变量的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);
}
以下是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
是的,您应该使用整数作为字节数组的大端表示形式。所以最高字节应该在左边。然后,您将获得16位AES的128字节输入/输出。您可以在 ECB 模式下使用 Crypto++ 或其他更高级别的加密库来执行块加密/解密。
请注意,SJCL aes
类仅实现基元。它在SJCL中用作ccm或ocb2加密模式之一的实现。这些模式反过来被便利库使用,但是 - 如果我没记错的话 - 直接使用 JSON 编码/解码,这对您来说可能太远了。
- 使用 SJCL 在 Javascript 中加密,在 PHP 中解密
- SJCL加密导致文件大小错误
- SJCL的问题“;无法读取属性'替换'“未定义”;
- 椭圆曲线加密与JS中的SJCL和Ruby中的OpenSSL
- Javascript with SJCL lib,在 GCM 模式下解密 AES
- GWT:调用外部JavaScript库(sjcl)方法
- 使用SJCL客户端加密文件
- 与SJCL兼容的Java解密和加密
- Meteor后端管理界面:有没有任何软件包可以让这一切变得简单,一个la Django
- Jquery (“.selector li:last-child”) vs (“.selector > li:la
- 用javascript a la"来强调多维数组中的所有子元素;数学”;
- 按值删除元素a-la Knockout
- 我如何突出文本-严格定时-一个la卡拉ok没有Flash在网页上.什么技术选择
- SJCL CBC模式未解密
- SJCL不连接位数组
- 不能在appellerator Titanium项目中使用sjcl
- Implementing SJCL .frombits in python
- Node.js-将响应状态代码记录到控制台(一个la Django开发服务器)
- Crypto-SJCL(javascript)加密是否与OpenSSL兼容
- Crypto++ low level AES API (a la SJCL)