查看源代码 crypto (crypto v5.5.2)

加密函数

此模块提供一组加密函数。

注意

实际支持的算法和功能取决于实际使用的 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 添加零填充或使用随机字节填充。

此选项处理最后一个块中的填充。如果未设置,则不进行填充,并且最后一个未填充块中的任何字节都会被静默丢弃。

类型:椭圆曲线

曲线定义详细信息。

参数曲线定义。

等效于 ec_curve()

请注意,如果启用了 FIPS,则会禁用某些曲线。

类型:密钥

用作返回值时始终为 binary/0

类型:公钥/私钥

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 设计AB

类型:公钥密码

用于公钥加密/解密的算法。仅支持 RSA。

这些选项形式仅保留用于兼容性,不应在新代码中使用。

等效于 rsa_padding()

用于公钥加密/解密的选项。仅支持 RSA。

类型:Diffie-Hellman 密钥和参数

dh_params() = [P, G] | [P, G, PrivateKeyBitLength]

等效于 dh_private()

类型:引擎类型

engine_load/3 和 /4 的前置和后置命令。

调用 engine_load/3 的结果。

标识要使用的密钥。格式取决于加载的引擎。它被传递到 libcrypto 中的 ENGINE_load_(private|public)_key 函数。

存储在引擎中的密钥的密码。

类型:内部数据类型

等效于 mac_state()

具有不应操作但在函数调用之间传递的内部状态的上下文。

密码 API

完成流式加密或解密操作,并传递最后一个块的最后一个字节。

返回有关 crypto_state/0 的信息。

初始化流式加密或解密操作的状态。

初始化流式加密或解密操作的状态。

执行全文的完整加密或解密。

执行全文的完整加密或解密。

使用 AEAD 密码对全文执行完整的加密或解密。

向流式加密或解密操作添加数据。

哈希 API

计算消息摘要。

完成流式哈希计算。

初始化流式哈希摘要计算的状态。

向流式摘要计算添加数据。

xof_algorithm 计算消息摘要。

MAC API

计算 poly1305 MAC(消息认证码)。

计算 MAC(消息认证码)。

完成流式 MAC 操作。

使用自定义长度完成 MAC 操作。

初始化流式 poly1305 MAC 计算的状态。

初始化流式 MAC 计算的状态。

向流式 MAC 计算添加数据。

计算具有有限长度的 poly1305 MAC(消息认证码)。

计算具有有限长度的 MAC(消息认证码)。

随机 API

随机数生成创建一个状态对象,以便生成密码学上强大的随机数(基于 OpenSSL 的 BN_rand_range)。

将 PRNG 的种子设置为给定的二进制数据。

随机数生成创建一个状态对象,以便生成密码学上强大的随机数。

随机数生成创建一个状态对象,以便生成密码学上不可预测的随机数。

随机数生成创建一个状态对象,以便生成密码学上非常强大的随机数。

随机数生成创建一个状态对象,以便生成密码学上不可预测的随机数。

随机数生成创建一个状态对象,以便生成密码学上强大的随机数(基于 OpenSSL 的 BN_rand_range)。另请参阅 rand:seed_s/1

rand_uniform/2 已弃用

生成一个随机整数。

生成具有随机均匀值 0..255 的字节。

实用函数

将整数的二进制表示转换为 Erlang 整数。

获取有关密码算法的信息。

返回椭圆曲线的定义参数。

返回所有支持的命名椭圆曲线。

启用或禁用 FIPS 模式。

对提供的数据执行按位 XOR(异或)运算。

以恒定时间比较两个二进制数据,例如 HMAC 计算的结果。

获取有关哈希算法的信息。

获取有关 crypto 和 OpenSSL 后端的信息。

获取有关 FIPS 运行状态的信息。

获取 crypto 使用的库的名称和版本。

计算函数 N^P mod M

获取底层 libcrypto 库支持的加密算法。

引擎 API

将引擎添加到 OpenSSL 的内部列表中。

获取对已加载的具有 EngineId 的引擎的引用。如果无法卸载引擎,则返回错误元组。

向 OpenSSL 引擎发送 ctrl 命令。

返回所有可能的引擎方法的列表。

返回引擎的 ID,如果未设置 ID,则返回空二进制数据。

返回引擎的名称(例如描述),如果未设置名称,则返回空二进制数据。

列出 OpenSSL 内部列表中所有引擎的 ID。

加载 OpenSSL 引擎。

注册引擎以处理某些类型的方法,例如 engine_method_digests。

从 OpenSSL 的内部列表中删除引擎。

卸载 OpenSSL 引擎。

取消注册引擎,使其不处理某些类型的方法。

如果尚未完成,则加载动态引擎。

PKCS #5 PBKDF2(基于密码的密钥派生函数 2)与 HMAC 结合使用。

从存储在引擎中的私钥获取公钥。

类型:密码

链接到此类型

cipher()

查看源代码 (未导出)
-type cipher() :: cipher_no_iv() | cipher_iv() | cipher_aead().
链接到此类型

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 不支持所有这些密码,则此列表可能会减少。

链接到此类型

cipher_iv()

查看源代码 (未导出)
-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.
链接到此类型

cipher_no_iv()

查看源代码 (未导出)
-type cipher_no_iv() ::
          aes_128_ecb | aes_192_ecb | aes_256_ecb | aes_ecb | blowfish_ecb | des_ecb | sm4_ecb | rc4.
链接到此类型

crypto_opt()

查看源代码 (未导出)
-type crypto_opt() :: {encrypt, boolean()} | {padding, padding()}.

选择加密 ({encrypt,true}) 或解密 ({encrypt,false})。

链接到此类型

crypto_opts()

查看源代码 (未导出)
-type crypto_opts() :: boolean() | [crypto_opt()].

等效于 crypto_opt()

链接到此类型

cryptolib_padding()

查看源代码 (未导出)
-type cryptolib_padding() :: none | pkcs_padding.

cryptolib_padding 是可能存在于链接到 Erlang/OTP crypto 应用程序的底层加密库中的填充。

有关 OpenSSL,请参阅OpenSSL 文档。并在 cryptolib 中查找与您链接的版本相对应的 EVP_CIPHER_CTX_set_padding()

链接到此类型

otp_padding()

查看源代码 (未导出)
-type otp_padding() :: zero | random.

Erlang/OTP 添加零填充或使用随机字节填充。

链接到此类型

padding()

查看源代码 (未导出)
-type padding() :: cryptolib_padding() | otp_padding().

此选项处理最后一个块中的填充。如果未设置,则不进行填充,并且最后一个未填充块中的任何字节都会被静默丢弃。

类型:摘要和哈希

链接到此类型

blake2()

查看源代码 (未导出)
-type blake2() :: blake2b | blake2s.
链接到此类型

cmac_cipher_algorithm()

查看源代码 (未导出)
-type cmac_cipher_algorithm() ::
          aes_128_cbc | aes_192_cbc | aes_256_cbc | aes_cbc | blowfish_cbc | des_cbc | des_ede3_cbc |
          rc2_cbc.
链接到此类型

compatibility_only_hash()

查看源代码 (未导出)
-type compatibility_only_hash() :: md5 | md4.

compatibility_only_hash/0 算法仅建议用于与现有应用程序兼容。

-type dss_digest_type() :: sha1() | sha2().
-type ecdsa_digest_type() :: sha1() | sha2().
链接到此类型

hash_algorithm()

查看源代码 (未导出)
-type hash_algorithm() ::
          sha1() | sha2() | sha3() | sha3_xof() | blake2() | ripemd160 | sm3 | compatibility_only_hash().
链接到此类型

hash_xof_algorithm()

查看源代码 (未导出)
-type hash_xof_algorithm() :: sha3_xof().
链接到此类型

hmac_hash_algorithm()

查看源代码 (未导出)
-type hmac_hash_algorithm() :: sha1() | sha2() | sha3() | sm3 | compatibility_only_hash().
-type rsa_digest_type() :: sha1() | sha2() | md5 | ripemd160.
-type sha1() :: sha.

等效于 blake2()

-type sha2() :: sha224 | sha256 | sha384 | sha512.

等效于 blake2()

-type sha3() :: sha3_224 | sha3_256 | sha3_384 | sha3_512.

等效于 blake2()

链接到此类型

sha3_xof()

查看源代码 (未导出)
-type sha3_xof() :: shake128 | shake256.

等效于 blake2()

类型:椭圆曲线

链接到此类型

ec_basis()

查看源代码 (未导出)
-type ec_basis() ::
          {tpbasis, K :: non_neg_integer()} |
          {ppbasis, K1 :: non_neg_integer(), K2 :: non_neg_integer(), K3 :: non_neg_integer()} |
          onbasis.

曲线定义详细信息。

链接到此类型

ec_characteristic_two_field()

查看源代码 (未导出)
-type ec_characteristic_two_field() :: {characteristic_two_field, M :: integer(), Basis :: ec_basis()}.

等效于 ec_basis()

链接到此类型

ec_curve()

查看源代码 (未导出)
-type ec_curve() :: {A :: binary(), B :: binary(), Seed :: none | binary()}.

参数曲线定义。

链接到此类型

ec_explicit_curve()

查看源代码 (未导出)
-type ec_explicit_curve() ::
          {Field :: ec_field(),
           Curve :: ec_curve(),
           BasePoint :: binary(),
           Order :: binary(),
           CoFactor :: none | binary()}.

等效于 ec_curve()

链接到此类型

ec_field()

查看源代码 (未导出)
-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()

链接到此类型

ec_prime_field()

查看源代码 (未导出)
-type ec_prime_field() :: {prime_field, Prime :: integer()}.

等效于 ec_basis()

链接到此类型

edwards_curve_dh()

查看源代码 (未导出)
-type edwards_curve_dh() :: x25519 | x448.

等效于 edwards_curve_ed()

链接到此类型

edwards_curve_ed()

查看源代码 (未导出)
-type edwards_curve_ed() :: ed25519 | ed448.

请注意,如果启用了 FIPS,则会禁用某些曲线。

类型:密钥

链接到此类型

key_integer()

查看源代码 (未导出)
-type key_integer() :: integer() | binary().

用作返回值时始终为 binary/0

类型:公钥/私钥

链接到此类型

dss_private()

查看源代码 (未导出)
-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 是私钥。

链接到此类型

dss_public()

查看源代码 (未导出)
-type dss_public() :: [key_integer()].

等效于 dss_private()

链接到此类型

ecdsa_params()

查看源代码 (未导出)
-type ecdsa_params() :: ec_named_curve() | ec_explicit_curve().
链接到此类型

ecdsa_private()

查看源代码 (未导出)
-type ecdsa_private() :: key_integer().

等效于 ecdsa_params()

链接到此类型

ecdsa_public()

查看源代码 (未导出)
-type ecdsa_public() :: key_integer().

等效于 ecdsa_params()

链接到此类型

eddsa_params()

查看源代码 (未导出)
-type eddsa_params() :: edwards_curve_ed().
链接到此类型

eddsa_private()

查看源代码 (未导出)
-type eddsa_private() :: key_integer().

等效于 eddsa_params()

链接到此类型

eddsa_public()

查看源代码 (未导出)
-type eddsa_public() :: key_integer().

等效于 eddsa_params()

链接到此类型

rsa_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

链接到此类型

rsa_private()

查看源代码 (未导出)
-type rsa_private() :: [key_integer()].

等效于 rsa_params()

链接到此类型

rsa_public()

查看源代码 (未导出)
-type rsa_public() :: [key_integer()].

等效于 rsa_params()

链接到此类型

srp_comp_params()

查看源代码 (未导出)
-type srp_comp_params() :: {user, srp_user_comp_params()} | {host, srp_host_comp_params()}.

等效于 srp_host_comp_params()

链接到此类型

srp_gen_params()

查看源代码 (未导出)
-type srp_gen_params() :: {user, srp_user_gen_params()} | {host, srp_host_gen_params()}.

等效于 srp_host_comp_params()

链接到此类型

srp_host_comp_params()

查看源代码 (未导出)
-type srp_host_comp_params() :: [binary() | atom()].

其中验证器是 v,生成器是 g,素数是 N,派生密钥是 X,扰码器是 u(如果未提供,则可选,将生成)来自 SRP 设计 版本 = '3' | '6' | '6a'

链接到此类型

srp_host_gen_params()

查看源代码 (未导出)
-type srp_host_gen_params() :: [binary() | atom() | list()].

等效于 srp_host_comp_params()

链接到此类型

srp_private()

查看源代码 (未导出)
-type srp_private() :: key_integer().
srp_public() = key_integer()

其中来自 SRP 设计AB

srp_private() = key_integer()

其中是来自 SRP 设计ab

链接到此类型

srp_public()

查看源代码 (未导出)
-type srp_public() :: key_integer().

等效于 srp_private()

链接到此类型

srp_user_comp_params()

查看源代码 (未导出)
-type srp_user_comp_params() :: [binary() | atom()].

等效于 srp_host_comp_params()

链接到此类型

srp_user_gen_params()

查看源代码 (未导出)
-type srp_user_gen_params() :: [binary() | atom() | list()].

等效于 srp_host_comp_params()

类型:公钥密码

链接到此类型

pk_encrypt_decrypt_algs()

查看源代码 (未导出)
-type pk_encrypt_decrypt_algs() :: rsa.

用于公钥加密/解密的算法。仅支持 RSA。

链接到此类型

pk_encrypt_decrypt_opts()

查看源代码
-type pk_encrypt_decrypt_opts() :: [rsa_opt()] | rsa_compat_opts().

等效于 rsa_padding()

链接到此类型

rsa_compat_opts()

查看源代码 (未导出)
-type rsa_compat_opts() :: [{rsa_pad, rsa_padding()}] | rsa_padding().

这些选项形式仅保留用于兼容性,不应在新代码中使用。

链接到此类型

rsa_opt()

查看源代码 (未导出)
-type rsa_opt() ::
          {rsa_padding, rsa_padding()} |
          {signature_md, atom()} |
          {rsa_mgf1_md, sha} |
          {rsa_oaep_label, binary()} |
          {rsa_oaep_md, sha}.

等效于 rsa_padding()

链接到此类型

rsa_padding()

查看源代码 (未导出)
-type rsa_padding() :: rsa_pkcs1_padding | rsa_pkcs1_oaep_padding | rsa_x931_padding | rsa_no_padding.

用于公钥加密/解密的选项。仅支持 RSA。

警告

RSA 选项是实验性的。

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

类型:公钥签名和验证

链接到此类型

pk_sign_verify_algs()

查看源代码 (未导出)
-type pk_sign_verify_algs() :: rsa | dss | ecdsa | eddsa.

用于签名和验证的算法。

-type pk_sign_verify_opts() :: [rsa_sign_verify_opt()].

等效于 rsa_sign_verify_padding()

链接到此类型

rsa_sign_verify_opt()

查看源代码 (未导出)
-type rsa_sign_verify_opt() ::
          {rsa_padding, rsa_sign_verify_padding()} |
          {rsa_pss_saltlen, integer()} |
          {rsa_mgf1_md, sha2()}.

等效于 rsa_sign_verify_padding()

链接到此类型

rsa_sign_verify_padding()

查看源代码 (未导出)
-type rsa_sign_verify_padding() ::
          rsa_pkcs1_padding | rsa_pkcs1_pss_padding | rsa_x931_padding | rsa_no_padding.

用于签名和验证的选项。

警告

RSA 选项是实验性的。

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

类型:Diffie-Hellman 密钥和参数

链接到此类型

dh_params()

查看源代码 (未导出)
-type dh_params() :: [key_integer()].
dh_params() = [P, G] | [P, G, PrivateKeyBitLength]
-type dh_private() :: key_integer().
-type dh_public() :: key_integer().

等效于 dh_private()

链接到此类型

ecdh_params()

查看源代码 (未导出)
-type ecdh_params() :: ec_named_curve() | edwards_curve_dh() | ec_explicit_curve().
链接到此类型

ecdh_private()

查看源代码 (未导出)
-type ecdh_private() :: key_integer().

等效于 ecdh_params()

链接到此类型

ecdh_public()

查看源代码 (未导出)
-type ecdh_public() :: key_integer().

等效于 ecdh_params()

类型:引擎的类型

链接到此类型

engine_cmnd()

查看源代码 (未导出)
-type engine_cmnd() :: {unicode:chardata(), unicode:chardata()}.

engine_load/3 和 /4 的前置和后置命令。

链接到此类型

engine_key_ref()

查看源代码 (未导出)
-type engine_key_ref() ::
          #{engine := engine_ref(), key_id := key_id(), password => password(), term() => term()}.

等效于 engine_ref()

链接到此类型

engine_method_type()

查看源代码 (未导出)
-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 的结果。

-type key_id() :: string() | binary().

标识要使用的密钥。格式取决于加载的引擎。它被传递到 libcrypto 中的 ENGINE_load_(private|public)_key 函数。

-type password() :: string() | binary().

存储在引擎中的密钥的密码。

类型:内部数据类型

-opaque crypto_state()

等效于 mac_state()

-opaque hash_state()

等效于 mac_state()

-opaque mac_state()

具有不应操作但在函数调用之间传递的内部状态的上下文。

类型

链接到此类型

crypto_integer()

查看源代码 (未导出)
-type crypto_integer() :: binary() | integer().
链接到此类型

rand_cache_seed()

查看源代码 (未导出)
-type rand_cache_seed() :: nonempty_improper_list(non_neg_integer(), binary()).

密码 API

链接到此函数

crypto_final(State)

查看源代码 (自 OTP 23.0 起)
-spec crypto_final(State) -> FinalResult when State :: crypto_state(), FinalResult :: binary().

完成流式加密或解密操作,并传递最后一个块的最后一个字节。

如果在 crypto_init/3crypto_init/4 中未启用填充,则此函数返回的数据可能为空。

使用 3 元组样式 进行错误处理。

链接到此函数

crypto_get_data(State)

查看源代码 (自 OTP 23.0 起)
-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/3crypto_init/4 时提供的填充类型。

  • encrypt - 如果执行加密,则为 true。否则为 false

使用 3 元组样式 进行错误处理。

链接到此函数

crypto_init(Cipher, Key, FlagOrOptions)

查看源代码 (自 OTP 22.0 起)
-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 元组样式 进行错误处理。

链接到此函数

crypto_init(Cipher, Key, IV, FlagOrOptions)

查看源代码 (自 OTP 22.0 起)
-spec crypto_init(Cipher, Key, IV, FlagOrOptions) -> State
                     when
                         Cipher :: cipher_iv(),
                         Key :: iodata(),
                         IV :: iodata(),
                         FlagOrOptions :: crypto_opts(),
                         State :: crypto_state().

初始化流式加密或解密操作的状态。

返回的状态应作为参数传递给 crypto_update/2crypto_final/1,以进行实际的加密或解密。

如果 IV = <<>>,则不使用 IV。这适用于没有 IV(随机数)的密码。请参阅 crypto_init/3

对于加密,将 FlagOrOptions 设置为 true[{encrypt,true}]。对于解密,将其设置为 false[{encrypt,false}]

可以使用选项 {padding,Padding} 启用填充。cryptolib_padding 启用 pkcs_padding 或无填充 (none)。填充 zerorandom 用零或随机字节填充最后一个块的最后一部分。如果最后一个块已满,则不会添加任何内容。

在解密中,如果存在,cryptolib_padding 会删除此类填充。otp_padding 不会被删除 - 它必须在其他地方完成。

如果填充为 {padding,none} 或未指定,并且来自所有后续 crypto_updates 的总数据未完全填充最后一个块,则会丢失最后一个数据。 在 {padding,none} 的情况下,会发生错误。 如果未指定填充,则未填充块的字节将被静默丢弃。

实际的填充由 crypto_final/1 执行。

对于块大小,请调用 cipher_info/1

使用 3 元组样式 进行错误处理。

请参阅用户指南中的示例。

链接到此函数

crypto_one_time(Cipher, Key, Data, FlagOrOptions)

查看源代码 (自 OTP 22.0 起)
-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 元组样式 进行错误处理。

链接到此函数

crypto_one_time(Cipher, Key, IV, Data, FlagOrOptions)

查看源代码 (自 OTP 22.0 起)
-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, EncFlag)

查看源代码 (自 OTP 22.0 起)
-spec crypto_one_time_aead(Cipher, Key, IV, InText, AAD, EncFlag :: true) -> Result
                              when
                                  Cipher :: cipher_aead(),
                                  Key :: iodata(),
                                  IV :: iodata(),
                                  InText :: iodata(),
                                  AAD :: iodata(),
                                  Result :: EncryptResult,
                                  EncryptResult :: {OutCryptoText, OutTag},
                                  OutCryptoText :: binary(),
                                  OutTag :: binary().

等效于 crypto_one_time_aead/7

链接到此函数

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 元组样式 进行错误处理。

请参阅用户指南中的示例。

链接到此函数

crypto_update(State, Data)

查看源代码 (自 OTP 22.0 起)
-spec crypto_update(State, Data) -> Result
                       when State :: crypto_state(), Data :: iodata(), Result :: binary().

向流式加密或解密操作添加数据。

如果该部分小于完整块的数量,则仅加密或解密完整的块(可能没有),其余字节将保存到下一个 crypto_update 操作。 State 应使用 crypto_init/3crypto_init/4 创建。

使用 3 元组样式 进行错误处理。

请参阅用户指南中的示例。

哈希 API

链接到此函数

hash(类型, 数据)

查看源代码 (自 OTP R15B02 起)
-spec hash(Type, Data) -> Digest when Type :: hash_algorithm(), Data :: iodata(), Digest :: binary().

计算消息摘要。

参数 Type 是摘要类型,参数 Data 是完整消息。

使用 3 元组样式 进行错误处理。

链接到此函数

hash_final(状态)

查看源代码 (自 OTP R15B02 起)
-spec hash_final(State) -> Digest when State :: hash_state(), Digest :: binary().

完成流式哈希计算。

参数 State 从上次调用 hash_update 返回。Digest 的大小由用于生成它的哈希函数的类型确定。

使用 3 元组样式 进行错误处理。

链接到此函数

hash_init(类型)

查看源代码 (自 OTP R15B02 起)
-spec hash_init(Type) -> State when Type :: hash_algorithm(), State :: hash_state().

初始化流式哈希摘要计算的状态。

参数 Type 确定要使用的摘要。返回的状态应作为参数传递给 hash_update/2

使用 3 元组样式 进行错误处理。

链接到此函数

hash_update(状态, 数据)

查看源代码 (自 OTP R15B02 起)
-spec hash_update(State, Data) -> NewState
                     when State :: hash_state(), NewState :: hash_state(), Data :: iodata().

向流式摘要计算添加数据。

使用给定长度的 Data 更新摘要。

参数 State 必须由 hash_init 或先前对此函数的调用生成。

返回 NewState,它必须传递到下次调用 hash_update/2hash_final/1

使用 3 元组样式 进行错误处理。

链接到此函数

hash_xof(类型, 数据, 长度)

查看源代码 (自 OTP 26.0 起)
-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

链接到此函数

mac(类型, 密钥, 数据)

查看源代码 (自 OTP 22.1 起)
-spec mac(Type :: poly1305, Key, Data) -> Mac when Key :: iodata(), Data :: iodata(), Mac :: binary().

计算 poly1305 MAC(消息认证码)。

mac(Type, undefined, Key, Data) 相同。

使用 3 元组样式 进行错误处理。

链接到此函数

mac(类型, 子类型, 密钥, 数据)

查看源代码 (自 OTP 22.1 起)
-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 是身份验证密钥,其长度取决于 TypeSubType。可以使用 hash_info/1 (hmac) 和 cipher_info/1 (cmac) 函数找到密钥长度。对于 poly1305,密钥长度为 32 字节。请注意,不会检查密钥的加密质量。

Mac 结果将具有默认长度,具体取决于 TypeSubType。 要设置较短的长度,请改用 macN/4macN/5。 默认长度记录在用户指南中的 算法详细信息中。

使用 3 元组样式 进行错误处理。

链接到此函数

mac_final(状态)

查看源代码 (自 OTP 22.1 起)
-spec mac_final(State) -> Mac when State :: mac_state(), Mac :: binary().

完成流式 MAC 操作。

参数 State 是上次调用 mac_update/2 返回的状态。

Mac 结果将具有默认长度,具体取决于 mac_init/2,3 调用中的 TypeSubType。 要设置较短的长度,请改用 mac_finalN/2。 默认长度记录在用户指南中的 算法详细信息中。

使用 3 元组样式 进行错误处理。

链接到此函数

mac_finalN(状态, Mac长度)

查看源代码 (自 OTP 22.1 起)
-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 元组样式 进行错误处理。

链接到此函数

mac_init(类型, 密钥)

查看源代码 (自 OTP 22.1 起)
-spec mac_init(Type :: poly1305, Key) -> State when Key :: iodata(), State :: mac_state().

初始化流式 poly1305 MAC 计算的状态。

mac_init(Type, undefined, Key) 相同。

使用 3 元组样式 进行错误处理。

链接到此函数

mac_init(类型, 子类型, 密钥)

查看源代码 (自 OTP 22.1 起)
-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 是身份验证密钥,其长度取决于 TypeSubType。可以使用 hash_info/1 (hmac) 和 cipher_info/1 (cmac) 函数找到密钥长度。对于 poly1305,密钥长度为 32 字节。请注意,不会检查密钥的加密质量。

返回的 State 应在后续对 mac_update/2 的一次或多次调用中使用。MAC 值最终通过调用 mac_final/1mac_finalN/2 返回。

使用 3 元组样式 进行错误处理。

请参阅用户指南中的示例。

链接到此函数

mac_update(状态0, 数据)

查看源代码 (自 OTP 22.1 起)
-spec mac_update(State0, Data) -> State
                    when Data :: iodata(), State0 :: mac_state(), State :: mac_state().

向流式 MAC 计算添加数据。

使用给定的 Data 更新由 State0 表示的 MAC,Data 可以是任意长度。

State0 是来自 MAC 初始化函数的原始状态值,即 mac_init/2mac_init/3 或最后一次调用 mac_update/2 的返回值。函数将 State0 值原封不动地返回,作为对已更改的内部状态的引用。因此,不可能通过重用旧状态来分支数据流。

使用 3 元组样式 进行错误处理。

链接到此函数

macN(类型, 密钥, 数据, Mac长度)

查看源代码 (自 OTP 22.1 起)
-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 元组样式 进行错误处理。

链接到此函数

macN(类型, 子类型, 密钥, 数据, Mac长度)

查看源代码 (自 OTP 22.1 起)
-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/3mac/4 的工作方式类似,但 MacLength 将限制结果 Mac 的大小,最大为 MacLength 字节。请注意,如果 MacLength 大于底层哈希返回的实际字节数,则返回的哈希将具有较短的长度。

最大 MacLength 在用户指南的算法详情中有说明。

密钥 API

链接到此函数

compute_key(类型, 对方公钥, 我的私钥, 参数)

查看源代码 (自 OTP R16B01 起)
-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 元组样式 进行错误处理。

链接到此函数

generate_key(类型, 参数)

查看源代码 (自 OTP R16B01 起)
-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

链接到此函数

generate_key(类型, 参数, 私钥输入)

查看源代码 (自 OTP R16B01 起)
-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

  • 并且 Typedh(diffie-hellman)
  • 并且参数 P(在 dh_params/0 中)是 MODP 组之一(请参阅 RFC 3526
  • 并且可选的 PrivateKeyBitLength 参数(在 dh_params/0 中)存在,

那么对于 2048、3072、4096、6144 和 8192 的组大小,可选的密钥长度参数必须分别至少为 224、256、302、352 和 400。

签名/验证 API

链接到此函数

sign(算法, 摘要类型, 消息, 密钥)

查看源代码 (自 OTP R16B01 起)
-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

链接到此函数

sign(算法, 摘要类型, 消息, 密钥, 选项)

查看源代码 (自 OTP 20.1 起)
-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

链接到此函数

verify(算法, 摘要类型, 消息, 签名, 密钥)

查看源代码 (自 OTP R16B01 起)
-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

链接到此函数

verify(算法, 摘要类型, 消息, 签名, 密钥, 选项)

查看源代码 (自 OTP 20.1 起)
-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

链接到此函数

rand_seed()

查看源代码 (自 OTP 20.0 起)
-spec rand_seed() -> rand:state().

随机数生成创建一个状态对象,以便生成密码学上强大的随机数(基于 OpenSSL 的 BN_rand_range)。

在返回状态之前,也会将其保存在进程字典中。另请参阅 rand:seed/1rand_seed_s/0

当使用此函数的状态对象时,如果随机生成器由于缺乏安全的“随机性”而失败,则使用它的 rand 函数可能会引发异常 error:low_entropy

示例

_ = crypto:rand_seed(),
_IntegerValue = rand:uniform(42), % [1; 42]
_FloatValue = rand:uniform().     % [0.0; 1.0[
链接到此函数

rand_seed(种子)

查看源代码 (自 OTP 17.0 起)
-spec rand_seed(binary()) -> ok.

将 PRNG 的种子设置为给定的二进制数据。

这会调用 openssl 中的 RAND_seed 函数。仅当您运行的系统没有足够的内置“随机性”时才使用此函数。通常,这是在 strong_rand_bytes/1 引发 error:low_entropy 时。

链接到此函数

rand_seed_alg(算法)

查看源代码 (自 OTP 21.0 起)
-spec rand_seed_alg(Alg :: atom()) -> {rand:alg_handler(), atom() | rand_cache_seed()}.

随机数生成创建一个状态对象,以便生成密码学上强大的随机数。

在返回状态之前,也会将其保存在进程字典中。另请参阅 rand:seed/1rand_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[
链接到此函数

rand_seed_alg(算法, 种子)

查看源代码 (自 OTP-22.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
链接到此函数

rand_seed_alg_s(算法)

查看源代码 (自 OTP 21.0 起)
-spec rand_seed_alg_s(Alg :: atom()) -> {rand:alg_handler(), atom() | rand_cache_seed()}.

随机数生成创建一个状态对象,以便生成密码学上非常强大的随机数。

另请参阅 rand:seed_s/1

如果 Algcrypto,则此函数的行为与 rand_seed_s/0 完全相同。

如果 Algcrypto_cache,则此函数会使用 OpenSSL 的 RAND_bytes 获取随机数据,并使用 56 位的内部字大小对其进行缓存以提高速度,这使得在 64 位机器上的计算速度很快。

当使用此函数的状态对象时,如果随机生成器由于缺乏安全的“随机性”而失败,则使用它的 rand 函数可能会引发异常 error:low_entropy

可以使用 crypto app 的配置参数 rand_cache_size 更改缓存大小的默认值。

注意

从此函数返回的状态不能用于获取可重复的随机序列,因为从其他 rand 函数获得的可重复性与加密安全不匹配。

事实上,由于随机数据被缓存,如果您尝试,某些数字可能会被重复,但这不可预测。

唯一支持的用法是从这个起始状态生成一个不同的随机序列。

链接到此函数

rand_seed_alg_s(算法, 种子)

查看源代码 (自 OTP 22.0 起)
-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 =:= cryptoAlg =:= crypto_cache
  • 如果您需要能够重复序列,请使用此函数。
  • 如果您不需要此函数的统计质量,则 rand 模块中有更快的算法。

感谢所使用的生成器,状态对象支持距离为 2^512 的 rand:jump/0,1 函数。

出于速度原因,数字会批量生成并缓存。可以使用 crypto app 的配置参数 rand_cache_size 更改缓存大小的默认值。

链接到此函数

rand_seed_s()

查看源代码 (自 OTP 20.0 起)
-spec rand_seed_s() -> rand:state().

随机数生成创建一个状态对象,以便生成密码学上强大的随机数(基于 OpenSSL 的 BN_rand_range)。另请参阅 rand:seed_s/1

当使用此函数的状态对象时,如果随机生成器由于缺乏安全的“随机性”而失败,则使用它的 rand 函数可能会引发异常 error:low_entropy

注意

从此函数返回的状态不能用于获取可重复的随机序列,因为从其他 rand 函数获得的可重复性与加密安全不匹配。

唯一支持的用法是从这个起始状态生成一个不同的随机序列。

此函数已弃用。crypto:rand_uniform/2 已弃用;请改用 rand:uniform/1。
-spec rand_uniform(crypto_integer(), crypto_integer()) -> crypto_integer().

生成一个随机整数。

区间为 From =< N < To。使用 crypto 库的伪随机数生成器。To 必须大于 From

链接到此函数

strong_rand_bytes(N)

查看源码 (自 OTP R14B03 起)
-spec strong_rand_bytes(N :: non_neg_integer()) -> binary().

生成具有随机均匀值 0..255 的字节。

返回一个包含 N 字节的二进制结果。

使用密码学安全的 PRNG,该 PRNG 会被操作系统提供的熵进行播种并定期混合。默认情况下,这是 OpenSSL 中的 RAND_bytes 方法。

如果由于缺乏安全的“随机性”导致随机数生成器失败,可能会引发异常 error:low_entropy

实用函数

链接到此函数

bytes_to_integer(二进制数据)

查看源码 (自 OTP R16B01 起)
-spec bytes_to_integer(binary()) -> integer().

将整数的二进制表示转换为 Erlang 整数。

链接到此函数

cipher_info(类型)

查看源码 (自 OTP 22.0 起)
-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_cbcaes_cfb8aes_cfb128aes_ctraes_ecbaes_gcmaes_ccmType 中没有密钥长度,而例如 aes_128_ctr 则有。它们会根据加密和解密函数中提供的密钥长度进行调整。因此,无法在映射中返回有效的密钥长度。

始终使用带有显式密钥长度的 Type

有关支持的密码算法的列表,请参阅 supports(ciphers)

链接到此函数

ec_curve(曲线名称)

查看源码 (自 OTP 17.0 起)
-spec ec_curve(CurveName) -> ExplicitCurve
                  when CurveName :: ec_named_curve(), ExplicitCurve :: ec_explicit_curve().

返回椭圆曲线的定义参数。

链接到此函数

ec_curves()

查看源码 (自 OTP 17.0 起)
-spec ec_curves() -> [EllipticCurve]
                   when EllipticCurve :: ec_named_curve() | edwards_curve_dh() | edwards_curve_ed().

返回所有支持的命名椭圆曲线。

链接到此函数

enable_fips_mode(启用)

查看源码 (自 OTP 21.1 起)
-spec enable_fips_mode(Enable) -> Result when Enable :: boolean(), Result :: boolean().

启用或禁用 FIPS 模式。

参数 Enable 应该为 true 以启用 FIPS 模式,为 false 以禁用 FIPS 模式。如果操作成功,则返回 true,否则返回 false

请注意,要成功启用 FIPS 模式,必须使用配置选项 --enable-fips 构建 OTP,并且底层 libcrypto 也必须支持 FIPS。

另请参阅 info_fips/0

链接到此函数

exor(二进制数据1, 二进制数据2)

查看源代码
-spec exor(iodata(), iodata()) -> binary().

对提供的数据执行按位 XOR(异或)运算。

两个字节序列的长度必须相等。

链接到此函数

hash_equals(二进制数据A, 二进制数据B)

查看源码 (自 OTP 25.0 起)
-spec hash_equals(BinA, BinB) -> Result when BinA :: binary(), BinB :: binary(), Result :: boolean().

以恒定时间比较两个二进制数据,例如 HMAC 计算的结果。

如果二进制文件相同,则返回 true;如果二进制文件长度相同但不相同,则返回 false。如果二进制文件大小不同,则该函数会引发 error:badarg 异常。

链接到此函数

hash_info(类型)

查看源码 (自 OTP 22.0 起)
-spec hash_info(Type) -> Result
                   when
                       Type :: hash_algorithm(),
                       Result :: #{size := integer(), block_size := integer(), type := integer()}.

获取有关哈希算法的信息。

返回一个映射,其中包含有关块大小、大小以及可能与所讨论的哈希算法相关的其他属性的信息。

有关支持的哈希算法的列表,请参阅 supports(hashs)

链接到此函数

info()

查看源码 (自 OTP 24.2 起)
-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>

映射中可能存在比文档中描述的更多的关联类型。

链接到此函数

info_fips()

查看源码 (自 OTP 20.0 起)
-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 版本中,数字和文本都取自库。

链接到此函数

mod_pow(N, P, M)

查看源码 (自 OTP R16B01 起)
-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()}.

请改用 application:stop(crypto)

链接到此函数

supports(类型)

查看源码 (自 OTP 22.0 起)
-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/1cipher_info/1

引擎 API

链接到此函数

engine_add(引擎)

查看源码 (自 OTP 21.0.6 起)
-spec engine_add(Engine) -> Result when Engine :: engine_ref(), Result :: ok | {error, Reason :: term()}.

将引擎添加到 OpenSSL 的内部列表中。

如果参数格式错误,该函数会引发 error:badarg。如果底层 OpenSSL 实现中没有引擎支持,它也可能引发异常 error:notsup

链接到此函数

engine_by_id(引擎ID)

查看源码 (自 OTP 21.0.6 起)
-spec engine_by_id(EngineId) -> Result
                      when
                          EngineId :: unicode:chardata(),
                          Result :: {ok, Engine :: engine_ref()} | {error, Reason :: term()}.

获取对已加载的具有 EngineId 的引擎的引用。如果无法卸载引擎,则返回错误元组。

如果参数格式错误,该函数会引发 error:badarg。如果底层 OpenSSL 实现中没有引擎支持,它也可能引发异常 error:notsup

另请参阅用户指南中的 引擎加载 一章。

链接到此函数

engine_ctrl_cmd_string(引擎, 命令名称, 命令参数)

查看源码 (自 OTP 20.2 起)
-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

链接到此函数

engine_ctrl_cmd_string(引擎, 命令名称, 命令参数, 可选)

查看源码 (自 OTP 20.2 起)
-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

链接到此函数

engine_get_all_methods()

查看源码 (自 OTP 20.2 起)
-spec engine_get_all_methods() -> Result when Result :: [engine_method_type()].

返回所有可能的引擎方法的列表。

如果底层 OpenSSL 实现中没有引擎支持,可能会引发异常 error:notsup

另请参阅用户指南中的 引擎加载 一章。

链接到此函数

engine_get_id(引擎)

查看源码 (自 OTP 21.0.6 起)
-spec engine_get_id(Engine) -> EngineId when Engine :: engine_ref(), EngineId :: unicode:chardata().

返回引擎的 ID,如果未设置 ID,则返回空二进制数据。

如果参数格式错误,该函数会引发 error:badarg。如果底层 OpenSSL 实现中没有引擎支持,它也可能引发异常 error:notsup

链接到此函数

engine_get_name(引擎)

查看源码 (自 OTP 21.0.6 起)
-spec engine_get_name(Engine) -> EngineName
                         when Engine :: engine_ref(), EngineName :: unicode:chardata().

返回引擎的名称(例如描述),如果未设置名称,则返回空二进制数据。

如果参数格式错误,该函数会引发 error:badarg。如果底层 OpenSSL 实现中没有引擎支持,它也可能引发异常 error:notsup

链接到此函数

engine_list()

查看源码 (自 OTP 20.2 起)
-spec engine_list() -> Result when Result :: [EngineId :: unicode:chardata()].

列出 OpenSSL 内部列表中所有引擎的 ID。

如果底层 OpenSSL 实现中没有引擎支持,它也可能引发异常 error:notsup

另请参阅用户指南中的 引擎加载 一章。

如果底层 OpenSSL 实现不支持引擎功能,可能会引发异常 error:notsup

链接到此函数

engine_load(引擎ID, PreCmds, PostCmds)

查看源码 (自 OTP 20.2 起)
-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

另请参阅用户指南中的 引擎加载 一章。

链接到此函数

engine_register(引擎, 引擎方法)

查看源码 (自 OTP 25.1 起)
-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

链接到此函数

engine_remove(引擎)

查看源码 (自 OTP 21.0.6 起)
-spec engine_remove(Engine) -> Result
                       when Engine :: engine_ref(), Result :: ok | {error, Reason :: term()}.

从 OpenSSL 的内部列表中删除引擎。

如果参数格式错误,该函数会引发 error:badarg。如果底层 OpenSSL 实现中没有引擎支持,它也可能引发异常 error:notsup

链接到此函数

engine_unload(引擎)

查看源码 (自 OTP 20.2 起)
-spec engine_unload(Engine) -> Result
                       when Engine :: engine_ref(), Result :: ok | {error, Reason :: term()}.

卸载 OpenSSL 引擎。

卸载由 Engine 给定的 OpenSSL 引擎。如果无法卸载引擎,则返回错误元组。

如果参数格式错误,该函数会引发 error:badarg。如果底层 OpenSSL 实现中没有引擎支持,它也可能引发异常 error:notsup

另请参阅用户指南中的 引擎加载 一章。

链接到此函数

engine_unregister(引擎, 引擎方法)

查看源码 (自 OTP 25.1 起)
-spec engine_unregister(Engine, EngineMethods) -> Result
                           when
                               Engine :: engine_ref(),
                               EngineMethods :: [engine_method_type()],
                               Result :: ok | {error, Reason :: term()}.

取消注册引擎,使其不处理某些类型的方法。

如果参数格式错误,该函数会引发 error:badarg。如果底层 OpenSSL 实现中没有引擎支持,它也可能引发异常 error:notsup

链接到此函数

ensure_engine_loaded(引擎ID, 库路径)

查看源码 (自 OTP 21.0.6 起)
-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

另请参阅用户指南中的 引擎加载 一章。

链接到此函数

pbkdf2_hmac(摘要, 密码, 盐, 迭代次数, 密钥长度)

查看源代码 (自 OTP 24.2 起)
-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 元组样式 进行错误处理。

链接到此函数

privkey_to_pubkey(类型, 引擎私钥引用)

查看源代码 (自 OTP 20.2 起)
-spec privkey_to_pubkey(Type, EnginePrivateKeyRef) -> PublicKey
                           when
                               Type :: rsa | dss,
                               EnginePrivateKeyRef :: engine_key_ref(),
                               PublicKey :: rsa_public() | dss_public().

从存储在引擎中的私钥获取公钥。

密钥的类型必须与 Type 参数指定的类型一致。

旧版 RSA 加密 API

链接到此函数

private_decrypt(算法, 密文, 私钥, 选项)

查看源代码 (自 OTP R16B01 起)
-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 一起使用。

链接到此函数

private_encrypt(算法, 明文, 私钥, 选项)

查看源代码 (自 OTP R16B01 起)
-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/4verify/5 的组合。

链接到此函数

public_decrypt(算法, 密文, 公钥, 选项)

查看源代码 (自 OTP R16B01 起)
-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/5sign/4 的组合。

链接到此函数

public_encrypt(算法, 明文, 公钥, 选项)

查看源代码 (自 OTP R16B01 起)
-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 一起使用。