ToB企服应用市场:ToB评测及商务社交产业平台

标题: 20.3 OpenSSL 对称AES加解密算法 [打印本页]

作者: 温锦文欧普厨电及净水器总代理    时间: 2023-11-25 06:13
标题: 20.3 OpenSSL 对称AES加解密算法
AES算法是一种对称加密算法,全称为高级加密标准(Advanced Encryption Standard)。它是一种分组密码,以128比特为一个分组进行加密,其密钥长度可以是128比特、192比特或256比特,因此可以提供不同等级的安全性。该算法采用了替代、置换和混淆等技术,以及多轮加密和密钥扩展等机制,使得其加密效果优秀,安全性高,被广泛应用于各种领域中,如数据加密、文件加密、网络安全等。
AES算法加密和解密使用的密钥是相同的,该算法加密和解密速度较快,适用于对大量数据进行加密解密的场景。在实际应用中,通常采用混合加密方式,即使用RSA算法加密对称加密算法中的密钥,再使用对称加密算法加密数据,以保证数据的机密性和加密解密的效率。
AES算法常用两种加密模式,即CBC和ECB模式,它们分别具有不同的优缺点。
在实际应用中,通常采用CBC模式进行加密,因为它比ECB模式更安全,但加密效率较低。此外,还有其他的加密模式,如CFB、OFB、CTR等,不同的加密模式适用于不同的场景,需要根据实际需求进行选择。
OpenSSL库提供了对AES加密的支持,但在使用时读者还是需要自行封装一些通用加解密函数,如下代码片段是笔者常用的一些函数总结,其中aes_cbc_encrypt函数用于使用CBC模式对特定字符串加密,aes_cbc_decrypt则使用CBC模式对字符串进行解密,第二个函数AES函数则是使用OpenSSL库默认的加解密函数二次封装实现的。
  1. #include <iostream>
  2. #include <openssl/err.h>
  3. #include <openssl/aes.h>
  4. #include <openssl/evp.h>
  5. #include <openssl/crypto.h>
  6. #include <openssl/pem.h>
  7. extern "C"
  8. {
  9. #include <openssl/applink.c>
  10. }
  11. #pragma comment(lib,"libssl_static.lib")
  12. #pragma comment(lib,"libcrypto.lib")
  13. // CBC模式加密
  14. int aes_cbc_encrypt(char* in, char* key, char* out)
  15. {
  16.     if (!in || !key || !out)
  17.         return 0;
  18.     unsigned char iv[AES_BLOCK_SIZE];
  19.     for (int i = 0; i < AES_BLOCK_SIZE; ++i)
  20.         iv[i] = 0;
  21.     AES_KEY aes;
  22.     if (AES_set_encrypt_key((unsigned char*)key, 128, &aes) < 0)
  23.     {
  24.         return 0;
  25.     }
  26.     int len = strlen(in);
  27.     AES_cbc_encrypt((unsigned char*)in, (unsigned char*)out, len, &aes, iv, AES_ENCRYPT);
  28.     return 1;
  29. }
  30. // CBC模式解密
  31. int aes_cbc_decrypt(char* in, char* key, char* out)
  32. {
  33.     if (!in || !key || !out)
  34.         return 0;
  35.     // 加密的初始化向量
  36.     unsigned char iv[AES_BLOCK_SIZE];
  37.     // iv一般设置为全0
  38.     for (int i = 0; i < AES_BLOCK_SIZE; ++i)
  39.         iv[i] = 0;
  40.     AES_KEY aes;
  41.     if (AES_set_decrypt_key((unsigned char*)key, 128, &aes) < 0)
  42.     {
  43.         return 0;
  44.     }
  45.     int len = strlen(in);
  46.     AES_cbc_encrypt((unsigned char*)in, (unsigned char*)out, len, &aes, iv, AES_DECRYPT);
  47.     return 1;
  48. }
  49. // 将加密与解密整合在一起
  50. void AES(unsigned char* InBuff, unsigned char* OutBuff, unsigned char* key, char* Type)
  51. {
  52.     if (strcmp(Type, "encode") == 0)
  53.     {
  54.         AES_KEY AESEncryptKey;
  55.         AES_set_encrypt_key(key, 256, &AESEncryptKey);
  56.         AES_encrypt(InBuff, OutBuff, &AESEncryptKey);
  57.     }
  58.     else if (strcmp(Type, "decode") == 0)
  59.     {
  60.         AES_KEY AESDecryptKey;
  61.         AES_set_decrypt_key(key, 256, &AESDecryptKey);
  62.         AES_decrypt(InBuff, OutBuff, &AESDecryptKey);
  63.     }
  64. }
复制代码
有了上述算法封装,接下来笔者将依次演示这几种不同的加密函数是如何被应用的,首先简单介绍一下aes_cbc_encrypt与aes_cbc_decrypt这两个函数都是自己封装的AES加解密算法,这两个算法参数传递保持一致,第一个参数都是指定需要加密的缓冲区,第二个参数则是指定加密所使用的key,第三个参数是处理后的结果。
[code]int main(int argc, char* argv[]){  char szBuffer[1024] = "hello lyshark";  char szDst[1024] = { 0 };  char szSrc[1024] = { 0 };  // 计算一串密钥  char key[AES_BLOCK_SIZE] = { 0 };  for (int x = 0; x < AES_BLOCK_SIZE; x++)  {    key[x] = 32 + x;  }  // AES加密  if (aes_cbc_encrypt(szBuffer, key, szDst) != 0)  {    std::cout




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4