2017-11-14 16 views
0

저는 AES의 전문가가 아니며 매우 제한된 파이썬 2 환경에 해독 기능을 제공해야합니다. 모든 유형 str - 더 긴 암호문을위한 간단한 파이썬 AES 암호 해독

I는 32 바이트 키 와 16 바이트 초기화 64 바이트 테스트 암호와 함께 벡터 메시지있다. AES는 암호 블록 체인 모드로 작동합니다.

pycrypto으로 모든 작업이 가능하며 유형이 unicode 인 64- 심볼 암호 해독 메시지가 표시됩니다. 나는 그것이 AES에 대한 몇 가지 공상 컴파일 의존성을 가지고 있다고 생각대로

from Crypto.Cipher import AES 

cipher = AES.new(key, AES.MODE_CBC, vector) 
decryption = cipher.decrypt(message).decode() 
print(decryption) 

는 불행하게도 pycrypto 자체는 최종 환경에서 지원되지 않습니다. 순수 파이썬 대안 pyaes라고 있습니다 : 내가 처음 16 바이트를 슬라이스하고 올바르게 (유형 unicode의) 해독 된 메시지의 처음 16 개 문자를 가지고

import pyaes 

cipher = pyaes.AESModeOfOperationCBC(key, vector) 
decryption = cipher.decrypt(message[0:16]).decode() 
print(decryption) 

공지 사항.

그러나 전체 메시지를 보내면 ValueError: ciphertext block must be 16 bytes이 표시됩니다.

message[16:32]으로 슬라이싱해도 UnicodeDecodeError: 'ascii' codec can't decode byte 0xb8 in position 0: ordinal not in range(128)이됩니다.

내 경우에 pyaes을 사용하고 더 긴 암호문을 해독하는 방법은 무엇입니까?


비밀 평문 (패딩)와 후행 공백

{"valueInt":123, "valueFloat":1.23, "valueString":"123"} 

같다.

+0

문제는 (직접적으로) pyaes와 관련이 없으며, 이는 ** 바이트 **의 모든 시퀀스를 성공적으로 암호화하고 해독 할 수 있지만 유니 코드 변환에 대한 잘못된 바이트는 암호화 할 수 없습니다. 나는 python-2.7 질문에 태그를 달고'cipher.decrypt (message)'에서 ** unicode **. * 형식의 64- 심볼 암호 해독 메시지를 얻는다는 것에 놀랐다. 하지만 [mcve] 없이는 더 이상 말할 수 없습니다 ... –

답변

0

가능성 1. 메시지 [16:32]의 경우 암호화되지 않은 텍스트의 첫 번째 부분에 멀티 바이트 문자가 포함될 수 있으므로 16 바이트를 사용하면 1 바이트 이상이 원본/암호화되지 않은 문자열. 이것은 멀티 바이트 문자를 사용하는 경우에만 해당됩니다. 당신은 또한을 암호화하는 경우 인코딩이 UTF8의 경우

, 당신은 바이너리 첫번째로 텍스트를 변환 시도 할 수 :

cipher.encrypt(mystring.encode('utf8')) 

과 possiblity가 2

cipher.decrypt(mystring.decode('utf8')) 

역으로 당신은 해독하는 경우 동일한 AESModeOfOperationCFB를 사용하면 해독을 위해 새 인스턴스를 사용해보아야합니다. 다음 코드는 유효하지 않은 ASCII 바이트를 포함하는 올바른 텍스트의 암호를 해독하지 못합니다. 이 방법으로 할 경우

cipher = pyaes.AESModeOfOperationCBC(key, vector) 
encrypted = cipher.decrypt('Hello world') 
print(encrypted) 
# ?Eg?m??K?(| 
decrypted = cipher.decrypt(encrypted) 
print(decrypted) 
# ?XL=?-QE??Y?=k 

는하지만 : 당신이 동일한 인스턴스 2 개 블록을 암호화하는 경우

encrypter = pyaes.AESModeOfOperationCBC(key, vector) 
encrypted = cipher.encrypt('Hello world !!!!') 
print(encrypted) 
# ?Eg?m??K?(| 
decrypter = pyaes.AESModeOfOperationCBC(key, vector) 
decrypted = decrypter.decrypt(encrypted) 
# Hello world !!!! 

을 한 다음을 연결, 당신은 2 개의 새로운 블록 암호를 해독 새로운 인스턴스가 필요합니다. 또는 각각 새로운 인스턴스가있는 각 블록을 암호화/해독합니다.