5  算法详情

5  算法详情

本章描述了 crypto 应用程序中算法的详细信息。

这些表格仅记录支持的密码和密钥长度。用户不应从提供的表格中得出任何关于安全性的结论。

新 api 中的 密码 被归类为 cipher_no_iv()cipher_iv()cipher_aead() 之一。字母 IV 是初始化向量的缩写,AEAD 是带关联数据的认证加密的缩写。

由于命名约定不规则,旧 api 中的某些密码名称在新 api 中被新的名称替换。有关已停用名称的列表,请参见 已停用的密码名称

要动态检查可用性,请检查密码和模式列中的名称是否出现在 crypto:supports(ciphers) 返回的列表中。

用于

密码是

密码和模式 密钥长度
[字节]
块大小
[字节]
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

表 5.1:   没有 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

表 5.2:   带有 IV 的密码

用于

密码是

密码和模式 密钥长度
[字节]
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.3:   AEAD 密码

用于 mac/4相关函数

如果配置未禁用,则 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

表 5.4:   CMAC 密码密钥长度

如果配置未禁用,则所有与 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

表 5.5:   HMAC 输出大小

如果配置未禁用,则 OpenSSL 1.1.1 或更高版本可使用 POLY1305。

要动态检查可用性,请检查名称 poly1305 是否出现在 crypto:supports(macs) 返回的列表中。

poly1305 mac 需要一个 32 字节的密钥,默认情况下产生一个 16 字节的 MAC。

要动态检查可用性,请检查名称列中所需的名称是否出现在 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.6:  

如果配置未禁用,则所有与 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)

表 5.7:  

注释

  1. (1) OpenSSL ≤ 1.0.0
  2. (2) OpenSSL ≥ 1.0.1
  3. (3) OpenSSL ≥ 1.1.0

如果配置未禁用,则所有与 Erlang CRYPTO 兼容的 OpenSSL 版本都可用 DSS。要动态检查可用性,请检查原子 dss 是否出现在 crypto:supports(public_keys) 返回的列表中。

如果配置未禁用,则 OpenSSL 0.9.8o 或更高版本可用 ECDSA。要动态检查可用性,请检查原子 ecdsa 是否出现在 crypto:supports(public_keys) 返回的列表中。如果原子 ec_gf2m 也存在,则可以使用特征二域曲线。

可以通过检查 crypto:supports(curves) 返回的列表来检查实际支持的命名曲线。

如果配置未禁用,则 OpenSSL 1.1.1 或更高版本可用 EdDSA。要动态检查可用性,请检查原子 eddsa 是否出现在 crypto:supports(public_keys) 返回的列表中。

支持 ed25519 和 ed448 曲线。可以通过检查 crypto:supports(curves) 返回的列表来检查实际支持的命名曲线。

如果配置未禁用,则所有与 Erlang CRYPTO 兼容的 OpenSSL 版本都可用 Diffie-Hellman 计算。要动态检查可用性,请检查原子 dh 是否出现在 crypto:supports(public_keys) 返回的列表中。

如果配置未禁用,则 OpenSSL 0.9.8o 或更高版本可用椭圆曲线 Diffie-Hellman。要动态检查可用性,请检查原子 ecdh 是否出现在 crypto:supports(public_keys) 返回的列表中。

如果配置未禁用,则 Edward 曲线 x25519x448 在 OpenSSL 1.1.1 或更高版本中受支持。

可以通过检查 crypto:supports(curves) 返回的列表来检查实际支持的命名曲线。