2015-04-17 4 views
1

Рассмотрим два кода ниже (на основе http://pythonhosted.org//pycrypto/):DES.MODE_OFB не восстанавливает исходный текст

1) DES.MODE_ECB

from Crypto.Cipher import DES  
from Crypto import Random  
key = b'Eight888'  
cipher = DES.new(key, DES.MODE_ECB)  
plaintext = b'sona si latine loqueris '  
msg = cipher.encrypt(plaintext)  
msgback= cipher.decrypt(msg) 

2) DES.MODE_OFB

from Crypto.Cipher import DES 
from Crypto import Random 
key = b'Eight888' 
iv = Random.new().read(DES.block_size) 
cipher = DES.new(key, DES.MODE_OFB, iv) 
plaintext = b'sona si latine loqueris ' 
msg = iv + cipher.encrypt(plaintext) 
msgback= cipher.decrypt(msg) 

Почему этот код 1) восстанавливает исходный текст и 2) нет?

+0

Почему вы добавляете iv в зашифрованный текст перед его расшифровкой? – Marek

+0

@Marek Предположительно, потому что 'msg' должен быть отправлен где-то, и IV должен быть доставлен вместе с ним для дешифрования. –

+0

@ Арджом Б. Да, понял. Он просто выходит за рамки фактического фрагмента шифрования/дешифрования выше. – Marek

ответ

2

Вы должны обрезать IV перед расшифровкой, потому что это не часть зашифрованного текста.

decCipher = DES.new(key, DES.MODE_OFB, msg[:DES.block_size]) 
msgback = decCipher.decrypt(msg[DES.block_size:]) 

В отличие от CBC, где дешифрование с IV восстанавливает по меньшей мере часть открытого текста, OFB является потоковый режим. Если выравнивание между фактическим зашифрованным текстом и сгенерированным потоком (основано на IV и ключе) не является совершенным, исходный открытый текст не может быть восстановлен.

Смежные вопросы