У меня есть строка из 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
key = binascii.unhexlify(key)
. В вашем кодеstrXOR()
получает один аргумент в виде строки в кодировке base64, а другой - в виде шестнадцатеричной строки. Это не кажется правильным. Это работаетcypher=AES.new(key16, CFB, iv16); cypher.decrypt(unhexlify(c0))
? - person jfs   schedule 29.07.2012