0

我正在尝试使用 pycrypto 在 Python 中重写一些 JS(它使用 SJCL 库)。我无法弄清楚如何实现以下代码

aes = new sjcl.cipher.aes( this.key );
bits = sjcl.codec.utf8String.toBits( text );
cipher = sjcl.mode.ccm.encrypt( aes, bits, iv );
cipherIV = sjcl.bitArray.concat( iv, cipher );
return sjcl.codec.base64.fromBits( cipherIV );

我的问题不是加密,而是库处理 fromBits 转换的方式。根据 SJCL 文档:

我们的大多数加密原语在内部对 4 字节字的数组进行操作,但其中许多可以接受不是 4 字节的倍数的参数。该库将位数组(其大小不必是 8 位的倍数)编码为 32 位字的数组。这些位按大端顺序打包成一个字数组,一次 32 位。由于单词是双精度浮点数,它们适合一些额外的数据。我们使用它(以一种私有的、可能改变的方式)来编码数组最后一个字中实际存在的位数。

对我来说,这似乎意味着转换为位数组会增加某种附加信息,我担心这些信息在concat操作期间会很普遍。此外,在 concat 之后,结果作为 base64 字符串返回。我不确定复制这个的正确的“结构”包装参数。

4

1 回答 1

1

如果您仔细查看此代码,您应该会发现它是自包含的。运行此代码后,不再需要 SJCL 的“位”(本机二进制数据表示)。该内部数据被提供给加密和连接函数,然后将结果转换回可移植的“普通”Base64 编码字符串。

此代码可能存在的唯一问题是 和 的this.key编码ìv

PyCrypto 没有特殊的内部二进制数据编码,因为 Python 语言已经为我们提供了二进制字符串或bytes(取决于 Python 版本)。但是您仍然需要使用 Base64 编码对字符串进行编码/解码。

于 2016-08-09T19:23:12.820 回答