Implementing SJCL .frombits in python

Implementing SJCL .frombits in python

本文关键字:python in frombits SJCL Implementing      更新时间:2023-09-26

我试图在Python中使用pycrypto重写一些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字符串的形式返回。我不确定正确的"结构"包装参数来复制这个

如果仔细查看这段代码,应该会发现它是自包含的。在此代码运行之后,就不需要SJCL的"位"(本机二进制数据表示)了。这些内部数据被输入到加密和连接函数中,然后结果被转换回可移植的"正常"base64编码字符串。

这个代码可能存在的唯一问题是this.keyìv的编码。

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