我试图用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操作期间,这些信息将非常普遍。此外,在连接之后,结果将以base64字符串的形式返回。我不确定正确的‘结构’包装参数来复制这一点。
发布于 2016-08-09 19:23:12
如果仔细看一下这段代码,就会发现它是自成体系的。在运行此代码之后,不需要SJCL的"bits“(本机二进制数据表示)。这些内部数据被赋予加密和级联函数,然后将结果转换回一个可移植的“普通”Base64 64编码字符串。
此代码可能存在的唯一问题是this.key和ìv的编码。
PyCrypto没有特殊的内部二进制数据编码,因为Python语言已经为我们提供了二进制字符串或bytes (取决于Python版本)。但是,您仍然需要使用Base64编码从字符串中进行编码/解码。
https://stackoverflow.com/questions/38847927
复制相似问题