查看源代码 算法细节
本章描述 crypto 应用程序中算法的细节。
表格仅记录了支持的加密算法和密钥长度。用户不应从提供的表格中得出任何关于安全性的结论。
密码
密码 在 新 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 |
sm4_ecb | 16 | 16 |
表格:无 IV 的密码
带有 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 | |
sm4_cbc | 16 | 16 | 16 | ≥1.1.1 |
sm4_cfb | 16 | 16 | 16 | ≥1.1.1 |
sm4_ofb | 16 | 16 | 16 | ≥1.1.1 |
sm4_ctr | 16 | 16 | 16 | ≥1.1.1 |
表格:带有 IV 的密码
带有 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 |
sm4_gcm | 16 | 12 | 任意 | 16 | 任意 | ≥3.1.0 |
sm4_ccm | 16 | 12 | 任意 | 16 | 任意 | ≥3.1.0 |
表格:AEAD 密码
消息验证码 (MAC)
CMAC
如果未被配置禁用,则使用以下密码的 CMAC 可在 OpenSSL 1.0.1 或更高版本中使用。
要动态检查可用性,请检查 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 |
表格:CMAC 密码密钥长度
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 |
表格:HMAC 输出大小
POLY1305
如果未被配置禁用,则 POLY1305 可在 OpenSSL 1.1.1 或更高版本中使用。
要动态检查可用性,请检查 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 |
SM3 | sm3 | ≥1.1.1 |
MD4 | md4 | |
MD5 | md5 | |
RIPEMD | ripemd160 |
公钥密码学
RSA
如果未被配置禁用,则 RSA 在所有与 Erlang CRYPTO 兼容的 OpenSSL 版本中可用。要动态检查可用性,请检查原子 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
如果未被配置禁用,则 DSS 在与 Erlang CRYPTO 兼容的 OpenSSL 版本中可用。要动态检查可用性,请检查原子 dss
是否出现在 crypto:supports(public_keys) 返回的列表中。
ECDSA
如果未被配置禁用,则 ECDSA 在 OpenSSL 0.9.8o 或更高版本中可用。要动态检查可用性,请检查原子 ecdsa
是否出现在 crypto:supports(public_keys) 返回的列表中。如果原子 ec_gf2m
也存在,则可以使用特征 2 字段曲线。
可以通过检查 crypto:supports(curves) 返回的列表来检查实际支持的命名曲线。
EdDSA
如果未被配置禁用,则 EdDSA 在 OpenSSL 1.1.1 或更高版本中可用。要动态检查可用性,请检查原子 eddsa
是否出现在 crypto:supports(public_keys) 返回的列表中。
实现了对 ed25519 和 ed448 曲线的支持。可以通过检查 crypto:supports(curves) 返回的列表来检查实际支持的命名曲线。
Diffie-Hellman
如果未被配置禁用,则 Diffie-Hellman 计算在与 Erlang CRYPTO 兼容的 OpenSSL 版本中可用。要动态检查可用性,请检查原子 dh
是否出现在 crypto:supports(public_keys) 返回的列表中。
椭圆曲线 Diffie-Hellman
如果未被配置禁用,则椭圆曲线 Diffie-Hellman 可在 OpenSSL 0.9.8o 或更高版本中使用。要动态检查可用性,请检查原子 ecdh
是否出现在 crypto:supports(public_keys) 返回的列表中。
如果未被配置禁用,则 Edward 曲线 x25519
和 x448
在 OpenSSL 1.1.1 或更高版本中受支持。
可以通过检查 crypto:supports(curves) 返回的列表来检查实际支持的命名曲线。