2017-04-18 15 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バイト不足であるため、カウンタモードでは256ブロックしか生成できず、4096バイトを暗号化できます。ナンスが数バイト短ければ、問題はなくなります。

+1

[そのコンストラクタのドキュメント](https://legrandin.github.io/pycryptodome/Doc/3.4/Crypto.Cipher.AES-module.html)では、CTRモードのノンスに8バイトを推奨しています。しかし、16バイトのランダムなIVを別の 'nonce'と' initial_value'パーツに分割するのではなく、単に渡す方が理にかなっています。しかし、このライブラリはCTRモードで 'iv'引数を許可しません。 – Wyzard

+0

セキュリティ違反と見なされる同じカウンタが複数回使用された状況を検出します。 – ArekBulski

+1

これは、カウンタースペースをより小さなチャンクに分割し、あるチャンクから別のチャンクへのオーバーフローを防ぎ、毎回異なるチャンク(ノンス)を使用すると衝突を防ぎます。しかし、ノンスの再利用を防ぐか、検出しません。ノンスをランダムに選択している場合は、カウンタービットの一部(ノンス部分)のみがランダムで残りが'initial_value'部分)はゼロです。 16個のランダムバイトでカウンタ全体を初期化する方が良いでしょう。 – Wyzard

関連する問題