Python, почему второй раз не удается расшифровать - PullRequest
0 голосов
/ 14 июля 2020

Ниже тест. Когда я пытаюсь декодировать ту же строку во второй раз, я получаю сообщение об ошибке, и я действительно не понимаю, почему и где искать. Сообщите, пожалуйста.

Ошибка:

Traceback (most recent call last):
  File "test.py", line 28, in <module>
    telnr_to_string = str(telnr_decrypt, 'utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x9e in position 0: invalid start byte

Код:

from Crypto.Cipher import AES
from Crypto.Util.Padding import *
from urllib.request import urlopen

import os
import urllib
import subprocess
import re
import time
import base64
import random
file_key = open("key.txt")
key = file_key.read()
key = key.encode()
file_iv = open("iv.txt")
iv = file_iv.read()
iv = iv.encode()
obj2 = AES.new(key, AES.MODE_CBC, iv)
z=1
while z < 3:
    x=''
    telnr_decrypt=''
    telnr=''
    telnr_to_string=''
    telnr_cleaned=''
    x=(b'\x9e\xde\x98p:\xa3\x04\x92\xb5!2K[\x8e\\\xee')
    telnr_decrypt = obj2.decrypt(x)
    telnr_to_string = str(telnr_decrypt, 'utf-8')
    telnr_cleaned = re.sub("[^0-9]", "", telnr_to_string)
    print (telnr_cleaned)
    z=z+1

1 Ответ

0 голосов
/ 15 июля 2020

Просто переместите obj2 = AES.new(key, AES.MODE_CBC, iv) в while l oop. Не волнуйтесь, зашифрованные объекты - это не очень объекты с отслеживанием состояния; они ничего не делают, кроме как хранить ключ (или, для AES, возможно, внутренние подключи) и поддерживать небольшой буфер. Поэтому, как правило, повторное использование или кэширование - плохая идея.

Если вы вызываете encrypt / decrypt несколько раз подряд, тогда методы действуют так, как если бы вы шифровали одно большое сообщение. Другими словами, они позволяют шифрование / дешифрование по частям, так что можно избежать буферов размером с сообщение. Это не очень явно задокументировано, но вы можете увидеть это на рис. 2 в документации .

Для режима CB C это означает, что операция идентична установке IV для последний блок зашифрованного текста. Если IV неверен, то первый блок открытого текста будет рандомизирован. Случайные байты обычно не содержат допустимой кодировки UTF-8, что означает, что декодирование в строку (скорее всего) не удастся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...