2017-04-18 5 views
1

Python 3에서 pycryptodome을 사용하여 AES-CTR 암호화에 어려움을 겪고 있습니다. 데이터는 ~ 1000 바이트가 될 수 있지만 길어지면 깨집니다. 이 오류가 의미하는 바가 무엇인지 또는 어떻게 해결할 수 있는지 이해할 수 없습니다.pycryptodome : OverflowError : 카운터가 CTR 모드에서 줄 바꿈되었습니다.

from os import urandom 
from Crypto.Cipher import AES 

cipher = AES.new(urandom(16), AES.MODE_CTR, nonce=urandom(15)) 
cipher.encrypt(urandom(10000)) 

--------------------------------------------------------------------------- 
OverflowError        Traceback (most recent call last) 
<ipython-input-116-a48990362615> in <module>() 
     3 
     4 cipher = AES.new(urandom(16), AES.MODE_CTR, nonce=urandom(15)) 
----> 5 cipher.encrypt(urandom(10000)) 
     6 

/usr/local/lib/python3.5/dist-packages/Crypto/Cipher/_mode_ctr.py in encrypt(self, plaintext) 
    188   if result: 
    189    if result == 0x60002: 
--> 190     raise OverflowError("The counter has wrapped around in" 
    191          " CTR mode") 
    192    raise ValueError("Error %X while encrypting in CTR mode" % result) 

OverflowError: The counter has wrapped around in CTR mode 

답변

1

알아 냈습니다. Nonce는 블록 크기가 1 바이트 밖에 없으므로 카운터 모드는 4096 바이트를 암호화 할 수있는 256 블록 만 생성 할 수 있습니다. nonce가 몇 바이트 더 짧으면 문제는 사라집니다.

+1

[해당 생성자의 문서] (https://legrandin.github.io/pycryptodome/Doc/3.4/Crypto.Cipher.AES-module.html)는 CTR 모드의 nonce에 8 바이트를 권장합니다. 그러나 오버 플로우 (overflow) 동작은 나에게 꽤 어리석은 것처럼 보입니다. 16 바이트 랜덤 IV를 별도의 'nonce'및 'initial_value'부분으로 분할하는 대신에 전달하는 것이 더 합리적 일 것입니다. 그러나이 라이브러리는 CTR 모드에서'iv' 인수를 허용하지 않습니다. – Wyzard

+0

보안 침해로 간주되는 동일한 카운터가 두 번 이상 사용 된 상황을 감지합니다. – ArekBulski

+1

아닙니다. 카운터 공간을 작은 덩어리로 나누고 한 덩어리에서 다른 덩어리로 오버플로를 방지하여 매번 다른 덩어리 (nonce)를 사용하면 충돌을 방지합니다. 그러나 nonce의 재사용을 막거나 감지하지 못하고 임의로 nonce를 선택하는 경우 카운터 비트 중 일부 ('nonce'부분)가 무작위이며 나머지는 'initial_value' 부분)은 0입니다. 16 개의 임의 바이트로 전체 카운터를 초기화하는 것이 좋습니다. – Wyzard