加密 | crypto
加密
模块
加密
模块摘要
密码函数
描述
该模块提供了一组加密函数。
- 哈希函数-
Secure Hash Standard
,,,The MD5 Message Digest Algorithm (RFC 1321)
和The MD4 Message Digest Algorithm (RFC 1320)
- HMAC功能-
Keyed-Hashing for Message Authentication (RFC 2104)
- CMAC功能-
The AES-CMAC Algorithm (RFC 4493)
- 分组密码.分组密码模式下的DES和AES
ECB, CBC, CFB, OFB, CTR and GCM
RSA encryption RFC 1321
- 数字签名
Digital Signature Standard (DSS)
和Elliptic Curve Digital Signature Algorithm (ECDSA)
Secure Remote Password Protocol (SRP - RFC 2945)
- gcm:Dworkin,M.,“分组加密模式操作的推荐:伽罗瓦/计数器模式(GCM)和GMAC”,国家标准与技术研究所SP 800-38D,2007年11月。
数据类型
key_value() = integer() | binary()
总binary()
当用作返回值时
rsa_public() = [key_value()] = [E, N]
其中E是公开指数,N是公共模数。
rsa_private() = [key_value()] = [E, N, D] | [E, N, D, P1, P2, E1, E2, C]
其中E是公开指数,N是公共模数,D是私人指数。较长的密钥格式包含冗余信息,可以使计算速度更快。P1,P2是第一和第二主要因素。E1,E2是第一和第二指数。C是CRT系数。术语取自。 RFC 3447
dss_public() = [key_value()] = [P, Q, G, Y]
其中P,Q和G是DSS参数,Y是公钥。
dss_private() = [key_value()] = [P, Q, G, X]
其中P,Q和G是dss参数,X是私钥。
srp_public() = key_value()
当A
或B
来自SRP design
srp_private() = key_value()
当a
或b
来自SRP design
Verifier是v
,Generator是g
和Prime是N
,Deriv
edKey是X
,并且Scrambler是u
(可选将在没有提供的情况下生成)从SRP design
Version ='3'| '6'| '6A'
dh_public() = key_value()
dh_private() = key_value()
dh_params() = [key_value()] = [P, G] | [P, G, PrivateKeyBitLength]
ecdh_public() = key_value()
ecdh_private() = key_value()
ecdh_params() = ec_named_curve() | ec_explicit_curve()
ec_explicit_curve() =
{ec_field(), Prime :: key_value(), Point :: key_value(), Order :: integer(), CoFactor :: none | integer()}
ec_field() = {prime_field, Prime :: integer()} |
{characteristic_two_field, M :: integer(), Basis :: ec_basis()}
ec_basis() = {tpbasis, K :: non_neg_integer()} |
{ppbasis, K1 :: non_neg_integer(), K2 :: non_neg_integer(), K3 :: non_neg_integer()} |
onbasis
ec_named_curve() ->
sect571r1| sect571k1| sect409r1| sect409k1| secp521r1| secp384r1| secp224r1| secp224k1|
secp192k1| secp160r2| secp128r2| secp128r1| sect233r1| sect233k1| sect193r2| sect193r1|
sect131r2| sect131r1| sect283r1| sect283k1| sect163r2| secp256k1| secp160k1| secp160r1|
secp112r2| secp112r1| sect113r2| sect113r1| sect239k1| sect163r1| sect163k1| secp256r1|
secp192r1|
brainpoolP160r1| brainpoolP160t1| brainpoolP192r1| brainpoolP192t1| brainpoolP224r1|
brainpoolP224t1| brainpoolP256r1| brainpoolP256t1| brainpoolP320r1| brainpoolP320t1|
brainpoolP384r1| brainpoolP384t1| brainpoolP512r1| brainpoolP512t1
需要注意的是教派
曲线GF2m(特征二)曲线,并且只支持如果底层OpenSSL无法对他们的支持。也可以看看crypto:supports/0
stream_cipher() = rc4 | aes_ctr
block_cipher() = aes_cbc | aes_cfb8 | aes_cfb128 | aes_ige256 | blowfish_cbc |
blowfish_cfb64 | des_cbc | des_cfb | des3_cbc | des3_cfb | des_ede3 | rc2_cbc
aead_cipher() = aes_gcm | chacha20_poly1305
stream_key() = aes_key() | rc4_key()
block_key() = aes_key() | blowfish_key() | des_key()| des3_key()
aes_key() = iodata()
密钥长度是128,192或256位
rc4_key() = iodata()
可变密钥长度从8位到2048位(通常在40和256之间)
blowfish_key() = iodata()
从32位到448位的可变密钥长度
des_key() = iodata()
密钥长度为64位(在CBC模式下仅使用8位)
des3_key() = [binary(), binary(), binary()]
每个关键部分都是64位(在CBC模式下仅使用8位)
digest_type() = md5 | sha | sha224 | sha256 | sha384 | sha512
rsa_digest_type() = md5 | ripemd160 | sha | sha224 | sha256 | sha384 | sha512
dss_digest_type() = sha | sha224 | sha256 | sha384 | sha512
请注意,实际支持的dss_digest_type取决于底层的加密库。在OpenSSL版本> = 1.0.1中,支持列出的摘要,而在1.0.0中仅支持sha,sha224和sha256。在版本0.9.8中,只有sha支持。
ecdsa_digest_type() = sha | sha224 | sha256 | sha384 | sha512
sign_options() = [{rsa_pad, rsa_sign_padding()} | {rsa_pss_saltlen, integer()}]
rsa_sign_padding() = rsa_pkcs1_padding | rsa_pkcs1_pss_padding
hash_algorithms() = md5 | ripemd160 | sha | sha224 | sha256 | sha384 | sha512
md4也支持hash_init/1和hash/2。请注意,md4和md5仅建议与现有应用程序兼容。
cipher_algorithms() = aes_cbc | aes_cfb8 | aes_cfb128 | aes_ctr | aes_gcm |
aes_ige256 | blowfish_cbc | blowfish_cfb64 | chacha20_poly1305 | des_cbc | des_cfb |
des3_cbc | des3_cfb | des_ede3 | rc2_cbc | rc4
mac_algorithms() = hmac | cmac
public_key_algorithms() = rsa |dss | ecdsa | dh | ecdh | ec_gf2m
请注意,ec_gf2m并非严格意义上的公钥算法,而是ecarcha和ecdh支持哪些曲线的限制。
出口
block_encrypt(Type, Key, PlainText) -> CipherText
类型
加密PlainText
根据Type
分组密码。
可能会抛出异常notsup
,以防Type
底层OpenSSL实现不支持所选内容。
block_decrypt(Type, Key, CipherText) -> PlainText
类型
CipherText
根据Type
分组密码进行解密。
可能会抛出异常notsup
,以防Type
底层OpenSSL实现不支持所选内容。
block_encrypt(Type, Key, Ivec, PlainText) -> CipherTextblock_encrypt(AeadType, Key, Ivec, {AAD, PlainText}) -> {CipherText, CipherTag}block_encrypt(aes_gcm, Key, Ivec, {AAD, PlainText, TagLength}) -> {CipherText, CipherTag}
类型
加密PlainText
根据Type
分组密码。IVec
是一个任意的初始化向量。
在AEAD(带有关联数据的认证加密)模式下,PlainText
根据Type
分组密码进行加密,并计算出CipherTag
对AAD
相关认证数据的认证。
可能会抛出异常notsup
,以防Type
底层OpenSSL实现不支持所选内容。
block_decrypt(Type, Key, Ivec, CipherText) -> PlainTextblock_decrypt(AeadType, Key, Ivec, {AAD, CipherText, CipherTag}) -> PlainText | error
类型
CipherText
根据Type
分组密码进行解密。IVec
是一个任意的初始化向量。
在AEAD(带有关联数据的认证加密)模式下,CipherText
根据Type
分组密码进行解密,然后使用PlainText
和AAD
(相关认证数据)检查真实性CipherTag
。error
如果解密或验证失败,可能会返回
可能会抛出异常notsup
,以防Type
底层OpenSSL实现不支持所选内容。
bytes_to_integer(Bin) -> Integer
类型
将整数的二进制表示转换为Erlang整数。
compute_key(Type, OthersPublicKey, MyKey, Params) -> SharedSecret
类型
计算私钥和对方公钥的共享密钥。也可以看看public_key:compute_key/2
exor(Data1, Data2) -> Result
类型
对提供的数据执行按位异或(异或)。
generate_key(Type, Params) -> {PublicKey, PrivKeyOut}generate_key(Type, Params, PrivKeyIn) -> {PublicKey, PrivKeyOut}
类型
生成一个类型的公钥Type
。另见public_key:generate_key/1
。可能抛出异常类的异常error
:
badarg
:参数是错误类型或具有非法值,
low_entropy
:随机发生器由于缺乏安全的“随机性”而失败,
computation_failed
:计算失败的另一个原因比low_entropy
。
注
RSA密钥生成仅在运行时使用脏调度程序支持构建时才可用。否则,尝试生成一个RSA密钥会抛出异常error:notsup
。
hash(Type, Data) -> Digest
类型
计算Type
来自类型的消息摘要Data
。
可能会抛出异常notsup
,以防Type
底层OpenSSL实现不支持所选内容。
hash_init(Type) -> Context
类型
初始化流式哈希运算的上下文。Type
确定使用哪个摘要。返回的上下文应该用作参数hash_update
。
可能会抛出异常notsup
,以防Type
底层OpenSSL实现不支持所选内容。
hash_update(Context, Data) -> NewContext
类型
更新Context
使用给定的代表摘要Data
。Context
必须是使用hash_init
此函数或以前的调用生成的。Data
可以是任何长度。NewContext
必须传递给下一个呼叫hash_update
或hash_final
。
hash_final(Context) -> Digest
类型
完成Context
从之前调用返回的引用的哈希操作hash_update
。大小Digest
由用于生成它的散列函数的类型决定。
hmac(Type, Key, Data) -> Machmac(Type, Key, Data, MacLength) -> Mac
类型
计算类型的HMAC Type
从Data
使用Key
作为认证密钥。
MacLength
将限制结果的大小Mac
。
hmac_init(Type, Key) -> Context
类型
初始化流式HMAC操作的上下文。Type
确定在HMAC操作中使用哪个哈希函数。Key
是身份验证密钥。钥匙可以是任何长度。
hmac_update(Context, Data) -> NewContext
类型
更新Context
使用给定的HMAC Data
。Context
必须已经使用HMAC初始化函数(例如hmac_init
)生成。Data
可以是任何长度。NewContext
必须传递到下一个电话hmac_update
或到的功能之一hmac_final
,并hmac_final_n
警告
不要Context
在多次调用hmac_update或hmac_final时使用参数。以任何方式重用旧上下文的语义都是未定义的,甚至可能会使早期版本中的VM崩溃。这种限制的原因是缺少对底层OpenSSL API的支持。
hmac_final(Context) -> Mac
类型
完成引用的HMAC操作Context
。结果MAC的大小由用于生成它的散列函数的类型决定。
hmac_final_n(Context, HashLen) -> Mac
类型
完成引用的HMAC操作Context
。HashLen
必须大于零。Mac
将是最多HashLen
字节的二进制文件。请注意,如果HashLen
大于从基础散列返回的实际字节数,则返回的散列将少于HashLen
字节。
cmac(Type, Key, Data) -> Maccmac(Type, Key, Data, MacLength) -> Mac
类型
计算类型的CMAC Type
从Data
使用Key
作为认证密钥。
MacLength
将限制结果的大小Mac
。
info_fips() -> Status
类型
提供有关加密和底层OpenSSL库的FIPS运行状态的信息。如果crypto是使用FIPS支持构建的,则可以是enabled
(在FIPS模式下运行时)或not_enabled
。对于其他版本,这个值总是not_supported
。
警告
在FIPS模式下,所有不符合FIPS的算法都被禁用并抛出异常not_supported
。检查supports
在FIPS模式下是否返回可用算法的受限列表。
info_lib() -> [{Name,VerNum,VerStr}]
类型
提供crypto使用的库的名称和版本。
Name
是图书馆的名称。VerNum
是根据图书馆自己的版本控制方案的数字版本。VerStr
包含版本的文本变体。
> info_lib().
[{<<"OpenSSL">>,269484095,<<"OpenSSL 1.1.0c 10 Nov 2016"">>}]
注意
从OTP R16开始,数字版本
代表编译加密时使用的OpenSSL 头文件
(openssl/opensslv.h
)的版本。文本变体代表运行时使用的OpenSSL库。在早期的OTP版本中,数字和文本都是从库中获取的。
mod_pow(N, P, M) -> Result
类型
计算函数N^P mod M
。
next_iv(Type, Data) -> NextIVecnext_iv(Type, Data, IVec) -> NextIVec
类型
返回将在下一次类型的加密/解密迭代中使用的初始化向量Type
。Data
是以前迭代步骤的加密数据。该IVec
参数仅des_cfb
作为前一迭代步骤中使用的向量。
private_decrypt(Type, CipherText, PrivateKey, Padding) -> PlainText
类型
解密CipherText
,用public_encrypt/4
(或等效函数)加密PrivateKey
,并返回明文(信息摘要)。这是一个低级别签名验证操作,例如旧版本的SSL协议。也可以看看public_key:decrypt_private/[2,3]
private_encrypt(Type, PlainText, PrivateKey, Padding) -> CipherText
类型
The size of the `PlainText` must be less than `byte_size(N)-11` if `rsa_pkcs1_padding` is used, and `byte_size(N)` if `rsa_no_padding` is used, where N is public modulus of the RSA key.
加密PlainText
使用PrivateKey
并返回密文。这是一个较低级别的签名操作,例如旧版本的SSL协议。也可以看看public_key:encrypt_private/[2,3]
public_decrypt(Type, CipherText, PublicKey, Padding) -> PlainText
类型
解密CipherText
,用private_encrypt/4
(或等效函数)加密PrivateKey
,并返回明文(信息摘要)。这是一个低级别签名验证操作,例如旧版本的SSL协议。也可以看看public_key:decrypt_public/[2,3]
public_encrypt(Type, PlainText, PublicKey, Padding) -> CipherText
类型
The size of the `PlainText` must be less than `byte_size(N)-11` if `rsa_pkcs1_padding` is used, and `byte_size(N)` if `rsa_no_padding` is used, where N is public modulus of the RSA key.
PlainText
使用PublicKey
和加密(消息摘要)并返回CipherText
。这是一个较低级别的签名操作,例如旧版本的SSL协议。也可以看看public_key:encrypt_public/[2,3]
rand_seed(Seed) -> ok
类型
将PRNG的种子设置为给定的二进制。这从openssl调用了RAND_seed函数。只有当你运行的系统没有足够的“随机性”时才使用它。通常这是在strong_rand_bytes/1
抛出时low_entropy
rand_uniform(Lo, Hi) -> N
类型
生成一个随机数N, Lo =< N < Hi.使用crypto库伪随机数生成器。Hi必须大于Lo。
sign(Algorithm, DigestType, Msg, Key) -> binary()sign(Algorithm, DigestType, Msg, Key, Options) -> binary()
类型
msg是要签名的二进制“cleartext”数据,或者是“cleartext”(即摘要(明文))的散列值。
创建一个数字签名。
算法dss
只能与摘要类型一起使用sha
。
另见public_key:sign/3
。
start() -> ok
等同于application:start(crypto)。
stop() -> ok
等同于application:stop(crypto)。
strong_rand_bytes(N) -> binary()
类型
随机生成N个字节,统一为0..255,并以二进制形式返回结果。使用密码安全的prng种子,并定期与操作系统提供的熵混合。默认情况下,这是RAND_bytes
来自OpenSSL 的方法。
low_entropy
由于缺乏安全的“随机性”,随机生成器失败的情况下可能会抛出异常。
rand_seed() -> rand:state()
创建状态对象random number generation
,以便生成密码强的随机数(基于OpenSSL BN_rand_range
),并在返回之前将其保存在流程字典中。另见rand:seed/1
。
例
_ = crypto:rand_seed(),
_IntegerValue = rand:uniform(42), % [1; 42]
_FloatValue = rand:uniform(). % [0.0; 1.0[
rand_seed_s() -> rand:state()
创建状态对象random number generation
,以便生成密码强烈的随机数(基于OpenSSL BN_rand_range
)。另见rand:seed_s/1
。
stream_init(Type, Key) -> State
类型
在初始化RC4流加密使用的状态stream_encrypt
和stream_decrypt
stream_init(Type, Key, IVec) -> State
类型
使用计数器模式(CTR)初始化用于流式AES加密的状态。Key
是AES密钥,并且必须是128,192或256位长。IVec
是128位(16字节)的任意初始化向量。这个状态用于stream_encrypt
和stream_decrypt
。
stream_encrypt(State, PlainText) -> { NewState, CipherText}
类型
加密PlainText
根据流密码Type
中stream_init
/ 3指定。Text
可以是任意数量的字节。最初State
是使用创建的stream_init
。NewState
必须传递给下一个呼叫stream_encrypt
。
stream_decrypt(State, CipherText) -> { NewState, PlainText }
类型
CipherText
根据Type
stream_init
/3中指定的流密码进行解密。PlainText
可以是任意数量的字节。最初State
是使用创建的stream_init
。NewState
必须传递给下一个调用stream_decrypt
。
supports() -> AlgorithmList
类型
可用于确定底层OpenSSL库支持哪些加密算法
ec_curves() -> EllipticCurveList
类型
可用于确定支持哪一种称为椭圆曲线。
ec_curve(NamedCurve) -> EllipticCurve
类型
返回椭圆曲线的定义参数。
verify(Algorithm, DigestType, Msg, Signature, Key) -> boolean()verify(Algorithm, DigestType, Msg, Signature, Key, Options) -> boolean()
类型
msg是二进制“cleartext”数据,或者是“cleartext”的散列值,即摘要(明文)。
验证数字签名
算法dss
只能与摘要类型一起使用sha
。
另见public_key:verify/4
。