Режим счетчика дешифрования AES

У меня есть строка из 64 символов. Первые 32 символа представляют IV, а последние 32 символа — зашифрованное сообщение. Каждый символ представляет 4 бита, поэтому мне нужно интерпретировать строку парами, чтобы получить один байт.

Что я пытаюсь сделать, так это воспроизвести, как работает расшифровка встречного режима. Насколько я понимаю этот процесс, я должен иметь возможность XOR моего зашифрованного текста против шифрования моего IV, и это должно дать обычный текст. (обратите внимание, что мой зашифрованный текст = 16 байтов = один блок, поэтому я считаю, что здесь не требуется заполнение или увеличение IV.)

Независимо от того, как я это делаю, я не получаю ничего разборчивого для вывода. Я думаю, что моя проблема в том, как я шифрую свой IV, но я точно не знаю. Я атаковал это навсегда, но я ничего не получаю. Может ли кто-нибудь увидеть, что я делаю неправильно? Вот код, который я написал:

def decryptCTR(key, ciphertext):
    IV = ciphertext[:32]
    C0 = ciphertext[32:64]
    #convert into 16 byte strings
    key = array.array('B', key.decode("hex")).tostring()
    IV = array.array('B', IV.decode("hex")).tostring()

    # ENCRYPT iv with the key
    encodeAES = lambda c, s: base64.b64encode(c.encrypt(s))
    cipher = AES.new(key, AES.MODE_CFB)
    encryptedIV = encodeAES(cipher, IV)

    #xor the encrypted iv with the ciphertext block
    print "XOR: " + strXOR(encryptedIV, C0)

    return

person AndroidDev    schedule 28.07.2012    source источник
comment
вы можете использовать key = binascii.unhexlify(key). В вашем коде strXOR() получает один аргумент в виде строки в кодировке base64, а другой - в виде шестнадцатеричной строки. Это не кажется правильным. Это работает cypher=AES.new(key16, CFB, iv16); cypher.decrypt(unhexlify(c0))?   -  person jfs    schedule 29.07.2012
comment
tools.ietf.org/html/rfc3686 rfc 3686 содержит хорошее описание того, что необходимо и тестовые векторы.   -  person andrew cooke    schedule 29.07.2012
comment
Спасибо вам обоим. Я даже не знал о команде unhexlify, но, похоже, она дает тот же результат, что и моя операция array.array...tostring(). Я не показывал функцию strXOR(), поскольку она не относится к тому, с чем я здесь имею дело, но она прекрасно работает. Все равно никакого прогресса...   -  person AndroidDev    schedule 29.07.2012
comment
я подозреваю, что это не поможет, но, поскольку здесь нет отмеченного правильного ответа, вы можете быть достаточно отчаянными, чтобы справиться с этим. код на github.com/andrewcooke/particl/blob /master/src/cl/parti/ использует aes в режиме ctr для создания потока случайных данных. однако, хотя он и вызывает криптоклассы Java, он написан на clojure. одна вещь, которую я заметил, проверяя мой код против вашего, заключается в том, что вам не нужно выполнять xor. это делается за вас процедурами шифрования. тесты на github.com/andrewcooke/particl /blob/master/test/cl/parti/ сверить с приведенным выше RFC.   -  person andrew cooke    schedule 31.07.2012


Ответы (1)


Ответ действительно прост: не шифруйте IV. IV должен быть отправлен в открытом виде.

person Maarten Bodewes    schedule 28.07.2012
comment
Да, IV отправляется в чистом виде. Однако, чтобы зашифровать блок открытого текста, вы должны зашифровать IV с помощью ключа, а затем выполнить операцию xor этого зашифрованного IV с открытым текстом. Это то, что я пытаюсь сделать здесь, безрезультатно. Но спасибо за предложение. - person AndroidDev; 29.07.2012
comment
Хорошо, я вижу, что вы пытаетесь сделать. Я не понимаю, как вы знаете, что это правильно или неправильно, и как работает ваш счетчик. - person Maarten Bodewes; 20.08.2012