次のテストアプリケーションがあります。
import Codec.Crypto.AES
import qualified Data.ByteString.Char8 as B
key = B.pack "Thisismykey....."
iv = B.pack "0000000000000001"
main = do
let myenc = crypt' CTR key iv Encrypt (B.pack "1234567812345678")
print (B.unpack myenc)
次の結果が表示されます: "\250\DC4\DC4\255\223\221C\ETBx\239sF\nuZu"
クリアテキスト「1234567812345678」を「1234567812345688」に変更すると、「\250\DC4\DC4\255\223\221C\ETBx\239sF\nuUu」が得られます
クリアテキストを「1134567812345678」に変更すると、「\250\ETB\DC4\255\223\221C\ETBx\239sF\nuZu」という出力が得られます
入力と出力の間に明確に予測可能な相関関係があり、IMHO が発生してはならないので、私は今非常に驚いています。クリアテキストの先頭で何かを変更すると、出力の先頭だけが影響を受けます..バイト文字列の 8 または 16 バイト境界に何らかの関係がある可能性がありますか?どうすればこれを修正できますか? ここで何かが私を誤解させていますか?
CTR モードとは別に、AES は 4x4 バイト配列で動作し、問題は単一の配列の暗号化に関するものであることに注意してください。私の理解では、AES は 4 ラウンドのミキシングを実行し、1 バイト (16 のうち) を変更すると、ビットの少なくとも 50% が異なることになります。したがって、私の意見では、16バイトのクリアテキストの最後の変更が暗号文の最後を正確に変更し、前部の変更が前部を変更するなどではありません。私の理解では、IVはカウンターとしてのみ機能します。複数の 4x4 アレイが関係している場合。