查看源代码 crypto (crypto v5.5.2)
加密函数
此模块提供一组加密函数。
哈希函数 -
SHA1, SHA2 - 安全哈希标准 (FIPS PUB180-4)
BLAKE2 - BLAKE2 — 快速安全哈希
MD5 - MD5 消息摘要算法 (RFC 1321)
MD4 - MD4 消息摘要算法 (RFC 1320)
MAC - 消息认证码 -
Hmac 函数 - 消息认证的密钥哈希 (RFC 2104)
Cmac 函数 - AES-CMAC 算法 (RFC 4493)
POLY1305 - IETF 协议的 ChaCha20 和 Poly1305 (RFC 7539)
对称密码 -
DES、3DES 和 AES - 分组密码技术 (NIST)
Blowfish - 快速软件加密,剑桥安全研讨会论文集 (1993 年 12 月),施普林格出版社,1994 年,第 191-204 页。
Chacha20 - IETF 协议的 ChaCha20 和 Poly1305 (RFC 7539)
Chacha20_poly1305 - IETF 协议的 ChaCha20 和 Poly1305 (RFC 7539)
SM4 - SM4 分组密码算法
模式 -
ECB、CBC、CFB、OFB 和 CTR - 分组密码操作模式建议:方法和技术 (NIST SP 800-38A)
非对称密码 - 公钥技术 -
ECDSA - 椭圆曲线数字签名算法 (ECDSA)
注意
实际支持的算法和功能取决于实际使用的 libcrypto 中的可用性。请参阅有关依赖项的 crypto (应用程序)。
启用 FIPS 模式也会禁用算法和功能。
CRYPTO 用户指南 有关 FIPS、引擎和算法详细信息(如密钥长度)的更多信息。
异常
原子 - 旧式
异常 error:badarg
表示一个或多个参数的数据类型错误或格式错误。
异常 error:notsup
表示该算法已知,但当前底层 libcrypto 不支持,或者在构建时被显式禁用。
有关支持的算法列表,请参阅 supports(ciphers)。
三元组 - 新式
异常是
error:{Tag, C_FileInfo, Description}
Tag = badarg | notsup | error
C_FileInfo = term() % Usually only useful for the OTP maintainer
Description = string() % Clear text, sometimes only useful for the OTP maintainer
异常标签是
badarg
- 表示一个或多个参数的数据类型错误或格式错误。notsup
- 表示该算法已知,但当前底层 libcrypto 不支持,或者在构建时被显式禁用。error
- 不应发生的错误情况,例如内存分配失败或底层加密库返回错误代码,例如“无法初始化上下文,步骤 1”
。这些文本通常需要搜索 C 代码才能理解。
通常,调用堆栈中会有更多关于哪个参数导致异常以及值的信息。
要捕获异常,请使用例如
try crypto:crypto_init(Ciph, Key, IV, true)
catch
error:{Tag, _C_FileInfo, Description} ->
do_something(......)
.....
end
摘要
类型:密码
CRYPTO 应用程序已知的密码。
选择加密 ({encrypt,true}
) 或解密 ({encrypt,false}
)。
cryptolib_padding
是可能存在于链接到 Erlang/OTP crypto 应用程序的底层加密库中的填充。
Erlang/OTP 添加零填充或使用随机字节填充。
此选项处理最后一个块中的填充。如果未设置,则不进行填充,并且最后一个未填充块中的任何字节都会被静默丢弃。
类型:公钥/私钥
dss_public() = [P, Q, G, Y]
其中 P、Q 和 G 是 dss 参数,Y 是公钥。
rsa_public() = [E, N]
rsa_private() = [E, N, D] | [E, N, D, P1, P2, E1, E2, C]
其中 E 是公钥指数,N 是公钥模数,D 是私钥指数。较长的密钥格式包含冗余信息,这会使计算更快。P1 和 P2 是第一和第二素因子。E1 和 E2 是第一和第二指数。C 是 CRT 系数。术语取自 RFC 3447。
等效于 rsa_params()
。
其中验证器是 v
,生成器是 g
,素数是 N
,派生密钥是 X
,扰码器是 u
(如果未提供,则可选,将生成)来自 SRP 设计 版本 = '3' | '6' | '6a'
srp_public() = key_integer()
其中来自 SRP 设计 的 A
或 B
。
类型:引擎类型
engine_load/3 和 /4 的前置和后置命令。
调用 engine_load/3
的结果。
标识要使用的密钥。格式取决于加载的引擎。它被传递到 libcrypto 中的 ENGINE_load_(private|public)_key
函数。
存储在引擎中的密钥的密码。
密码 API
完成流式加密或解密操作,并传递最后一个块的最后一个字节。
返回有关 crypto_state/0
的信息。
初始化流式加密或解密操作的状态。
初始化流式加密或解密操作的状态。
执行全文的完整加密或解密。
执行全文的完整加密或解密。
使用 AEAD 密码对全文执行完整的加密或解密。
向流式加密或解密操作添加数据。
MAC API
计算 poly1305
MAC(消息认证码)。
计算 MAC(消息认证码)。
完成流式 MAC 操作。
使用自定义长度完成 MAC 操作。
初始化流式 poly1305
MAC 计算的状态。
初始化流式 MAC 计算的状态。
向流式 MAC 计算添加数据。
计算具有有限长度的 poly1305
MAC(消息认证码)。
计算具有有限长度的 MAC(消息认证码)。
密钥 API
从私钥和对方的公钥计算共享密钥。
随机 API
为随机数生成创建一个状态对象,以便生成密码学上强大的随机数(基于 OpenSSL 的 BN_rand_range
)。
将 PRNG 的种子设置为给定的二进制数据。
为随机数生成创建一个状态对象,以便生成密码学上强大的随机数。
为随机数生成创建一个状态对象,以便生成密码学上不可预测的随机数。
为随机数生成创建一个状态对象,以便生成密码学上非常强大的随机数。
为随机数生成创建一个状态对象,以便生成密码学上不可预测的随机数。
为随机数生成创建一个状态对象,以便生成密码学上强大的随机数(基于 OpenSSL 的 BN_rand_range
)。另请参阅 rand:seed_s/1
。
生成一个随机整数。
生成具有随机均匀值 0..255 的字节。
实用函数
将整数的二进制表示转换为 Erlang 整数。
获取有关密码算法的信息。
返回椭圆曲线的定义参数。
返回所有支持的命名椭圆曲线。
启用或禁用 FIPS 模式。
对提供的数据执行按位 XOR(异或)运算。
以恒定时间比较两个二进制数据,例如 HMAC 计算的结果。
获取有关哈希算法的信息。
获取有关 crypto 和 OpenSSL 后端的信息。
获取有关 FIPS 运行状态的信息。
获取 crypto 使用的库的名称和版本。
计算函数 N^P mod M
。
获取底层 libcrypto 库支持的加密算法。
引擎 API
将引擎添加到 OpenSSL 的内部列表中。
获取对已加载的具有 EngineId
的引擎的引用。如果无法卸载引擎,则返回错误元组。
向 OpenSSL 引擎发送 ctrl 命令。
向 OpenSSL 引擎发送 ctrl 命令。
返回所有可能的引擎方法的列表。
返回引擎的 ID,如果未设置 ID,则返回空二进制数据。
返回引擎的名称(例如描述),如果未设置名称,则返回空二进制数据。
列出 OpenSSL 内部列表中所有引擎的 ID。
加载 OpenSSL 引擎。
注册引擎以处理某些类型的方法,例如 engine_method_digests。
从 OpenSSL 的内部列表中删除引擎。
卸载 OpenSSL 引擎。
取消注册引擎,使其不处理某些类型的方法。
如果尚未完成,则加载动态引擎。
PKCS #5 PBKDF2(基于密码的密钥派生函数 2)与 HMAC 结合使用。
从存储在引擎中的私钥获取公钥。
类型:密码
-type cipher() :: cipher_no_iv() | cipher_iv() | cipher_aead().
-type cipher_aead() ::
aes_128_ccm | aes_192_ccm | aes_256_ccm | aes_ccm | aes_128_gcm | aes_192_gcm | aes_256_gcm |
aes_gcm | sm4_gcm | sm4_ccm | chacha20_poly1305.
CRYPTO 应用程序已知的密码。
请注意,如果底层 libcrypto 不支持所有这些密码,则此列表可能会减少。
-type cipher_iv() ::
aes_128_cbc | aes_192_cbc | aes_256_cbc | aes_cbc | aes_128_ofb | aes_192_ofb | aes_256_ofb |
aes_128_cfb128 | aes_192_cfb128 | aes_256_cfb128 | aes_cfb128 | aes_128_cfb8 | aes_192_cfb8 |
aes_256_cfb8 | aes_cfb8 | aes_128_ctr | aes_192_ctr | aes_256_ctr | aes_ctr | sm4_cbc |
sm4_ofb | sm4_cfb | sm4_ctr | blowfish_cbc | blowfish_cfb64 | blowfish_ofb64 | chacha20 |
des_ede3_cbc | des_ede3_cfb | des_cbc | des_cfb | rc2_cbc.
-type cipher_no_iv() ::
aes_128_ecb | aes_192_ecb | aes_256_ecb | aes_ecb | blowfish_ecb | des_ecb | sm4_ecb | rc4.
选择加密 ({encrypt,true}
) 或解密 ({encrypt,false}
)。
-type crypto_opts() :: boolean() | [crypto_opt()].
等效于 crypto_opt()
。
-type cryptolib_padding() :: none | pkcs_padding.
cryptolib_padding
是可能存在于链接到 Erlang/OTP crypto 应用程序的底层加密库中的填充。
有关 OpenSSL,请参阅OpenSSL 文档。并在 cryptolib 中查找与您链接的版本相对应的 EVP_CIPHER_CTX_set_padding()
。
-type otp_padding() :: zero | random.
Erlang/OTP 添加零填充或使用随机字节填充。
-type padding() :: cryptolib_padding() | otp_padding().
此选项处理最后一个块中的填充。如果未设置,则不进行填充,并且最后一个未填充块中的任何字节都会被静默丢弃。
类型:摘要和哈希
-type blake2() :: blake2b | blake2s.
-type cmac_cipher_algorithm() ::
aes_128_cbc | aes_192_cbc | aes_256_cbc | aes_cbc | blowfish_cbc | des_cbc | des_ede3_cbc |
rc2_cbc.
-type compatibility_only_hash() :: md5 | md4.
compatibility_only_hash/0
算法仅建议用于与现有应用程序兼容。
-type hash_xof_algorithm() :: sha3_xof().
-type hmac_hash_algorithm() :: sha1() | sha2() | sha3() | sm3 | compatibility_only_hash().
-type sha1() :: sha.
等效于 blake2()
。
-type sha2() :: sha224 | sha256 | sha384 | sha512.
等效于 blake2()
。
-type sha3() :: sha3_224 | sha3_256 | sha3_384 | sha3_512.
等效于 blake2()
。
-type sha3_xof() :: shake128 | shake256.
等效于 blake2()
。
类型:椭圆曲线
-type ec_basis() :: {tpbasis, K :: non_neg_integer()} | {ppbasis, K1 :: non_neg_integer(), K2 :: non_neg_integer(), K3 :: non_neg_integer()} | onbasis.
曲线定义详细信息。
-type ec_characteristic_two_field() :: {characteristic_two_field, M :: integer(), Basis :: ec_basis()}.
等效于 ec_basis()
。
参数曲线定义。
-type ec_explicit_curve() :: {Field :: ec_field(), Curve :: ec_curve(), BasePoint :: binary(), Order :: binary(), CoFactor :: none | binary()}.
等效于 ec_curve()
。
-type ec_field() :: ec_prime_field() | ec_characteristic_two_field().
等效于 ec_curve()
。
-type ec_named_curve() ::
brainpoolP160r1 | brainpoolP160t1 | brainpoolP192r1 | brainpoolP192t1 | brainpoolP224r1 |
brainpoolP224t1 | brainpoolP256r1 | brainpoolP256t1 | brainpoolP320r1 | brainpoolP320t1 |
brainpoolP384r1 | brainpoolP384t1 | brainpoolP512r1 | brainpoolP512t1 | c2pnb163v1 |
c2pnb163v2 | c2pnb163v3 | c2pnb176v1 | c2pnb208w1 | c2pnb272w1 | c2pnb304w1 | c2pnb368w1 |
c2tnb191v1 | c2tnb191v2 | c2tnb191v3 | c2tnb239v1 | c2tnb239v2 | c2tnb239v3 | c2tnb359v1 |
c2tnb431r1 | ipsec3 | ipsec4 | prime192v1 | prime192v2 | prime192v3 | prime239v1 |
prime239v2 | prime239v3 | prime256v1 | secp112r1 | secp112r2 | secp128r1 | secp128r2 |
secp160k1 | secp160r1 | secp160r2 | secp192k1 | secp192r1 | secp224k1 | secp224r1 |
secp256k1 | secp256r1 | secp384r1 | secp521r1 | sect113r1 | sect113r2 | sect131r1 |
sect131r2 | sect163k1 | sect163r1 | sect163r2 | sect193r1 | sect193r2 | sect233k1 |
sect233r1 | sect239k1 | sect283k1 | sect283r1 | sect409k1 | sect409r1 | sect571k1 |
sect571r1 | wtls1 | wtls10 | wtls11 | wtls12 | wtls3 | wtls4 | wtls5 | wtls6 | wtls7 | wtls8 |
wtls9.
等效于 edwards_curve_ed()
。
-type ec_prime_field() :: {prime_field, Prime :: integer()}.
等效于 ec_basis()
。
-type edwards_curve_dh() :: x25519 | x448.
等效于 edwards_curve_ed()
。
-type edwards_curve_ed() :: ed25519 | ed448.
请注意,如果启用了 FIPS,则会禁用某些曲线。
类型:密钥
类型:公钥/私钥
-type dss_private() :: [key_integer()].
dss_public() = [P, Q, G, Y]
其中 P、Q 和 G 是 dss 参数,Y 是公钥。
dss_private() = [P, Q, G, X]
其中 P、Q 和 G 是 dss 参数,X 是私钥。
-type dss_public() :: [key_integer()].
等效于 dss_private()
。
-type ecdsa_params() :: ec_named_curve() | ec_explicit_curve().
-type ecdsa_private() :: key_integer().
等效于 ecdsa_params()
。
-type ecdsa_public() :: key_integer().
等效于 ecdsa_params()
。
-type eddsa_params() :: edwards_curve_ed().
-type eddsa_private() :: key_integer().
等效于 eddsa_params()
。
-type eddsa_public() :: key_integer().
等效于 eddsa_params()
。
-type rsa_params() :: {ModulusSizeInBits :: integer(), PublicExponent :: key_integer()}.
rsa_public() = [E, N]
rsa_private() = [E, N, D] | [E, N, D, P1, P2, E1, E2, C]
其中 E 是公钥指数,N 是公钥模数,D 是私钥指数。较长的密钥格式包含冗余信息,这会使计算更快。P1 和 P2 是第一和第二素因子。E1 和 E2 是第一和第二指数。C 是 CRT 系数。术语取自 RFC 3447。
-type rsa_private() :: [key_integer()].
等效于 rsa_params()
。
-type rsa_public() :: [key_integer()].
等效于 rsa_params()
。
-type srp_comp_params() :: {user, srp_user_comp_params()} | {host, srp_host_comp_params()}.
-type srp_gen_params() :: {user, srp_user_gen_params()} | {host, srp_host_gen_params()}.
其中验证器是 v
,生成器是 g
,素数是 N
,派生密钥是 X
,扰码器是 u
(如果未提供,则可选,将生成)来自 SRP 设计 版本 = '3' | '6' | '6a'
-type srp_private() :: key_integer().
srp_public() = key_integer()
其中来自 SRP 设计 的 A
或 B
。
srp_private() = key_integer()
其中是来自 SRP 设计 的 a
或 b
-type srp_public() :: key_integer().
等效于 srp_private()
。
类型:公钥密码
-type pk_encrypt_decrypt_algs() :: rsa.
用于公钥加密/解密的算法。仅支持 RSA。
-type pk_encrypt_decrypt_opts() :: [rsa_opt()] | rsa_compat_opts().
等效于 rsa_padding()
。
-type rsa_compat_opts() :: [{rsa_pad, rsa_padding()}] | rsa_padding().
这些选项形式仅保留用于兼容性,不应在新代码中使用。
-type rsa_opt() :: {rsa_padding, rsa_padding()} | {signature_md, atom()} | {rsa_mgf1_md, sha} | {rsa_oaep_label, binary()} | {rsa_oaep_md, sha}.
等效于 rsa_padding()
。
-type rsa_padding() :: rsa_pkcs1_padding | rsa_pkcs1_oaep_padding | rsa_x931_padding | rsa_no_padding.
用于公钥加密/解密的选项。仅支持 RSA。
警告
RSA 选项是实验性的。
确切的选项集及其语法可能会在没有事先通知的情况下更改。
类型:公钥签名和验证
-type pk_sign_verify_algs() :: rsa | dss | ecdsa | eddsa.
用于签名和验证的算法。
-type pk_sign_verify_opts() :: [rsa_sign_verify_opt()].
-type rsa_sign_verify_opt() :: {rsa_padding, rsa_sign_verify_padding()} | {rsa_pss_saltlen, integer()} | {rsa_mgf1_md, sha2()}.
-type rsa_sign_verify_padding() ::
rsa_pkcs1_padding | rsa_pkcs1_pss_padding | rsa_x931_padding | rsa_no_padding.
用于签名和验证的选项。
警告
RSA 选项是实验性的。
确切的选项集及其语法可能会在没有事先通知的情况下更改。
类型:Diffie-Hellman 密钥和参数
-type dh_params() :: [key_integer()].
dh_params() = [P, G] | [P, G, PrivateKeyBitLength]
-type dh_private() :: key_integer().
-type dh_public() :: key_integer().
等效于 dh_private()
。
-type ecdh_params() :: ec_named_curve() | edwards_curve_dh() | ec_explicit_curve().
-type ecdh_private() :: key_integer().
等效于 ecdh_params()
。
-type ecdh_public() :: key_integer().
等效于 ecdh_params()
。
类型:引擎的类型
-type engine_cmnd() :: {unicode:chardata(), unicode:chardata()}.
engine_load/3 和 /4 的前置和后置命令。
-type engine_key_ref() :: #{engine := engine_ref(), key_id := key_id(), password => password(), term() => term()}.
等效于 engine_ref()
。
-type engine_method_type() ::
engine_method_rsa | engine_method_dsa | engine_method_dh | engine_method_rand |
engine_method_ecdh | engine_method_ecdsa | engine_method_ciphers | engine_method_digests |
engine_method_store | engine_method_pkey_meths | engine_method_pkey_asn1_meths |
engine_method_ec.
-type engine_ref() :: term().
调用 engine_load/3
的结果。
标识要使用的密钥。格式取决于加载的引擎。它被传递到 libcrypto 中的 ENGINE_load_(private|public)_key
函数。
存储在引擎中的密钥的密码。
类型:内部数据类型
-opaque crypto_state()
等效于 mac_state()
。
-opaque hash_state()
等效于 mac_state()
。
-opaque mac_state()
具有不应操作但在函数调用之间传递的内部状态的上下文。
类型
-type rand_cache_seed() :: nonempty_improper_list(non_neg_integer(), binary()).
密码 API
-spec crypto_final(State) -> FinalResult when State :: crypto_state(), FinalResult :: binary().
完成流式加密或解密操作,并传递最后一个块的最后一个字节。
如果在 crypto_init/3
或 crypto_init/4
中未启用填充,则此函数返回的数据可能为空。
使用 3 元组样式 进行错误处理。
-spec crypto_get_data(State) -> Result when State :: crypto_state(), Result :: map().
返回有关 crypto_state/0
的信息。
返回的信息是一个 map,它当前至少包含
size
- 到目前为止加密或解密的字节数。padding_size
- 在调用crypto_final/1
之后,它包含填充的字节数。否则为 0。padding_type
- 在调用crypto_init/3
或crypto_init/4
时提供的填充类型。encrypt
- 如果执行加密,则为true
。否则为false
。
使用 3 元组样式 进行错误处理。
-spec crypto_init(Cipher, Key, FlagOrOptions) -> State when Cipher :: cipher_no_iv(), Key :: iodata(), FlagOrOptions :: crypto_opts() | boolean(), State :: crypto_state().
初始化流式加密或解密操作的状态。
等效于调用 crypto_init(Cipher, Key, <<>>, FlagOrOptions)
。它适用于没有 IV(随机数)的密码。
使用 3 元组样式 进行错误处理。
-spec crypto_init(Cipher, Key, IV, FlagOrOptions) -> State when Cipher :: cipher_iv(), Key :: iodata(), IV :: iodata(), FlagOrOptions :: crypto_opts(), State :: crypto_state().
初始化流式加密或解密操作的状态。
返回的状态应作为参数传递给 crypto_update/2
和 crypto_final/1
,以进行实际的加密或解密。
如果 IV = <<>>
,则不使用 IV。这适用于没有 IV(随机数)的密码。请参阅 crypto_init/3
。
对于加密,将 FlagOrOptions
设置为 true
或 [{encrypt,true}]
。对于解密,将其设置为 false
或 [{encrypt,false}]
。
可以使用选项 {padding,Padding} 启用填充。cryptolib_padding 启用 pkcs_padding
或无填充 (none
)。填充 zero
或 random
用零或随机字节填充最后一个块的最后一部分。如果最后一个块已满,则不会添加任何内容。
在解密中,如果存在,cryptolib_padding 会删除此类填充。otp_padding 不会被删除 - 它必须在其他地方完成。
如果填充为 {padding,none}
或未指定,并且来自所有后续 crypto_updates 的总数据未完全填充最后一个块,则会丢失最后一个数据。 在 {padding,none}
的情况下,会发生错误。 如果未指定填充,则未填充块的字节将被静默丢弃。
实际的填充由 crypto_final/1
执行。
对于块大小,请调用 cipher_info/1
。
使用 3 元组样式 进行错误处理。
请参阅用户指南中的示例。
-spec crypto_one_time(Cipher, Key, Data, FlagOrOptions) -> Result when Cipher :: cipher_no_iv(), Key :: iodata(), Data :: iodata(), FlagOrOptions :: crypto_opts() | boolean(), Result :: binary().
执行全文的完整加密或解密。
与 crypto_one_time/5
相同,但适用于没有 IV 的密码。
使用 3 元组样式 进行错误处理。
-spec crypto_one_time(Cipher, Key, IV, Data, FlagOrOptions) -> Result when Cipher :: cipher_iv(), Key :: iodata(), IV :: iodata(), Data :: iodata(), FlagOrOptions :: crypto_opts() | boolean(), Result :: binary().
执行全文的完整加密或解密。
参数 Data
是要加密或解密的文本。
对于加密,将 FlagOrOptions
设置为 true
。对于解密,将其设置为 false
。有关设置其他选项,请参阅 crypto_init/4
。
使用 3 元组样式 进行错误处理。
请参阅 用户指南中的示例。
crypto_one_time_aead(Cipher, Key, IV, InText, AAD, TagOrTagLength, EncFlag)
查看源代码 (自 OTP 22.0 起)-spec crypto_one_time_aead(Cipher, Key, IV, InText, AAD, TagOrTagLength, EncFlag) -> Result when Cipher :: cipher_aead(), Key :: iodata(), IV :: iodata(), InText :: iodata(), AAD :: iodata(), TagOrTagLength :: EncryptTagLength | DecryptTag, EncryptTagLength :: non_neg_integer(), DecryptTag :: iodata(), EncFlag :: boolean(), Result :: EncryptResult | DecryptResult, EncryptResult :: {OutCryptoText, OutTag}, DecryptResult :: OutPlainText | error, OutCryptoText :: binary(), OutTag :: binary(), OutPlainText :: binary().
使用 AEAD 密码对全文执行完整的加密或解密。
对于加密,将 EncryptFlag
设置为 true
,并将 TagOrTagLength
设置为标签的所需大小(以字节为单位),即标签长度。 如果需要默认长度,可以使用 crypto_one_time_aead/6
形式。
对于解密,将 EncryptFlag
设置为 false
,并将要检查的标签放入参数 TagOrTagLength
中。
附加身份验证数据 (AAD) 是不会被加密的纯文本数据,但会受到真实性保护。 它应通过 AAD
参数提供,但如果不需要,也可以是空的二进制数据 (<<>>
)。 在这种情况下,将执行普通的 AE(身份验证加密)而不是 AEAD(带有关联数据的身份验证加密)。 此函数仅支持可以与 AAD 或不与 AAD 一起使用的密码。
使用 3 元组样式 进行错误处理。
请参阅用户指南中的示例。
-spec crypto_update(State, Data) -> Result when State :: crypto_state(), Data :: iodata(), Result :: binary().
向流式加密或解密操作添加数据。
如果该部分小于完整块的数量,则仅加密或解密完整的块(可能没有),其余字节将保存到下一个 crypto_update
操作。 State
应使用 crypto_init/3
或 crypto_init/4
创建。
使用 3 元组样式 进行错误处理。
请参阅用户指南中的示例。
哈希 API
-spec hash(Type, Data) -> Digest when Type :: hash_algorithm(), Data :: iodata(), Digest :: binary().
计算消息摘要。
参数 Type
是摘要类型,参数 Data
是完整消息。
使用 3 元组样式 进行错误处理。
-spec hash_final(State) -> Digest when State :: hash_state(), Digest :: binary().
完成流式哈希计算。
参数 State
从上次调用 hash_update 返回。Digest
的大小由用于生成它的哈希函数的类型确定。
使用 3 元组样式 进行错误处理。
-spec hash_init(Type) -> State when Type :: hash_algorithm(), State :: hash_state().
初始化流式哈希摘要计算的状态。
参数 Type
确定要使用的摘要。返回的状态应作为参数传递给 hash_update/2
。
使用 3 元组样式 进行错误处理。
-spec hash_update(State, Data) -> NewState when State :: hash_state(), NewState :: hash_state(), Data :: iodata().
向流式摘要计算添加数据。
使用给定长度的 Data
更新摘要。
参数 State
必须由 hash_init 或先前对此函数的调用生成。
返回 NewState
,它必须传递到下次调用 hash_update/2
或 hash_final/1
。
使用 3 元组样式 进行错误处理。
-spec hash_xof(Type, Data, Length) -> Digest when Type :: hash_xof_algorithm(), Data :: iodata(), Length :: non_neg_integer(), Digest :: binary().
为 xof_algorithm
计算消息摘要。
参数 Type
是摘要的类型,Data
是完整文本,Length
是摘要长度(以位为单位)。
使用 3 元组样式 进行错误处理。
如果底层 libcrypto 实现不支持所选的 Type
,则可能引发异常 error:notsup
。
MAC API
-spec mac(Type :: poly1305, Key, Data) -> Mac when Key :: iodata(), Data :: iodata(), Mac :: binary().
计算 poly1305
MAC(消息认证码)。
与 mac(Type, undefined, Key, Data)
相同。
使用 3 元组样式 进行错误处理。
-spec mac(Type, SubType, Key, Data) -> Mac when Type :: hmac | cmac | poly1305, SubType :: hmac_hash_algorithm() | cmac_cipher_algorithm() | undefined, Key :: iodata(), Data :: iodata(), Mac :: binary().
计算 MAC(消息认证码)。
参数 Type
是 MAC 的类型,Data
是完整消息。
SubType
取决于 MAC Type
- 对于
hmac
,它是一种哈希算法,请参阅用户指南中的 算法详细信息。 - 对于
cmac
,它是一种适用于 cmac 的密码,请参阅用户指南中的 算法详细信息。 - 对于
poly1305
,它应设置为undefined
,否则可以使用 mac/2 函数,请参阅用户指南中的 算法详细信息。
Key
是身份验证密钥,其长度取决于 Type
和 SubType
。可以使用 hash_info/1
(hmac
) 和 cipher_info/1
(cmac
) 函数找到密钥长度。对于 poly1305
,密钥长度为 32 字节。请注意,不会检查密钥的加密质量。
Mac
结果将具有默认长度,具体取决于 Type
和 SubType
。 要设置较短的长度,请改用 macN/4
或 macN/5
。 默认长度记录在用户指南中的 算法详细信息中。
使用 3 元组样式 进行错误处理。
完成流式 MAC 操作。
参数 State
是上次调用 mac_update/2
返回的状态。
Mac
结果将具有默认长度,具体取决于 mac_init/2,3 调用中的 Type
和 SubType
。 要设置较短的长度,请改用 mac_finalN/2
。 默认长度记录在用户指南中的 算法详细信息中。
使用 3 元组样式 进行错误处理。
-spec mac_finalN(State, MacLength) -> Mac when State :: mac_state(), MacLength :: pos_integer(), Mac :: binary().
使用自定义长度完成 MAC 操作。
参数 State
是上次调用 mac_update/2
返回的状态。
Mac
将是一个二进制文件,最多包含 MacLength
个字节。 请注意,如果 MacLength
大于底层哈希返回的实际字节数,则返回的哈希将具有较短的长度。
最大 MacLength
在用户指南的算法详情中有说明。
使用 3 元组样式 进行错误处理。
初始化流式 poly1305
MAC 计算的状态。
与 mac_init(Type, undefined, Key)
相同。
使用 3 元组样式 进行错误处理。
-spec mac_init(Type, SubType, Key) -> State when Type :: hmac | cmac | poly1305, SubType :: hmac_hash_algorithm() | cmac_cipher_algorithm() | undefined, Key :: iodata(), State :: mac_state().
初始化流式 MAC 计算的状态。
Type
决定 MAC 操作中使用哪种 MAC 算法。
SubType
取决于 MAC Type
- 对于
hmac
,它是一种哈希算法,请参阅用户指南中的 算法详细信息。 - 对于
cmac
,它是一种适用于 cmac 的密码,请参阅用户指南中的 算法详细信息。 - 对于
poly1305
,它应设置为undefined
,否则可以使用 mac/2 函数,请参阅用户指南中的 算法详细信息。
Key
是身份验证密钥,其长度取决于 Type
和 SubType
。可以使用 hash_info/1
(hmac
) 和 cipher_info/1
(cmac
) 函数找到密钥长度。对于 poly1305
,密钥长度为 32 字节。请注意,不会检查密钥的加密质量。
返回的 State
应在后续对 mac_update/2
的一次或多次调用中使用。MAC 值最终通过调用 mac_final/1
或 mac_finalN/2
返回。
使用 3 元组样式 进行错误处理。
请参阅用户指南中的示例。
-spec mac_update(State0, Data) -> State when Data :: iodata(), State0 :: mac_state(), State :: mac_state().
向流式 MAC 计算添加数据。
使用给定的 Data
更新由 State0
表示的 MAC,Data
可以是任意长度。
State0
是来自 MAC 初始化函数的原始状态值,即 mac_init/2
、mac_init/3
或最后一次调用 mac_update/2
的返回值。函数将 State0
值原封不动地返回,作为对已更改的内部状态的引用。因此,不可能通过重用旧状态来分支数据流。
使用 3 元组样式 进行错误处理。
-spec macN(Type :: poly1305, Key, Data, MacLength) -> Mac when Key :: iodata(), Data :: iodata(), Mac :: binary(), MacLength :: pos_integer().
计算具有有限长度的 poly1305
MAC(消息认证码)。
与 macN(Type, undefined, Key, Data, MacLength)
相同。
使用 3 元组样式 进行错误处理。
-spec macN(Type, SubType, Key, Data, MacLength) -> Mac when Type :: hmac | cmac | poly1305, SubType :: hmac_hash_algorithm() | cmac_cipher_algorithm() | undefined, Key :: iodata(), Data :: iodata(), Mac :: binary(), MacLength :: pos_integer().
计算具有有限长度的 MAC(消息认证码)。
与 mac/3
和 mac/4
的工作方式类似,但 MacLength
将限制结果 Mac
的大小,最大为 MacLength
字节。请注意,如果 MacLength
大于底层哈希返回的实际字节数,则返回的哈希将具有较短的长度。
最大 MacLength
在用户指南的算法详情中有说明。
密钥 API
-spec compute_key(Type, OthersPublicKey, MyPrivateKey, Params) -> SharedSecret when Type :: dh | ecdh | eddh | srp, SharedSecret :: binary(), OthersPublicKey :: dh_public() | ecdh_public() | srp_public(), MyPrivateKey :: dh_private() | ecdh_private() | {srp_public(), srp_private()}, Params :: dh_params() | ecdh_params() | srp_comp_params().
从私钥和对方的公钥计算共享密钥。
另请参阅 public_key:compute_key/2
。
使用 3 元组样式 进行错误处理。
-spec generate_key(Type, Params) -> {PublicKey, PrivKeyOut} when Type :: dh | ecdh | eddh | eddsa | rsa | srp, PublicKey :: dh_public() | ecdh_public() | rsa_public() | srp_public(), PrivKeyOut :: dh_private() | ecdh_private() | rsa_private() | {srp_public(), srp_private()}, Params :: dh_params() | ecdh_params() | eddsa_params() | rsa_params() | srp_gen_params().
等同于 generate_key/3
。
-spec generate_key(Type, Params, PrivKeyIn) -> {PublicKey, PrivKeyOut} when Type :: dh | ecdh | eddh | eddsa | rsa | srp, PublicKey :: dh_public() | ecdh_public() | rsa_public() | srp_public(), PrivKeyIn :: undefined | dh_private() | ecdh_private() | rsa_private() | {srp_public(), srp_private()}, PrivKeyOut :: dh_private() | ecdh_private() | rsa_private() | {srp_public(), srp_private()}, Params :: dh_params() | ecdh_params() | eddsa_params() | rsa_params() | srp_comp_params().
生成公钥。
另请参阅 public_key:generate_key/1
。
使用 3 元组样式 进行错误处理。
注意
如果链接的 cryptolib 版本是 OpenSSL 3.0
- 并且
Type
是dh
(diffie-hellman)- 并且参数
P
(在dh_params/0
中)是 MODP 组之一(请参阅 RFC 3526)- 并且可选的
PrivateKeyBitLength
参数(在dh_params/0
中)存在,那么对于 2048、3072、4096、6144 和 8192 的组大小,可选的密钥长度参数必须分别至少为 224、256、302、352 和 400。
签名/验证 API
-spec sign(Algorithm, DigestType, Msg, Key) -> Signature when Algorithm :: pk_sign_verify_algs(), DigestType :: rsa_digest_type() | dss_digest_type() | ecdsa_digest_type() | none, Msg :: iodata() | {digest, iodata()}, Key :: rsa_private() | dss_private() | [ecdsa_private() | ecdsa_params()] | [eddsa_private() | eddsa_params()] | engine_key_ref(), Signature :: binary().
等同于 sign/5
。
-spec sign(Algorithm, DigestType, Msg, Key, Options) -> Signature when Algorithm :: pk_sign_verify_algs(), DigestType :: rsa_digest_type() | dss_digest_type() | ecdsa_digest_type() | none, Msg :: iodata() | {digest, iodata()}, Key :: rsa_private() | dss_private() | [ecdsa_private() | ecdsa_params()] | [eddsa_private() | eddsa_params()] | engine_key_ref(), Options :: pk_sign_verify_opts(), Signature :: binary().
创建数字签名。
msg 可以是要签名的二进制“明文”数据,也可以是“明文”的哈希值,即摘要(纯文本)。
算法 dss
只能与摘要类型 sha
一起使用。
使用 3 元组样式 进行错误处理。
另请参阅 public_key:sign/3
。
-spec verify(Algorithm, DigestType, Msg, Signature, Key) -> Result when Algorithm :: pk_sign_verify_algs(), DigestType :: rsa_digest_type() | dss_digest_type() | ecdsa_digest_type() | none, Msg :: iodata() | {digest, iodata()}, Signature :: binary(), Key :: rsa_public() | dss_public() | [ecdsa_public() | ecdsa_params()] | [eddsa_public() | eddsa_params()] | engine_key_ref(), Result :: boolean().
等同于 verify/6
。
-spec verify(Algorithm, DigestType, Msg, Signature, Key, Options) -> Result when Algorithm :: pk_sign_verify_algs(), DigestType :: rsa_digest_type() | dss_digest_type() | ecdsa_digest_type() | none, Msg :: iodata() | {digest, iodata()}, Signature :: binary(), Key :: rsa_public() | dss_public() | [ecdsa_public() | ecdsa_params()] | [eddsa_public() | eddsa_params()] | engine_key_ref(), Options :: pk_sign_verify_opts(), Result :: boolean().
验证数字签名。
msg 可以是要签名的二进制“明文”数据,也可以是“明文”的哈希值,即摘要(纯文本)。
算法 dss
只能与摘要类型 sha
一起使用。
使用 3 元组样式 进行错误处理。
另请参阅 public_key:verify/4
。
随机 API
-spec rand_seed() -> rand:state().
为随机数生成创建一个状态对象,以便生成密码学上强大的随机数(基于 OpenSSL 的 BN_rand_range
)。
在返回状态之前,也会将其保存在进程字典中。另请参阅 rand:seed/1
和 rand_seed_s/0
。
当使用此函数的状态对象时,如果随机生成器由于缺乏安全的“随机性”而失败,则使用它的 rand
函数可能会引发异常 error:low_entropy
。
示例
_ = crypto:rand_seed(),
_IntegerValue = rand:uniform(42), % [1; 42]
_FloatValue = rand:uniform(). % [0.0; 1.0[
-spec rand_seed(binary()) -> ok.
将 PRNG 的种子设置为给定的二进制数据。
这会调用 openssl 中的 RAND_seed 函数。仅当您运行的系统没有足够的内置“随机性”时才使用此函数。通常,这是在 strong_rand_bytes/1
引发 error:low_entropy
时。
-spec rand_seed_alg(Alg :: atom()) -> {rand:alg_handler(), atom() | rand_cache_seed()}.
为随机数生成创建一个状态对象,以便生成密码学上强大的随机数。
在返回状态之前,也会将其保存在进程字典中。另请参阅 rand:seed/1
和 rand_seed_alg_s/1
。
当使用此函数的状态对象时,如果随机生成器由于缺乏安全的“随机性”而失败,则使用它的 rand
函数可能会引发异常 error:low_entropy
。
示例
_ = crypto:rand_seed_alg(crypto_cache),
_IntegerValue = rand:uniform(42), % [1; 42]
_FloatValue = rand:uniform(). % [0.0; 1.0[
-spec rand_seed_alg(Alg :: atom(), Seed :: term()) -> {rand:alg_handler(), atom() | rand_cache_seed()}.
为随机数生成创建一个状态对象,以便生成密码学上不可预测的随机数。
在返回状态之前,也会将其保存在进程字典中。另请参阅 rand_seed_alg_s/2
。
示例
_ = crypto:rand_seed_alg(crypto_aes, "my seed"),
IntegerValue = rand:uniform(42), % [1; 42]
FloatValue = rand:uniform(), % [0.0; 1.0[
_ = crypto:rand_seed_alg(crypto_aes, "my seed"),
IntegerValue = rand:uniform(42), % Same values
FloatValue = rand:uniform(). % again
-spec rand_seed_alg_s(Alg :: atom()) -> {rand:alg_handler(), atom() | rand_cache_seed()}.
为随机数生成创建一个状态对象,以便生成密码学上非常强大的随机数。
另请参阅 rand:seed_s/1
。
如果 Alg
是 crypto
,则此函数的行为与 rand_seed_s/0
完全相同。
如果 Alg
是 crypto_cache
,则此函数会使用 OpenSSL 的 RAND_bytes
获取随机数据,并使用 56 位的内部字大小对其进行缓存以提高速度,这使得在 64 位机器上的计算速度很快。
当使用此函数的状态对象时,如果随机生成器由于缺乏安全的“随机性”而失败,则使用它的 rand
函数可能会引发异常 error:low_entropy
。
可以使用 crypto app 的配置参数 rand_cache_size
更改缓存大小的默认值。
注意
从此函数返回的状态不能用于获取可重复的随机序列,因为从其他
rand
函数获得的可重复性与加密安全不匹配。事实上,由于随机数据被缓存,如果您尝试,某些数字可能会被重复,但这不可预测。
唯一支持的用法是从这个起始状态生成一个不同的随机序列。
-spec rand_seed_alg_s(Alg :: atom(), Seed :: term()) -> {rand:alg_handler(), atom() | rand_cache_seed()}.
为随机数生成创建一个状态对象,以便生成密码学上不可预测的随机数。
另请参阅 rand_seed_alg/1
。
为了获得较长的周期,rand
模块中的 Xoroshiro928 生成器用作计数器(周期为 2^928 - 1),并且生成器状态通过 AES 加密来创建 58 位伪随机值。
结果应该是在统计上完全不可预测的随机值,因为加扰是加密强的,并且周期长得离谱。但是,由于没有重新密钥计划,因此生成的数字不应被视为加密强度高的。
- 如果您需要加密强度高的随机数,请使用
rand_seed_alg_s/1
,其中Alg =:= crypto
或Alg =:= crypto_cache
。 - 如果您需要能够重复序列,请使用此函数。
- 如果您不需要此函数的统计质量,则
rand
模块中有更快的算法。
感谢所使用的生成器,状态对象支持距离为 2^512 的 rand:jump/0,1
函数。
出于速度原因,数字会批量生成并缓存。可以使用 crypto app 的配置参数 rand_cache_size
更改缓存大小的默认值。
-spec rand_seed_s() -> rand:state().
为随机数生成创建一个状态对象,以便生成密码学上强大的随机数(基于 OpenSSL 的 BN_rand_range
)。另请参阅 rand:seed_s/1
。
当使用此函数的状态对象时,如果随机生成器由于缺乏安全的“随机性”而失败,则使用它的 rand
函数可能会引发异常 error:low_entropy
。
注意
从此函数返回的状态不能用于获取可重复的随机序列,因为从其他
rand
函数获得的可重复性与加密安全不匹配。唯一支持的用法是从这个起始状态生成一个不同的随机序列。
-spec rand_uniform(crypto_integer(), crypto_integer()) -> crypto_integer().
生成一个随机整数。
区间为 From =< N < To
。使用 crypto
库的伪随机数生成器。To
必须大于 From
。
-spec strong_rand_bytes(N :: non_neg_integer()) -> binary().
生成具有随机均匀值 0..255 的字节。
返回一个包含 N
字节的二进制结果。
使用密码学安全的 PRNG,该 PRNG 会被操作系统提供的熵进行播种并定期混合。默认情况下,这是 OpenSSL 中的 RAND_bytes
方法。
如果由于缺乏安全的“随机性”导致随机数生成器失败,可能会引发异常 error:low_entropy
。
实用函数
将整数的二进制表示转换为 Erlang 整数。
-spec cipher_info(Type) -> Result when Type :: cipher(), Result :: #{key_length := integer(), iv_length := integer(), block_size := integer(), mode := CipherModes, type := undefined | integer(), prop_aead := boolean()}, CipherModes :: undefined | cbc_mode | ccm_mode | cfb_mode | ctr_mode | ecb_mode | gcm_mode | ige_mode | ocb_mode | ofb_mode | wrap_mode | xts_mode.
获取有关密码算法的信息。
返回一个映射,其中包含有关块大小、密钥长度、IV 长度、AEAD 支持以及可能与所讨论的密码算法相关的其他属性的信息。
注意
密码
aes_cbc
、aes_cfb8
、aes_cfb128
、aes_ctr
、aes_ecb
、aes_gcm
和aes_ccm
在Type
中没有密钥长度,而例如aes_128_ctr
则有。它们会根据加密和解密函数中提供的密钥长度进行调整。因此,无法在映射中返回有效的密钥长度。始终使用带有显式密钥长度的
Type
。
有关支持的密码算法的列表,请参阅 supports(ciphers)。
-spec ec_curve(CurveName) -> ExplicitCurve when CurveName :: ec_named_curve(), ExplicitCurve :: ec_explicit_curve().
返回椭圆曲线的定义参数。
-spec ec_curves() -> [EllipticCurve] when EllipticCurve :: ec_named_curve() | edwards_curve_dh() | edwards_curve_ed().
返回所有支持的命名椭圆曲线。
启用或禁用 FIPS 模式。
参数 Enable
应该为 true
以启用 FIPS 模式,为 false
以禁用 FIPS 模式。如果操作成功,则返回 true
,否则返回 false
。
请注意,要成功启用 FIPS 模式,必须使用配置选项 --enable-fips
构建 OTP,并且底层 libcrypto 也必须支持 FIPS。
另请参阅 info_fips/0
。
对提供的数据执行按位 XOR(异或)运算。
两个字节序列的长度必须相等。
-spec hash_equals(BinA, BinB) -> Result when BinA :: binary(), BinB :: binary(), Result :: boolean().
以恒定时间比较两个二进制数据,例如 HMAC 计算的结果。
如果二进制文件相同,则返回 true;如果二进制文件长度相同但不相同,则返回 false。如果二进制文件大小不同,则该函数会引发 error:badarg
异常。
-spec hash_info(Type) -> Result when Type :: hash_algorithm(), Result :: #{size := integer(), block_size := integer(), type := integer()}.
获取有关哈希算法的信息。
返回一个映射,其中包含有关块大小、大小以及可能与所讨论的哈希算法相关的其他属性的信息。
有关支持的哈希算法的列表,请参阅 supports(hashs)。
-spec info() -> #{compile_type := normal | debug | valgrind | asan, cryptolib_version_compiled => string() | undefined, cryptolib_version_linked := string(), link_type := dynamic | static, otp_crypto_version := string()}.
获取有关 crypto 和 OpenSSL 后端的信息。
返回一个映射,其中包含有关加密编译和链接的信息。
示例
1> crypto:info().
#{compile_type => normal,
cryptolib_version_compiled => "OpenSSL 3.0.0 7 sep 2021",
cryptolib_version_linked => "OpenSSL 3.0.0 7 sep 2021",
link_type => dynamic,
otp_crypto_version => "5.0.2"}
2>
映射中可能存在比文档中描述的更多的关联类型。
-spec info_fips() -> not_supported | not_enabled | enabled.
获取有关 FIPS 运行状态的信息。
返回加密和底层 libcrypto 库的 FIPS 运行状态。如果加密是使用 FIPS 支持构建的,则此值可以是 enabled
(在 FIPS 模式下运行时)或 not_enabled
。对于其他构建,此值始终为 not_supported
。
请参阅 enable_fips_mode/1
,了解如何启用 FIPS 模式。
警告
在 FIPS 模式下,所有不符合 FIPS 标准的算法都将被禁用并引发异常
error:notsup
。检查 supports(ciphers),该函数在 FIPS 模式下返回可用算法的受限列表。
-spec info_lib() -> [{Name, VerNum, VerStr}] when Name :: binary(), VerNum :: integer(), VerStr :: binary().
获取 crypto 使用的库的名称和版本。
Name
是库的名称。VerNum
是根据库自身的版本控制方案的数字版本。VerStr
包含该版本的文本变体。
> info_lib().
[{<<"OpenSSL">>,269484095,<<"OpenSSL 1.1.0c 10 Nov 2016"">>}]
注意
从 OTP R16 开始,数字版本 表示编译加密时使用的 OpenSSL 头文件 (
openssl/opensslv.h
) 的版本。文本变体表示运行时使用的 libcrypto 库。在早期的 OTP 版本中,数字和文本都取自库。
-spec mod_pow(N, P, M) -> Result when N :: binary() | integer(), P :: binary() | integer(), M :: binary() | integer(), Result :: binary() | error.
计算函数 N^P mod M
。
-spec start() -> ok | {error, Reason :: term()}.
请改用 application:start(crypto)
。
警告
如果要启用 FIPS 模式,此函数将不起作用。即使配置参数
fips_mode
设置为true
,FIPS 模式也将被禁用。请改用application:start(crypto)
。
-spec stop() -> ok | {error, Reason :: term()}.
-spec supports(Type) -> Support when Type :: hashs | ciphers | public_keys | macs | curves | rsa_opts, Support :: Hashs | Ciphers | PKs | Macs | Curves | RSAopts, Hashs :: [sha1() | sha2() | sha3() | sha3_xof() | blake2() | ripemd160 | compatibility_only_hash()], Ciphers :: [cipher()], PKs :: [rsa | dss | ecdsa | dh | ecdh | eddh | ec_gf2m], Macs :: [hmac | cmac | poly1305], Curves :: [ec_named_curve() | edwards_curve_dh() | edwards_curve_ed()], RSAopts :: [rsa_sign_verify_opt() | rsa_opt()].
获取底层 libcrypto 库支持的加密算法。
有关哈希和密码算法的信息,请参阅 hash_info/1
和 cipher_info/1
。
引擎 API
-spec engine_add(Engine) -> Result when Engine :: engine_ref(), Result :: ok | {error, Reason :: term()}.
将引擎添加到 OpenSSL 的内部列表中。
如果参数格式错误,该函数会引发 error:badarg
。如果底层 OpenSSL 实现中没有引擎支持,它也可能引发异常 error:notsup
。
-spec engine_by_id(EngineId) -> Result when EngineId :: unicode:chardata(), Result :: {ok, Engine :: engine_ref()} | {error, Reason :: term()}.
获取对已加载的具有 EngineId
的引擎的引用。如果无法卸载引擎,则返回错误元组。
如果参数格式错误,该函数会引发 error:badarg
。如果底层 OpenSSL 实现中没有引擎支持,它也可能引发异常 error:notsup
。
另请参阅用户指南中的 引擎加载 一章。
-spec engine_ctrl_cmd_string(Engine, CmdName, CmdArg) -> Result when Engine :: term(), CmdName :: unicode:chardata(), CmdArg :: unicode:chardata(), Result :: ok | {error, Reason :: term()}.
向 OpenSSL 引擎发送 ctrl 命令。
此函数与调用 engine_ctrl_cmd_string/4
且将 Optional
设置为 false
相同。
如果参数格式错误,该函数会引发 error:badarg
。如果底层 OpenSSL 实现中没有引擎支持,它也可能引发异常 error:notsup
。
-spec engine_ctrl_cmd_string(Engine, CmdName, CmdArg, Optional) -> Result when Engine :: term(), CmdName :: unicode:chardata(), CmdArg :: unicode:chardata(), Optional :: boolean(), Result :: ok | {error, Reason :: term()}.
向 OpenSSL 引擎发送 ctrl 命令。
Optional
是一个布尔参数,可以放宽函数的语义。如果设置为 true
,则仅当 ENGINE 支持给定的命令名称但在执行时失败时才会返回失败;如果 ENGINE 不支持命令名称,它将仅返回成功而不执行任何操作。在这种情况下,我们假设用户仅提供特定于给定 ENGINE 的命令,因此我们将此设置为 false
。
如果参数格式错误,该函数会引发 error:badarg
。如果底层 OpenSSL 实现中没有引擎支持,它也可能引发异常 error:notsup
。
-spec engine_get_all_methods() -> Result when Result :: [engine_method_type()].
返回所有可能的引擎方法的列表。
如果底层 OpenSSL 实现中没有引擎支持,可能会引发异常 error:notsup
。
另请参阅用户指南中的 引擎加载 一章。
-spec engine_get_id(Engine) -> EngineId when Engine :: engine_ref(), EngineId :: unicode:chardata().
返回引擎的 ID,如果未设置 ID,则返回空二进制数据。
如果参数格式错误,该函数会引发 error:badarg
。如果底层 OpenSSL 实现中没有引擎支持,它也可能引发异常 error:notsup
。
-spec engine_get_name(Engine) -> EngineName when Engine :: engine_ref(), EngineName :: unicode:chardata().
返回引擎的名称(例如描述),如果未设置名称,则返回空二进制数据。
如果参数格式错误,该函数会引发 error:badarg
。如果底层 OpenSSL 实现中没有引擎支持,它也可能引发异常 error:notsup
。
-spec engine_list() -> Result when Result :: [EngineId :: unicode:chardata()].
列出 OpenSSL 内部列表中所有引擎的 ID。
如果底层 OpenSSL 实现中没有引擎支持,它也可能引发异常 error:notsup
。
另请参阅用户指南中的 引擎加载 一章。
如果底层 OpenSSL 实现不支持引擎功能,可能会引发异常 error:notsup
。
-spec engine_load(EngineId, PreCmds, PostCmds) -> Result when EngineId :: unicode:chardata(), PreCmds :: [engine_cmnd()], PostCmds :: [engine_cmnd()], Result :: {ok, Engine :: engine_ref()} | {error, Reason :: term()}.
加载 OpenSSL 引擎。
如果可用,则加载 EngineId
给定的 OpenSSL 引擎并对其进行初始化。返回 ok
和引擎句柄,或者如果无法加载引擎,则返回错误元组。
如果参数格式错误,该函数会引发 error:badarg
。如果底层 OpenSSL 实现中没有引擎支持,它也可能引发异常 error:notsup
。
另请参阅用户指南中的 引擎加载 一章。
-spec engine_register(Engine, EngineMethods) -> Result when Engine :: engine_ref(), EngineMethods :: [engine_method_type()], Result :: ok | {error, Reason :: term()}.
注册引擎以处理某些类型的方法,例如 engine_method_digests。
如果参数格式错误,该函数会引发 error:badarg
。如果底层 OpenSSL 实现中没有引擎支持,它也可能引发异常 error:notsup
。
-spec engine_remove(Engine) -> Result when Engine :: engine_ref(), Result :: ok | {error, Reason :: term()}.
从 OpenSSL 的内部列表中删除引擎。
如果参数格式错误,该函数会引发 error:badarg
。如果底层 OpenSSL 实现中没有引擎支持,它也可能引发异常 error:notsup
。
-spec engine_unload(Engine) -> Result when Engine :: engine_ref(), Result :: ok | {error, Reason :: term()}.
卸载 OpenSSL 引擎。
卸载由 Engine
给定的 OpenSSL 引擎。如果无法卸载引擎,则返回错误元组。
如果参数格式错误,该函数会引发 error:badarg
。如果底层 OpenSSL 实现中没有引擎支持,它也可能引发异常 error:notsup
。
另请参阅用户指南中的 引擎加载 一章。
-spec engine_unregister(Engine, EngineMethods) -> Result when Engine :: engine_ref(), EngineMethods :: [engine_method_type()], Result :: ok | {error, Reason :: term()}.
取消注册引擎,使其不处理某些类型的方法。
如果参数格式错误,该函数会引发 error:badarg
。如果底层 OpenSSL 实现中没有引擎支持,它也可能引发异常 error:notsup
。
-spec ensure_engine_loaded(EngineId, LibPath) -> Result when EngineId :: unicode:chardata(), LibPath :: unicode:chardata(), Result :: {ok, Engine :: engine_ref()} | {error, Reason :: term()}.
如果尚未完成,则加载动态引擎。
加载由 EngineId
和实现引擎的动态库路径给定的引擎。如果无法加载引擎,则返回错误元组。
此函数与普通的 engine_load 的不同之处在于,它还会将引擎 ID 添加到 OpenSSL 的内部引擎列表中。第一次调用和后续调用之间的区别在于,第一次调用会加载动态引擎,而后续调用则从 OpenSSL 的引擎列表中获取它。返回的所有引用都是相等的。
使用 engine_unload/1
函数删除引用。但请记住,engine_unload/1
仅删除对引擎的引用,而不删除 OpenSSL 引擎列表中的标签。这必须在使用 engine_remove/1
函数时(仅调用一次,从您获得的任何引用中调用)完成。
如果参数格式错误,该函数会引发 error:badarg
。如果底层 OpenSSL 实现中没有引擎支持,它也可能引发异常 error:notsup
。
另请参阅用户指南中的 引擎加载 一章。
-spec pbkdf2_hmac(Digest, Pass, Salt, Iter, KeyLen) -> Result when Digest :: sha | sha224 | sha256 | sha384 | sha512, Pass :: binary(), Salt :: binary(), Iter :: pos_integer(), KeyLen :: pos_integer(), Result :: binary().
PKCS #5 PBKDF2(基于密码的密钥派生函数 2)与 HMAC 结合使用。
使用 3 元组样式 进行错误处理。
-spec privkey_to_pubkey(Type, EnginePrivateKeyRef) -> PublicKey when Type :: rsa | dss, EnginePrivateKeyRef :: engine_key_ref(), PublicKey :: rsa_public() | dss_public().
从存储在引擎中的私钥获取公钥。
密钥的类型必须与 Type 参数指定的类型一致。
旧版 RSA 加密 API
-spec private_decrypt(Algorithm, CipherText, PrivateKey, Options) -> PlainText when Algorithm :: pk_encrypt_decrypt_algs(), CipherText :: binary(), PrivateKey :: rsa_private() | engine_key_ref(), Options :: pk_encrypt_decrypt_opts(), PlainText :: binary().
使用私钥解密。
使用 PrivateKey
解密使用 public_encrypt/4
(或等效函数)加密的 CipherText
,并返回明文(消息摘要)。这是一个低级别的签名验证操作,例如,由旧版本的 SSL 协议使用。另请参阅 public_key:decrypt_private/2,3
使用 3 元组样式 进行错误处理。
警告
这是一个旧版函数,出于安全原因,请勿将其与 rsa_pkcs1_padding 一起使用。
-spec private_encrypt(Algorithm, PlainText, PrivateKey, Options) -> CipherText when Algorithm :: pk_encrypt_decrypt_algs(), PlainText :: binary(), PrivateKey :: rsa_private() | engine_key_ref(), Options :: pk_encrypt_decrypt_opts(), CipherText :: binary().
使用私钥加密。
使用 PrivateKey
加密 PlainText
,并返回密文。这是一个低级别的签名操作,例如,由旧版本的 SSL 协议使用。另请参阅 public_key:encrypt_private/2,3
使用 3 元组样式 进行错误处理。
使用私钥进行公钥解密。另请参阅 crypto:private_decrypt/4
警告
这是一个旧版函数,出于安全原因,请勿将其与 rsa_pkcs1_padding 一起使用。对于数字签名,建议使用
sign/4
和verify/5
的组合。
-spec public_decrypt(Algorithm, CipherText, PublicKey, Options) -> PlainText when Algorithm :: pk_encrypt_decrypt_algs(), CipherText :: binary(), PublicKey :: rsa_public() | engine_key_ref(), Options :: pk_encrypt_decrypt_opts(), PlainText :: binary().
使用公钥解密。
使用 PublicKey
解密使用 private_encrypt/4
(或等效函数)加密的 CipherText
,并返回明文(消息摘要)。这是一个低级别的签名验证操作,例如,由旧版本的 SSL 协议使用。另请参阅 public_key:decrypt_public/2,3
使用 3 元组样式 进行错误处理。
警告
这是一个旧版函数,出于安全原因,请勿将其与 rsa_pkcs1_padding 一起使用。对于数字签名,建议使用
verify/5
和sign/4
的组合。
-spec public_encrypt(Algorithm, PlainText, PublicKey, Options) -> CipherText when Algorithm :: pk_encrypt_decrypt_algs(), PlainText :: binary(), PublicKey :: rsa_public() | engine_key_ref(), Options :: pk_encrypt_decrypt_opts(), CipherText :: binary().
使用公钥加密。
使用 PublicKey
加密 PlainText
(消息摘要),并返回 CipherText
。这是一个低级别的签名操作,例如,由旧版本的 SSL 协议使用。另请参阅 public_key:encrypt_public/2,3
使用 3 元组样式 进行错误处理。
警告
这是一个旧版函数,出于安全原因,请勿将其与 rsa_pkcs1_padding 一起使用。