檢視原始碼 演算法細節

本章描述 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 加密方式

訊息驗證碼 (MACs)

用於mac/4相關函式

CMAC

如果未被組態停用,則 OpenSSL 1.0.1 或更新版本提供具有以下加密方式的 CMAC。

若要動態檢查可用性,請檢查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

如果未被組態停用,則 OpenSSL 1.1.1 或更新版本提供 POLY1305。

若要動態檢查可用性,請檢查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

如果未被組態停用,則所有與 Erlang CRYPTO 相容的 OpenSSL 版本均提供 RSA。若要動態檢查可用性,請檢查原子 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

如果未被組態停用,則與 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)傳回的清單中。

如果未被組態停用,則 OpenSSL 1.1.1 或更新版本支援 Edward 曲線 x25519x448

實際支援的具名曲線可以透過檢查crypto:supports(curves)傳回的清單來檢查。