mbedtls中的加密算法

对称密码算法

AES 高级加密标准

AES(Advanced Encryption Standard)是目前最为流行的加密算法之一。它可以使用128位、192位或256位的密钥进行加密,安全性非常高,同时运算速度也比较快,因此得到了广泛的应用。

AES加密算法采用分组加密方式,将明文按照固定的长度分成若干个块,每个块独立地进行加密。加密过程中,先将明文和密钥进行混淆,然后再通过多轮的置换和代换操作来实现加密。解密时,只需要按照相同的密钥和加密方式进行逆向操作就可以了。

具体地说,AES加密算法的流程如下:

  1. 密钥扩展:根据所选密钥长度,对密钥进行扩展。

  2. 初始轮:将明文图像按字节替换成另一个字节,然后与扩展密钥进行异或操作。

  3. 多轮加密:重复多轮加密,每轮加密包括以下四个步骤:

    a. 字节替换: 使用S盒对明文的字节进行替换。

    b. 行移位: 将每一行循环左移不同的位数。

    c. 列混淆: 对每列进行乘法运算。

    d. 扩展密钥加: 将扩展密钥与处理后的明文异或得到一个新的密文块。

  4. 最终轮: 在最终轮中不进行行移位,并且不再进行列混淆,直接使用扩展密钥加。同时,将密文转换为字符输出。

总之,AES加密算法具有高强度、高效率、高安全性等优点,在许多领域得到广泛应用,如数据加密、网络安全和数据传输等。

// 用于初始化mbedtls_aes_context结构体
void mbedtls_aes_init(mbedtls_aes_context *ctx);

// 用于设置加密模式的AES密钥,需要传入128位、192位或256位的AES密钥;
int mbedtls_aes_setkey_enc(mbedtls_aes_context *ctx, const unsigned char *key, unsigned int keybits);

// 用于对输入数据进行ECB模式的AES加密解密操作,需要传入AES加密密钥以及待加密或解密的输入数据。
void mbedtls_aes_crypt_ecb(mbedtls_aes_context *ctx, int mode, const unsigned char input[16], unsigned char output[16]);

DES 数据加密标准

DES(Data Encryption Standard)是一种对称加密算法,它采用64位的数据块和56位的密钥进行加密。DES加密过程分为以下几个步骤:

  1. 密钥生成:从56位输入密钥中生成16个48位的子密钥。

  2. 初始置换:将明文按照规定的置换表进行置换。

  3. 加密轮次:共进行16轮加密操作,每轮加密分为以下四个步骤:

    a. 将64位明文按照规定的置换表进行置换。

    b. 将置换后的明文分为左右两部分L0和R0,每个部分长度为32位。

    c. 将右半部分Ri-1作为左半部分Li的输入,然后对Ri-1和Ki进行Feistel扩展和替换(包括一些位移、替代和混淆等操作),得到一个48位的输出,并将此输出与左半部分Li-1异或得到Ri。

    d. 将Li和Ri置换位置后得到64位的输出。

  4. 末置换:将加密后的64位数据按照规定置换表进行置换后,得到密文输出。

总之,DES加密算法采用对称加密方式,在加密过程中使用了一个经过多次Feistel变换的置换网络来完成数据的加密过程。虽然DES在现代密码学中不再被认为是安全的加密算法,但它依旧应用广泛,作为其他加密算法的基础组件或者用于保护非关键数据。

3DES 三重数据加密算法

3DES(Triple Data Encryption Standard)是DES的加强版。在3DES中,使用了三个DES密钥对数据进行加密。它可以使用两个或三个56位的密钥来加密64位数据块,因此可以选择112位或168位的密钥长度。3DES既可以用于加密,也可以用于解密。

3DES采用了两种模式:EDE和EEE。在EDE模式下,它先使用第一个密钥进行加密,然后使用第二个密钥进行解密,最后再使用第三个密钥进行加密。而在EEE模式下,它会三次使用不同的密钥进行加密。

3DES加密过程如下:

  1. 密钥处理:将3个密钥扩展成48个子密钥。

  2. 初始置换:按照固定规则对明文进行位重排。

  3. 加密轮次:将明文分成左右两部分,并进行16轮加密,每轮加密包括以下四个步骤:

    a. 将右半部分作为下一轮的左半部分。

    b. 对右半部分进行扩展、异或和替换等运算。

    c. 将结果与左半部分异或。

    d. 交换左右半边。

  4. 末置换:按照固定规则对加密后的数据进行位重排得到密文。

总之,3DES采用了三个密钥进行三次加密的方法,以增加加密强度。它在DES的基础上加入了更高级的机制,即使密钥长度较短也能够达到足够的安全性和可靠性,在许多领域得到广泛应用。

ARC4 流加密算法

ARC4是一种流式加密算法,它适用于对长数据流进行加密。ARC4算法的加密过程如下:

  1. 密钥调度算法:根据输入的密钥,对256个字节进行处理,生成一个S盒。在S盒上进行操作,将明文异或上S盒中的伪随机字节后得到密文。

  2. 生成伪随机流:使用密钥和初始化向量(IV)作为输入,通过密钥调度算法生成伪随机流,在伪随机流的帮助下对明文进行加密或解密。

具体地,ARC4算法的主要步骤如下:

  1. 初始化:使用密钥对S盒进行初始化,并设置两个索引i和j的初始值为0。

  2. 生成伪随机流:重复执行以下步骤,直到输出了足够的伪随机流:

    a. 增加i的值,并计算t = S[i]。

    b. 增加j的值,并交换S[j]和S[t]的值。

    c. 计算S[(S[i]+S[j]) mod 256]的值,并输出该值。

  3. 加密/解密:将伪随机流与明文/密文进行异或运算,即可获得密文/明文。

总之,ARC4算法是一种简单高效的流式加密算法,具备较高的加密速度和灵活性,但由于其算法本身存在一些缺陷,如易受到攻击者的线性、差分等攻击,因此在确保安全性的场合使用时需要谨慎。

// 用于初始化mbedtls_arc4_context结构体,可以在开始使用前调用;
void mbedtls_arc4_init(mbedtls_arc4_context *ctx);

// 用于设置ARC4加密算法的密钥,需要传入加密密钥以及密钥长度;
void mbedtls_arc4_setup(mbedtls_arc4_context *ctx, const unsigned char *key, unsigned int keylen);

// 用于对输入数据进行ARC4加密解密操作,需要传入待加密或解密的输入数据以及输出缓存区大小。
void mbedtls_arc4_crypt(mbedtls_arc4_context *ctx, size_t length, const unsigned char *input, unsigned char *output);

ChaCha20 流加密算法

ChaCha20是一种流式加密算法,用于对长数据流进行加密。它被广泛应用于TLS、VPN等领域,以及Google Chrome、Firefox等浏览器中的加密通信中。

ChaCha20算法采用32位字长,并使用一个256位的密钥和一个64位的初始化向量(IV),可以生成一个不同于任何其他IV的伪随机流。具体地,ChaCha20算法的主要步骤如下:

  1. 对称密钥扩展:根据输入的256位密钥和64位的IV,使用一个类似于哈希函数的过程,生成256位的密钥流。

  2. 加密/解密:将明文/密文与密钥流进行异或操作,以实现加密/解密。

ChaCha20算法主要包含以下特点:

  1. 快速:由于其简单而高效的算法,ChaCha20在软件和硬件平台都能够快速地进行加密/解密操作。

  2. 安全:ChaCha20使用了256位的密钥和64位的IV,保证了足够的安全性,并且它能够防御各种攻击,包括差分、线性、重复密钥等攻击。

  3. 灵活:ChaCha20可以设置不同的IV来生成不同的密钥流,从而实现灵活的加密需求。

  4. 可移植:ChaCha20算法可以在不同的平台上进行实现,具有很强的可移植性。

总之,ChaCha20是一种安全高效的流式加密算法,适用于对长数据流进行加密。它在TLS、VPN等领域得到广泛应用,并取得了良好的效果。

void mbedtls_chacha20_init(mbedtls_chacha20_context *ctx);
void mbedtls_chacha20_starts(mbedtls_chacha20_context *ctx, const unsigned char *key, const unsigned char *iv, int counter);
void mbedtls_chacha20_update(mbedtls_chacha20_context *ctx, size_t length, const unsigned char *input, unsigned char *output);

Camellia 分组密码算法

Camellia算法是一种对称密钥加密算法,由NTT、Mitsubishi Electric和NTT Communications共同开发。它被选定为了ISO/IEC 18033-3标准,是日本政府采用的加密算法之一。

Camellia算法支持128位、192位和256位三种密钥长度,并且可以进行加密和解密操作。它使用了Feistel结构和置换-代换网络,主要包括以下步骤:

  1. 密钥扩展:根据输入的密钥,生成一个密钥流,用于后续的加密和解密操作。

  2. 轮函数:将明文分成两部分,并对其中一部分进行变换操作,然后与另一部分进行异或运算,得到新的明文。

  3. 轮循环:重复执行多轮轮函数操作,最终得到加密/解密结果。

相对于其他加密算法,Camellia算法具有以下优点:

  1. 安全性高:Camellia算法使用了欧洲和日本的密码技术,采用了复杂的置换和代换运算,使其更加安全。

  2. 可靠性好:Camellia算法在实现时采用了严格的代码规范和测试步骤,保证其代码可靠。

  3. 高效性强:Camellia算法在硬件实现上具有并行性能较好的优势,可以在高速流转换中表现非常出色。

总之,Camellia算法是一种安全可靠、效率高的对称密钥加密算法,已经被广泛应用于各种场景中。

void mbedtls_camellia_init(mbedtls_camellia_context *ctx);
void mbedtls_camellia_setkey_enc(mbedtls_camellia_context *ctx, const unsigned char *key, size_t keybits);
void mbedtls_camellia_crypt_ecb(mbedtls_camellia_context *ctx, int mode, const unsigned char input[16], unsigned char output[16]);

非对称密码算法

RSA Rivest Shamir 和 Adleman 公钥加密算法

申请的SSL证书算法就是基于RSA 算法实现的

RSA算法是一种公钥加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman三位数学家在1978年发明。它基于大数分解难题,是目前应用最广泛的公钥加密算法之一。

RSA算法包括以下步骤:

  1. 密钥生成:选择两个大质数p和q,计算它们的乘积n=p*q,并选择一个整数e,使得e与(p-1)(q-1)互质。最后,生成公钥PK=(n,e)和私钥SK=(d),其中d是满足ed≡1 mod (p-1)(q-1)的整数。

  2. 加密:对于明文M,使用公钥PK进行加密,得到密文C=Me mod n。

  3. 解密:对于密文C,使用私钥SK进行解密,得到明文M=Cd mod n。

RSA算法主要包含以下特点:

  1. 安全性好:RSA算法基于大数分解难题,使得破解它需要极其巨大的计算量,因此具有很高的安全性。

  2. 兼容性强:RSA算法的公钥可以在多个系统中传递,在不同的平台上进行加密和解密操作。

  3. 应用广泛:RSA算法被广泛应用于数字签名、数据加密、身份验证等领域,是公钥基础设施(PKI)的基础。

  4. 性能较慢:RSA算法的加密和解密速度较慢,在处理大量数据时可能会导致性能瓶颈。

总之,RSA算法是一种安全、兼容性强、应用广泛的公钥加密算法,对于保护数据的安全具有重要意义。

//用于初始化mbedtls_rsa_context结构体,可以在开始使用前调用
void mbedtls_rsa_init(mbedtls_rsa_context *ctx, int padding, int hash_id);

// 用于生成RSA密钥对,需要传入随机数生成函数以及密钥位数和指数
int mbedtls_rsa_gen_key(mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, unsigned int nbits, int exponent);


// 用于进行RSA加密和解密操作,需要传入RSA上下文、随机数生成函数、加解密模式、输入数据以及输出缓存区信息。
int mbedtls_rsa_pkcs1_encrypt(mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len);
int mbedtls_rsa_pkcs1_decrypt(mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len);

DH Diffie-Hellman 密钥交换算法

DH(Diffie-Hellman)密钥交换算法是一种基于密码学的算法,可以用于在不安全的网络中,安全地共享密钥。该算法由Whitfield Diffie和Martin Hellman在1976年提出。

DH密钥交换算法的主要思想是通过非对称加密算法,使得两个通信方都可以生成相同的密钥,这样就可以保证数据在传输过程中的安全性。

DH密钥交换算法包括以下步骤:

  1. 选择素数p和一个原根g:发送方和接收方都可以自行选择,确保它们相同。

  2. 发送方选择私有数字a,并计算公共数字A=g^a mod p,将其发送给接收方。

  3. 接收方选择私有数字b,并计算公共数字B=g^b mod p,将其发送给发送方。

  4. 发送方计算密钥K=B^a mod p,接收方计算密钥K=A^b mod p。由于Ab=(ga)b=g(ab),Ba=(gb)a=g(ab),所以两者计算的值都是相同的,可以互相认证对方并生成相同的密钥。

DH密钥交换算法的优点是:

  1. 算法简单:DH密钥交换算法基于数论,相对于其他的加密算法,实现起来比较简单。

  2. 安全性高:DH密钥交换算法可以在不安全的网络中,安全地共享密钥,并且在传输过程中,不会暴露密钥。

  3. 适用广泛:DH密钥交换算法可以被广泛地应用于各种场景中,如TLS、SSH等安全协议中的密钥协商过程。

总之,DH密钥交换算法是一种简单而又安全的密钥交换算法,能够在不安全的网络中安全地共享密钥,因此被广泛地应用于各种场景中。

// 初始化结构体
void mbedtls_dhm_init(mbedtls_dhm_context *ctx);

// 读取Diffe-Hellman参数
int mbedtls_dhm_read_params(mbedtls_dhm_context *ctx, const unsigned char **p, const unsigned char *end);

// 生成公共参数并输出
int mbedtls_dhm_make_public(mbedtls_dhm_context *ctx, int x_size, unsigned char *output, size_t output_size, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng);

// 计算密钥
int mbedtls_dhm_calc_secret(mbedtls_dhm_context *ctx, unsigned char *output, size_t output_size, size_t *olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng);

ECDH(基于椭圆曲线的密钥交换算法)

ECDH(Elliptic Curve Diffie-Hellman)算法是一种基于椭圆曲线密码学的密钥交换算法。与传统的DH密钥交换算法类似,ECDH算法也可以在不安全的网络中,安全地共享密钥。

ECDH算法的核心思想是利用椭圆曲线上离散对数难题,使得通信双方可以通过互相交换公钥来生成相同的密钥。

ECDH算法的具体实现步骤如下:

  1. 选择一个椭圆曲线E和一个点G作为基点,这个点G存在于椭圆曲线E上。

  2. 发送方和接收方都生成自己的私钥,即随机选择一个整数a和b,并计算出公钥A=aG和公钥B=bG。

  3. 发送方将公钥A发送给接收方,接收方将公钥B发送给发送方。

  4. 发送方和接收方利用收到的对方公钥和自己的私钥计算出相同的共享密钥K=abG。

ECDH算法相比传统的DH算法具有以下优点:

  1. 更短的密钥长度:使用更小的椭圆曲线和点的坐标,可以实现与RSA密钥交换相同的安全水平,但使用更短的密钥长度,从而提高了效率和速度。

  2. 更好的安全性:ECDH算法是基于离散对数难题的安全算法, 比起RSA算法来说更为安全。

  3. 更小的计算量:与传统的DH算法相比,ECDH算法需要处理的数据量更小,在进行密钥交换时可以节省大量的计算资源。

总之,ECDH算法是一种安全、高效的密钥交换算法,具有较短的密钥长度和更小的计算量,非常适用于在不安全的网络中实现安全通信。

// 用于初始化mbedtls_ecdh_context结构体
void mbedtls_ecdh_init(mbedtls_ecdh_context *ctx);

// 用于生成公共参数并输出
int mbedtls_ecdh_make_public(mbedtls_ecdh_context *ctx, size_t *olen, unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng);

// 用于读取对方的公钥参数
int mbedtls_ecdh_read_public(mbedtls_ecdh_context *ctx, const unsigned char *buf, size_t blen);

// 用于计算密钥,并将计算结果输出
int mbedtls_ecdh_compute_shared(mbedtls_ecdh_context *ctx, size_t *olen, unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng);

ECDSA(基于椭圆曲线的数字签名算法)

ECDSA(Elliptic Curve Digital Signature Algorithm)是一种基于椭圆曲线密码学的数字签名算法,其具有高效、安全、可靠等特点。相较于传统的RSA数字签名算法,ECDSA算法需要更小的密钥尺寸,更快的计算速度和更强的安全性。

ECDSA算法的基本流程如下:

  1. 选择一个合适的椭圆曲线E及其上的基点G作为算法参数。

  2. 选取一个私钥k作为签名的密钥,计算出公钥Q=kG。

  3. 对待签名的消息进行哈希运算,得到消息的哈希值h。

  4. 计算签名值r和s,其中r=kG的x坐标模曲线上点的阶,s=(h+dr)/k mod n,其中d为私钥,n为素数阶。

  5. 签名值(r,s)即为数字签名,将其发送给接收方。

  6. 接收方收到数字签名后,使用发送方的公钥Q进行验证,检查签名的合法性。

ECDSA算法已经被广泛应用于各种场景中,例如SSL/TLS协议中的数字证书验证、数字版权保护等领域。需要注意的是,在使用ECDSA时,必须确保所选的椭圆曲线和参数是安全的,否则可能会导致签名的不安全。

// 用于生成公私钥对
int mbedtls_ecdsa_genkey(mbedtls_ecdsa_context *ctx, mbedtls_ctr_drbg_context *ctr_drbg, mbedtls_ecp_group_id gid);

// 于对给定的哈希值进行数字签名,需要传入随机数生成函数、哈希值大小以及输出的签名缓冲区和签名长度;
int mbedtls_ecdsa_sign(mbedtls_ecdsa_context *ctx, const unsigned char *hash, size_t hashlen, unsigned char *sig, size_t *slen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng);

// 用于验证数字签名的有效性,需要传入哈希值、签名和签名长度。
int mbedtls_ecdsa_verify(mbedtls_ecdsa_context *ctx, const unsigned char *hash, size_t hashlen, const unsigned char *sig, size_t slen);

哈希算法

MD5

MD5(Message Digest 5)是一种哈希函数,由Ronald Rivest于1991年设计。它可以将任意长的消息作为输入,并输出一个128位的消息摘要,通常用于验证数据的完整性和防篡改。

MD5 算法的主要特点包括:

  1. 输入块长度为512位,输出长度为128位。

  2. MD5 算法采用置换、替换、加法等运算来混合输入信息,并使用S盒进行变换。

  3. MD5 算法具有简单、高效、容易实现等优点,因此在早期通信系统中得到了广泛的应用。

现状:由于MD5 算法的弱点使得可以通过碰撞攻击来生成相同的哈希值,从而破坏数据的完整性验证功能。因此,建议采用更安全的哈希函数,如SHA-256、SHA-3等。

SHA-1

SHA-1(Secure Hash Algorithm 1)是一种哈希函数,由美国国家安全局(NSA)设计,于1995年发布。它可以将任意长的消息作为输入,并输出一个160位的消息摘要,通常用于验证数据的完整性和防篡改。

SHA-1 算法的主要特点包括:

  1. 输入块长度为512位,输出长度为160位。

  2. SHA-1 算法采用置换、替换、加法等运算来混合输入信息,并使用S盒进行变换。

  3. SHA-1 算法具有高效、简单、安全等优点,并且已经被广泛应用于数字证书、SSH等领域。

现状:与MD5 类似,可能通过碰撞攻击来破坏数据的完整性;推荐使用 SHA-256、SHA-3等哈希函数

SHA-256

SHA-256是SHA-2家族中的一种哈希算法,由美国国家标准和技术研究院(NIST)在2001年发布,它可以将任意长度的输入消息处理为一个256位的哈希值,通常用于数据完整性验证、密码学安全等领域。

SHA-256算法的主要特点包括:

  1. 输入块长度为512位,输出长度为256位。

  2. SHA-256算法采用了类似SHA-1算法的消息扩展函数、压缩函数来进行哈希运算,包括四个步骤:消息扩展、压缩函数、更新哈希值、输出哈希值。

  3. SHA-256算法被设计为无法逆推,即不能通过哈希值推算出原始消息,从而保证数字签名的安全性。

现状:随着计算机计算能力的提升,可能会存在哈希碰撞攻击等安全漏洞。因此,建议采用更为安全的哈希函数,如SHA-3等。同时,也应注意密钥管理等安全问题。

// 用于上下文的初始化和释放
void mbedtls_sha256_init( mbedtls_sha256_context *ctx );
void mbedtls_sha256_free( mbedtls_sha256_context *ctx );

// 用于复制上下文
void mbedtls_sha256_clone( mbedtls_sha256_context *dst, const mbedtls_sha256_context *src );
//  开始一个新的哈希计算
void mbedtls_sha256_starts( mbedtls_sha256_context *ctx, int is224 );
// 处理输入的数据块
void mbedtls_sha256_process( mbedtls_sha256_context *ctx, const unsigned char data[64] );
// 处理
void mbedtls_sha256_update( mbedtls_sha256_context *ctx, const unsigned char *input, size_t ilen );
void mbedtls_sha256_finish( mbedtls_sha256_context *ctx, unsigned char output[32] );
void mbedtls_sha256( const unsigned char *input, size_t ilen, unsigned char output[32], int is224 );

SHA-512

SHA-512是SHA-2家族中的一种哈希算法,由美国国家标准和技术研究院(NIST)在2001年发布,它可以将任意长度的输入消息处理为一个512位的哈希值,通常被用于数据完整性验证、密码学安全等领域。

SHA-512算法的主要特点包括:

  1. 输入块长度为1024位,输出长度为512位。

  2. SHA-512算法采用了类似SHA-256算法的消息扩展函数、压缩函数来进行哈希运算,包括八个步骤:消息填充、消息扩展、压缩函数、更新哈希值、重复3~5、输出哈希值。

  3. SHA-512算法被设计为无法逆推,即不能通过哈希值推算出原始消息,从而保证数字签名的安全性。

现状:HA-512算法是比较安全的哈希算法,但随着计算机计算能力的提升,可能会存在哈希碰撞攻击等安全漏洞。

RIPEMD-160

RIPEMD-160是一种常用的哈希算法,由Hans Dobbertin、Antoon Bosselaers和Bart Preneel于1996年设计,目的是提供更好的数据完整性检查和身份验证功能。它可以将任意长度的输入消息处理为一个160位的哈希值。

RIPEMD-160算法的主要特点包括:

  1. 输入块长度为512位,输出长度为160位。

  2. RIPEMD-160算法采用了类似MD4、MD5算法的消息扩展函数、压缩函数来进行哈希运算,包括五个步骤:消息填充、消息扩展、压缩函数、更新哈希值、输出哈希值。

  3. RIPEMD-160算法在保证安全性的基础上,运算速度比较快,适合在较低计算能力的设备上运行。

现状:RIPEMD-160算法是比较安全的哈希算法,但随着计算机计算能力的提升,可能会存在哈希碰撞攻击等安全漏洞。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值