読者です 読者をやめる 読者になる 読者になる

AES の CTR モード

[crypto][erlang]AES の CTR モードのストリームタイプ

暗号データにランダムアクセスが可能になる (IVec が固定) ため、並列処理が可能となる AES の Counter Mode を試してみました。

ストリーム暗号なので、パディングがいらないのがいいですね。

まずは基本的なところで

Erlang R15B02 (erts-5.9.2) [source] [64-bit] [smp:4:4] [async-threads:0] [kernel-poll:false] [dtrace]

Eshell V5.9.2  (abort with ^G)
1> Key = crypto:strong_rand_bytes(32).
<<195,208,93,158,92,153,199,116,175,237,136,222,99,112,
  132,235,113,181,239,230,36,227,75,166,220,44,94,0,152,
  ...>>
2> IV = crypto:strong_rand_bytes(16).
<<103,24,128,108,59,235,30,41,208,236,122,47,44,216,200,2>>
3> Cipher = crypto:aes_ctr_encrypt(Key, IV, <<"spam">>). 
<<145,208,153,142>>
4> crypto:aes_ctr_decrypt(Key, IV, Cipher).
<<"spam">>

Erlang の crypto には aes_ctr_stream_init/2 があるのでそれを使ってみます

Erlang R15B02 (erts-5.9.2) [source] [64-bit] [smp:4:4] [async-threads:0] [kernel-poll:false] [dtrace]

Eshell V5.9.2  (abort with ^G)
1> Key = crypto:strong_rand_bytes(32).
<<91,111,86,156,1,12,23,244,91,25,153,159,25,139,115,205,
  228,100,158,61,9,64,165,14,185,43,243,39,33,...>>
2> IV = crypto:strong_rand_bytes(16).
<<154,49,236,153,246,155,109,146,212,65,155,56,184,226,
  142,215>>
3> State = crypto:aes_ctr_stream_init(Key, IV).
{<<91,111,86,156,1,12,23,244,91,25,153,159,25,139,115,205,
   228,100,158,61,9,64,165,14,185,43,243,39,...>>,
 <<154,49,236,153,246,155,109,146,212,65,155,56,184,226,
   142,215>>,
 <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>>,
 0}
4> {NewState, Cipher} = crypto:aes_ctr_stream_encrypt(State, <<"spam">>).
{{<<91,111,86,156,1,12,23,244,91,25,153,159,25,139,115,
    205,228,100,158,61,9,64,165,14,185,43,243,...>>,
  <<154,49,236,153,246,155,109,146,212,65,155,56,184,226,
    142,216>>,
  <<255,161,127,123,51,205,69,22,77,219,85,251,253,52,200,
    200>>,
  4},
 <<140,209,30,22>>}
5> crypto:aes_ctr_stream_decrypt(State, Cipher).   
{{<<91,111,86,156,1,12,23,244,91,25,153,159,25,139,115,
    205,228,100,158,61,9,64,165,14,185,43,243,...>>,
  <<154,49,236,153,246,155,109,146,212,65,155,56,184,226,
    142,216>>,
  <<255,161,127,123,51,205,69,22,77,219,85,251,253,52,200,
    200>>,
  4},
 <<"spam">>}

参考