首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Crypto++低级API (a la SJCL)

Crypto++低级API (a la SJCL)
EN

Stack Overflow用户
提问于 2013-01-27 09:43:29
回答 1查看 809关注 0票数 0

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

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

编辑:我注意到javascript代码将plantext从字符串转换为整数,我想我尝试了改变每个变量的字节顺序的每种组合。无论如何,我尝试了所有有意义的组合。我还尝试创建int32_t数组,并使用输入到该行javascript中的内容对其进行初始化。

代码语言: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++版本的输出:

代码语言:javascript
复制
plain = [2479122403, 2108737444, 3518906241, 22203222]
key = [1885434739, 2003792484, 1885434739, 2003792484]
cipher = [3437909595, 1341853431, 2532744872, 2416113380]

和JavaScript:

代码语言:javascript
复制
plain = 2479122403,2108737444,3518906241,22203222
key = 1885434739,2003792484,1885434739,2003792484
cipher = -1974659585,-1567997661,-1863224381,-318378846
EN

回答 1

Stack Overflow用户

发布于 2013-01-28 01:09:18

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14543596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档