DEV Community

voluntas
voluntas

Posted on

Erlang/OTP 18.0 で AES-GCM を使う

Erlang/OTP 18.0 から AEAD な AES-GCM と ChaCha20-Poly1305 に対応しています。

AES-GCM は 128/256 です。とりあえず AES-GCM の 256 を試してみます。

crypto:supports/0 で ciphers の中に aes_gcm がいることを確認して下しださい。

chacha20_poly1305 は boringssl でしかまだ対応していないらしく、OpenSSL では非対応です。

AES-GCM

crypto:block_encrypt(aes_gcm, Key, IV, {Nonce, Plain}) で使えます。戻りが {CipherText, CipherTag} なので気をつけてください。

Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Eshell V7.0  (abort with ^G)
> crypto:supports().
[{hashs,[md4,md5,sha,ripemd160,sha224,sha256,sha384,sha512]},
 {ciphers,[des_cbc,des_cfb,des3_cbc,des_ede3,blowfish_cbc,
           blowfish_cfb64,blowfish_ofb64,blowfish_ecb,aes_cbc128,
           aes_cfb8,aes_cfb128,aes_cbc256,rc2_cbc,aes_ctr,rc4,aes_ecb,
           des3_cbf,aes_ige256,aes_gcm]},
 {public_keys,[rsa,dss,dh,srp,ec_gf2m,ecdsa,ecdh]}]
> crypto:block_encrypt(aes_gcm, binary:copy(<<0>>, 32), binary:copy(<<0>>, 24), {<<"">>, <<"1234567890">>}).
{<<41,96,181,164,113,168,138,253,250,8>>,
 <<205,178,48,121,244,0,208,72,72,4,142,93,114,149,83,137>>}
> crypto:block_decrypt(aes_gcm, binary:copy(<<0>>, 32), binary:copy(<<0>>, 24), {<<"">>,  <<41,96,181,164,113,168,138,253,250,8>>, <<205,178,48,121,244,0,208,72,72,4,142,93,114,149,83,137>>}).
<<"1234567890">>
Enter fullscreen mode Exit fullscreen mode

Top comments (0)