2017-04-26 2 views
0

여기에 같은 일반 텍스트를 암호화하기 위해 동일한 키와 IV를 사용하여 다른 결과를 얻을 것은 내 코드입니다 :AES 반복

from Crypto.Cipher import AES 
import binascii 

def encrypt(secret_key, sign, raw): 
    key = md5(secret_key).hexdigest()[::-2] 
    iv = md5(sign).hexdigest()[::-2] 
    raw += (16 - len(raw) % 16) * '\0' 
    generator = AES.new(key, AES.MODE_CBC, IV=iv) 

    #*********************************************** 
    #Problems occur at here ! 
    #If I execute "generator.encrypt(raw)" 
    #The results are not same every time 

    print generator.encrypt(raw) # result_1 
    print generator.encrypt(raw) # result_2 
    print generator.encrypt(raw) # result_3 

    #*********************************************** 

    return binascii.b2a_hex(generator.encrypt(raw)) 

때마다 나는 "실행할 때 나는 다른 결과를 얻을 것이다 generator.encrypt (원시) " 동일한 KEY 및 IV를 사용했기 때문에 매우 혼란 스럽습니다.

API-SYSTEM을 구축하고 싶습니다. 어떤 언어를 사용 하던지간에 암호화 된 데이터를 게시해야하며, AES에서 동일한 결과를 얻고 싶습니다.

어떻게 AES를 사용하여 안정적인 결과를 얻을 수 있습니까?

동일한 KEY 및 IV를 사용하여 동일한 일반 텍스트를 암호화 할 때 동일한 결과를 얻고 싶습니다.

+0

어딘가에 IV가 다시 초기화됩니다. Golang AES 구현에서이 문제가 발생했습니다. 각 단계에서 수행하는 작업을 확인하려면 문서를 검토해야합니다. –

+0

발전기 = AES.new (key, AES.MODE_CBC, iv)로 AES.new (key, AES.MODE_CBC, IV = iv)를 변경하고 –

답변

0

pycrypto의 AES 구현은 CBC 모드의 상태 저장 프로그램입니다. 이 상태는 IV 값으로 시뮬레이션 할 수 있습니다. 단순화를 위해 raw이 16 바이트보다 짧다고 가정 해 봅시다. 이 경우

코드

raw += (16 - len(raw) % 16) * '\0' 
generator = AES.new(key, AES.MODE_CBC, IV=iv) 

print generator.encrypt(raw) # result_1 
print generator.encrypt(raw) # result_2 
print generator.encrypt(raw) # result_3 

그 이유는 IV가 CBC mode의 정의에 따라 내부적으로 진행된다는 것이다

raw += (16 - len(raw) % 16) * '\0' 
generator = AES.new(key, AES.MODE_CBC, IV=iv) 
ct1 = generator.encrypt(raw) 
print ct1 # result_1 

generator = AES.new(key, AES.MODE_CBC, IV=ct1) 
ct2 = generator.encrypt(raw) 
print ct2 # result_2 

generator = AES.new(key, AES.MODE_CBC, IV=ct2) 
ct3 = generator.encrypt(raw) 
print ct3 # result_3 

동일하다. IV가 마지막 전체 암호문 블록으로 설정됨을 의미합니다. 그렇지 않으면

raw += (16 - len(raw) % 16) * '\0' 
generator = AES.new(key, AES.MODE_CBC, IV=iv) 
ct1 = generator.encrypt(raw) 
print ct1 # result_1 

generator = AES.new(key, AES.MODE_CBC, IV=ct1[-16:]) 
ct2 = generator.encrypt(raw) 
print ct2 # result_2 

generator = AES.new(key, AES.MODE_CBC, IV=ct2[-16:]) 
ct3 = generator.encrypt(raw) 
print ct3 # result_3 

: 암호문의 마지막 블록은 다음 암호화를위한 IV로 사용

raw 어떤 길이로 가정하면, 다음과 같은 것이 해당하는 것 그런 다음 원래 IV로 generator을 초기화해야합니다.

+0

을 참조하십시오. 정말 내 문제를 해결했습니다! – Jolly23