檢視原始碼 演算法細節
本章描述 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 加密方式
訊息驗證碼 (MACs)
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 |
表格: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
如果未被組態停用,則 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 |
SM3 | sm3 | ≥1.1.1 |
MD4 | md4 | |
MD5 | md5 | |
RIPEMD | ripemd160 |
公開金鑰加密
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)傳回的清單中。
如果未被組態停用,則 OpenSSL 1.1.1 或更新版本支援 Edward 曲線 x25519
和 x448
。
實際支援的具名曲線可以透過檢查crypto:supports(curves)傳回的清單來檢查。