2016-08-09 2 views
0

Я пытаюсь переписать некоторый JS (который использует библиотеку SJCL) в Python, используя pycrypto. У меня возникли проблемы, выяснить, как реализовать следующий кодРеализация SJCL .frombits в python

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-битных слов. Биты упакованы, big-endian, в массив слов, 32 бита за раз. Поскольку слова представляют собой числа с плавающей запятой с двойной точностью, они соответствуют некоторым дополнительным данным. Мы используем это (в частном, возможно изменяющемся порядке) для кодирования количества бит, фактически присутствующих в последнем слове массива.

Для меня это, кажется, подразумевает, что преобразование в битовый массив добавляет на какую-то дополнительную информацию, которую я обеспокоен будет распространена во время Concat операции. Кроме того, после concat результат возвращается как строка base64. Я не уверен в правильных параметрах упаковки «struct», чтобы воспроизвести это.

ответ

1

Если вы внимательно посмотрите на этот код, вы увидите, что он является самодостаточным. «Биты» SJCL (собственное двоичное представление данных) не нужны после запуска этого кода. Эти внутренние данные передаются в функции шифрования и конкатенации, и результат затем преобразуется обратно в «нормальную» кодировку Base64, которая является переносимой.

Единственная проблема, которая может существовать с этим кодом, это кодирование this.key и ìv.

PyCrypto не имеет специальной внутренней кодировки двоичных данных, поскольку язык Python уже предоставляет нам двоичные строки или bytes (в зависимости от версии Python). Но вам все равно нужно кодировать/декодировать из строки с помощью кодировки Base64.