5 算法详情
本章描述了 crypto 应用程序中算法的详细信息。
这些表格仅记录支持的密码和密钥长度。用户不应从提供的表格中得出任何关于安全性的结论。
5.1 密码
在 新 api 中的 密码 被归类为 cipher_no_iv()、cipher_iv() 或 cipher_aead() 之一。字母 IV 是初始化向量的缩写,AEAD 是带关联数据的认证加密的缩写。
由于命名约定不规则,旧 api 中的某些密码名称在新 api 中被新的名称替换。有关已停用名称的列表,请参见 已停用的密码名称。
要动态检查可用性,请检查密码和模式列中的名称是否出现在 crypto:supports(ciphers) 返回的列表中。
没有 IV 的密码 - cipher_no_iv()
用于
密码是
密码和模式 |
密钥长度 [字节] |
块大小 [字节] |
aes_128_ecb | 16 | 16 |
aes_192_ecb | 24 | 16 |
aes_256_ecb | 32 | 16 |
blowfish_ecb | 16 | 8 |
des_ecb | 8 | 8 |
rc4 | 16 | 1 |
带有 IV 的密码 - cipher_iv()
用于
密码是
密码和模式 |
密钥长度 [字节] |
IV 长度 [字节] |
块大小 [字节] |
限制为 OpenSSL 版本 |
aes_128_cbc | 16 | 16 | 16 | |
aes_192_cbc | 24 | 16 | 16 | |
aes_256_cbc | 32 | 16 | 16 | |
aes_128_cfb8 | 16 | 16 | 1 | |
aes_192_cfb8 | 24 | 16 | 1 | |
aes_256_cfb8 | 32 | 16 | 1 | |
aes_128_cfb128 | 16 | 16 | 1 | |
aes_192_cfb128 | 24 | 16 | 1 | |
aes_256_cfb128 | 32 | 16 | 1 | |
aes_128_ctr | 16 | 16 | 1 | |
aes_192_ctr | 24 | 16 | 1 | |
aes_256_ctr | 32 | 16 | 1 | |
aes_128_ofb | 16 | 16 | 1 | |
aes_192_ofb | 24 | 16 | 1 | |
aes_256_ofb | 32 | 16 | 1 | |
blowfish_cbc | 16 | 8 | 8 | |
blowfish_cfb64 | 16 | 8 | 1 | |
blowfish_ofb64 | 16 | 8 | 1 | |
chacha20 | 32 | 16 | 1 | ≥1.1.0d |
des_cbc | 8 | 8 | 8 | |
des_ede3_cbc | 24 | 8 | 8 | |
des_cfb | 8 | 8 | 1 | |
des_ede3_cfb | 24 | 8 | 1 | |
rc2_cbc | 16 | 8 | 8 |
带有 AEAD 的密码 - cipher_aead()
用于
密码是
密码和模式 |
密钥长度 [字节] |
IV 长度 [字节] |
AAD 长度 [字节] |
标签长度 [字节] |
块大小 [字节] |
限制为 OpenSSL 版本 |
aes_128_ccm | 16 | 7-13 | 任何 | 偶数 4-16 默认:12 | 任何 | ≥1.0.1 |
aes_192_ccm | 24 | 7-13 | 任何 | 偶数 4-16 默认:12 | 任何 | ≥1.0.1 |
aes_256_ccm | 32 | 7-13 | 任何 | 偶数 4-16 默认:12 | 任何 | ≥1.0.1 |
aes_128_gcm | 16 | ≥1 | 任何 | 1-16 默认:16 | 任何 | ≥1.0.1 |
aes_192_gcm | 24 | ≥1 | 任何 | 1-16 默认:16 | 任何 | ≥1.0.1 |
aes_256_gcm | 32 | ≥1 | 任何 | 1-16 默认:16 | 任何 | ≥1.0.1 |
chacha20_poly1305 | 32 | 1-16 | 任何 | 16 | 任何 | ≥1.1.0 |
5.2 消息认证码 (MAC)
CMAC
如果配置未禁用,则 OpenSSL 1.0.1 或更高版本可使用以下密码的 CMAC。
要动态检查可用性,请检查名称 cmac 是否出现在 crypto:supports(macs) 返回的列表中。还要检查密码和模式列中的名称是否出现在 crypto:supports(ciphers) 返回的列表中。
密码和模式 |
密钥长度 [字节] |
最大 MAC 长度 (= 默认长度) [字节] |
aes_128_cbc | 16 | 16 |
aes_192_cbc | 24 | 16 |
aes_256_cbc | 32 | 16 |
aes_128_ecb | 16 | 16 |
aes_192_ecb | 24 | 16 |
aes_256_ecb | 32 | 16 |
blowfish_cbc | 16 | 8 |
blowfish_ecb | 16 | 8 |
des_cbc | 8 | 8 |
des_ecb | 8 | 8 |
des_ede3_cbc | 24 | 8 |
rc2_cbc | 16 | 8 |
HMAC
如果配置未禁用,则所有与 Erlang CRYPTO 兼容的 OpenSSL 都可用。
要动态检查可用性,请检查名称 hmac 是否出现在 crypto:supports(macs) 返回的列表中,并且散列名称是否出现在 crypto:supports(hashs) 返回的列表中。
散列 |
最大 MAC 长度 (= 默认长度) [字节] |
sha | 20 |
sha224 | 28 |
sha256 | 32 |
sha384 | 48 |
sha512 | 64 |
sha3_224 | 28 |
sha3_256 | 32 |
sha3_384 | 48 |
sha3_512 | 64 |
shake128 | 64 |
shake256 | 64 |
blake2b | 64 |
blake2s | 32 |
md4 | 16 |
md5 | 16 |
ripemd160 | 20 |
POLY1305
如果配置未禁用,则 OpenSSL 1.1.1 或更高版本可使用 POLY1305。
要动态检查可用性,请检查名称 poly1305 是否出现在 crypto:supports(macs) 返回的列表中。
poly1305 mac 需要一个 32 字节的密钥,默认情况下产生一个 16 字节的 MAC。
5.3 散列
要动态检查可用性,请检查名称列中所需的名称是否出现在 crypto:supports(hashs) 返回的列表中。
类型 | 名称 |
限制为 OpenSSL 版本 |
SHA1 | sha | |
SHA2 | sha224, sha256, sha384, sha512 | |
SHA3 | sha3_224, sha3_256, sha3_384, sha3_512, shake128, shake256 | ≥1.1.1 |
MD4 | md4 | |
MD5 | md5 | |
RIPEMD | ripemd160 |
5.4 公钥密码学
RSA
如果配置未禁用,则所有与 Erlang CRYPTO 兼容的 OpenSSL 版本都可用 RSA。要动态检查可用性,请检查原子 rsa 是否出现在 crypto:supports(public_keys) 返回的列表中。
RSA 选项是实验性的。
确切的选项集及其语法**可能**在未经事先通知的情况下更改。
选项 | 签名/验证 |
公钥加密 私钥解密 |
私钥加密 公钥解密 |
{rsa_padding,rsa_x931_padding} | x | x | |
{rsa_padding,rsa_pkcs1_padding} | x | x | x |
{rsa_padding,rsa_pkcs1_pss_padding} {rsa_pss_saltlen, -2..} {rsa_mgf1_md, atom()} |
x (2) x (2) x (2) |
||
{rsa_padding,rsa_pkcs1_oaep_padding} {rsa_mgf1_md, atom()} {rsa_oaep_label, binary()}} {rsa_oaep_md, atom()} |
x (2) x (2) x (3) x (3) |
||
{rsa_padding,rsa_no_padding} | x (1) |
注释
- (1) OpenSSL ≤ 1.0.0
- (2) OpenSSL ≥ 1.0.1
- (3) OpenSSL ≥ 1.1.0
DSS
如果配置未禁用,则所有与 Erlang CRYPTO 兼容的 OpenSSL 版本都可用 DSS。要动态检查可用性,请检查原子 dss 是否出现在 crypto:supports(public_keys) 返回的列表中。
ECDSA
如果配置未禁用,则 OpenSSL 0.9.8o 或更高版本可用 ECDSA。要动态检查可用性,请检查原子 ecdsa 是否出现在 crypto:supports(public_keys) 返回的列表中。如果原子 ec_gf2m 也存在,则可以使用特征二域曲线。
可以通过检查 crypto:supports(curves) 返回的列表来检查实际支持的命名曲线。
EdDSA
如果配置未禁用,则 OpenSSL 1.1.1 或更高版本可用 EdDSA。要动态检查可用性,请检查原子 eddsa 是否出现在 crypto:supports(public_keys) 返回的列表中。
支持 ed25519 和 ed448 曲线。可以通过检查 crypto:supports(curves) 返回的列表来检查实际支持的命名曲线。
Diffie-Hellman
如果配置未禁用,则所有与 Erlang CRYPTO 兼容的 OpenSSL 版本都可用 Diffie-Hellman 计算。要动态检查可用性,请检查原子 dh 是否出现在 crypto:supports(public_keys) 返回的列表中。
椭圆曲线 Diffie-Hellman
如果配置未禁用,则 OpenSSL 0.9.8o 或更高版本可用椭圆曲线 Diffie-Hellman。要动态检查可用性,请检查原子 ecdh 是否出现在 crypto:supports(public_keys) 返回的列表中。
如果配置未禁用,则 Edward 曲线 x25519 和 x448 在 OpenSSL 1.1.1 或更高版本中受支持。
可以通过检查 crypto:supports(curves) 返回的列表来检查实际支持的命名曲线。