非常教程

Erlang 20参考手册

加密 | crypto

加密 | 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和AESECB, 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() 

AB来自SRP design

srp_private() = key_value() 

ab来自SRP design

Verifier是v,Generator是g和Prime是N,DerivedKey是X,并且Scrambler是u(可选将在没有提供的情况下生成)从SRP designVersion ='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分组密码进行加密,并计算出CipherTagAAD相关认证数据的认证。

可能会抛出异常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分组密码进行解密,然后使用PlainTextAAD(相关认证数据)检查真实性CipherTagerror如果解密或验证失败,可能会返回

可能会抛出异常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使用给定的代表摘要DataContext必须是使用hash_init此函数或以前的调用生成的。Data可以是任何长度。NewContext必须传递给下一个呼叫hash_updatehash_final

hash_final(Context) -> Digest

类型

完成Context从之前调用返回的引用的哈希操作hash_update。大小Digest由用于生成它的散列函数的类型决定。

hmac(Type, Key, Data) -> Machmac(Type, Key, Data, MacLength) -> Mac

类型

计算类型的HMAC TypeData使用Key作为认证密钥。

MacLength将限制结果的大小Mac

hmac_init(Type, Key) -> Context

类型

初始化流式HMAC操作的上下文。Type确定在HMAC操作中使用哪个哈希函数。Key是身份验证密钥。钥匙可以是任何长度。

hmac_update(Context, Data) -> NewContext

类型

更新Context使用给定的HMAC DataContext必须已经使用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操作ContextHashLen必须大于零。Mac将是最多HashLen字节的二进制文件。请注意,如果HashLen大于从基础散列返回的实际字节数,则返回的散列将少于HashLen字节。

cmac(Type, Key, Data) -> Maccmac(Type, Key, Data, MacLength) -> Mac

类型

计算类型的CMAC TypeData使用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

类型

返回将在下一次类型的加密/解密迭代中使用的初始化向量TypeData是以前迭代步骤的加密数据。该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_encryptstream_decrypt

stream_init(Type, Key, IVec) -> State

类型

使用计数器模式(CTR)初始化用于流式AES加密的状态。Key是AES密钥,并且必须是128,192或256位长。IVec是128位(16字节)的任意初始化向量。这个状态用于stream_encryptstream_decrypt

stream_encrypt(State, PlainText) -> { NewState, CipherText}

类型

加密PlainText根据流密码Type中stream_init / 3指定。Text可以是任意数量的字节。最初State是使用创建的stream_initNewState必须传递给下一个呼叫stream_encrypt

stream_decrypt(State, CipherText) -> { NewState, PlainText }

类型

CipherText根据Typestream_init/3中指定的流密码进行解密。PlainText可以是任意数量的字节。最初State是使用创建的stream_initNewState必须传递给下一个调用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

加密 | crypto
1.许可 | 1. Licenses 详细
2. FIPS模式 | 2. FIPS mode 详细
加密 | crypto 详细