查看源代码 算法细节

本章描述 crypto 应用程序中算法的细节。

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

密码

密码新 API 中被分类为 cipher_no_iv()cipher_iv()cipher_aead()。IV 是初始化向量的缩写,AEAD 是带有关联数据的身份验证加密的缩写。

由于不规则的命名约定,旧 API 中的某些密码名称在新 API 中被新名称替代。有关已弃用名称的列表,请参阅已弃用的密码名称

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

无 IV 的密码 - cipher_no_iv()

与以下函数一起使用

密码如下:

密码和模式密钥长度 [字节]块大小 [字节]
aes_128_ecb1616
aes_192_ecb2416
aes_256_ecb3216
blowfish_ecb168
des_ecb88
rc4161
sm4_ecb1616

表格:无 IV 的密码

带有 IV 的密码 - cipher_iv()

与以下函数一起使用

密码如下:

密码和模式密钥长度 [字节]IV 长度 [字节]块大小 [字节]限制于 OpenSSL 版本
aes_128_cbc161616
aes_192_cbc241616
aes_256_cbc321616
aes_128_cfb816161
aes_192_cfb824161
aes_256_cfb832161
aes_128_cfb12816161
aes_192_cfb12824161
aes_256_cfb12832161
aes_128_ctr16161
aes_192_ctr24161
aes_256_ctr32161
aes_128_ofb16161
aes_192_ofb24161
aes_256_ofb32161
blowfish_cbc1688
blowfish_cfb641681
blowfish_ofb641681
chacha2032161≥1.1.0d
des_cbc888
des_ede3_cbc2488
des_cfb881
des_ede3_cfb2481
rc2_cbc1688
sm4_cbc161616≥1.1.1
sm4_cfb161616≥1.1.1
sm4_ofb161616≥1.1.1
sm4_ctr161616≥1.1.1

表格:带有 IV 的密码

带有 AEAD 的密码 - cipher_aead()

与以下函数一起使用

密码如下:

密码和模式密钥长度 [字节]IV 长度 [字节]AAD 长度 [字节]标签长度 [字节]块大小 [字节]限制于 OpenSSL 版本
aes_128_ccm167-13任意偶数 4-16 默认值:12任意≥1.0.1
aes_192_ccm247-13任意偶数 4-16 默认值:12任意≥1.0.1
aes_256_ccm327-13任意偶数 4-16 默认值:12任意≥1.0.1
aes_128_gcm16≥1任意1-16 默认值:16任意≥1.0.1
aes_192_gcm24≥1任意1-16 默认值:16任意≥1.0.1
aes_256_gcm32≥1任意1-16 默认值:16任意≥1.0.1
chacha20_poly1305321-16任意16任意≥1.1.0
sm4_gcm1612任意16任意≥3.1.0
sm4_ccm1612任意16任意≥3.1.0

表格:AEAD 密码

消息验证码 (MAC)

mac/4相关函数中使用。

CMAC

如果未被配置禁用,则使用以下密码的 CMAC 可在 OpenSSL 1.0.1 或更高版本中使用。

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

密码和模式密钥长度 [字节]最大 Mac 长度 (= 默认长度) [字节]
aes_128_cbc1616
aes_192_cbc2416
aes_256_cbc3216
aes_128_ecb1616
aes_192_ecb2416
aes_256_ecb3216
blowfish_cbc168
blowfish_ecb168
des_cbc88
des_ecb88
des_ede3_cbc248
rc2_cbc168

表格:CMAC 密码密钥长度

HMAC

如果未被配置禁用,则在所有与 Erlang CRYPTO 兼容的 OpenSSL 中可用。

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

哈希最大 Mac 长度 (= 默认长度) [字节]
sha20
sha22428
sha25632
sha38448
sha51264
sha3_22428
sha3_25632
sha3_38448
sha3_51264
shake12864
shake25664
blake2b64
blake2s32
md416
md516
ripemd16020

表格:HMAC 输出大小

POLY1305

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

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

poly1305 mac 需要 32 字节的密钥,默认生成 16 字节的 MAC。

哈希

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

类型名称限制于 OpenSSL 版本
SHA1sha
SHA2sha224、sha256、sha384、sha512
SHA3sha3_224、sha3_256、sha3_384、sha3_512、shake128、shake256≥1.1.1
SM3sm3≥1.1.1
MD4md4
MD5md5
RIPEMDripemd160

公钥密码学

RSA

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

警告

RSA 选项是实验性的。

确切的选项集及其语法可能会在没有事先通知的情况下更改。

选项签名/验证公钥加密 私钥解密私钥加密 公钥解密
{rsa_padding,rsa_x931_padding}xx
{rsa_padding,rsa_pkcs1_padding}xxx
{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. (1) OpenSSL ≤ 1.0.0
  2. (2) OpenSSL ≥ 1.0.1
  3. (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 曲线 x25519x448 在 OpenSSL 1.1.1 或更高版本中受支持。

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