当前位置:   article > 正文

用C++封装常用的加密解密算法类_c++国密加解密文件算法

c++国密加解密文件算法

常用的加密算法介绍

1.DES 加密算法
DES 加密算法是一种分组密码,以 64 位为分组对数据加密,它的密钥长度是 56 位,加密解密用同一算法。DES 加密算法是对密钥进行保密,而公开算法,包括加密和解密算法。这样,只有掌握了和发送方相同密钥的人才能解读由 DES 加密算法加密的密文数据。因此,破译 DES 加密算法实际上就是搜索密钥的编码。对于 56 位长度的密钥来说,如果用穷举法来进行搜索的话,其运算次数为 256。

2.AES 加密算法
AES 加密算法是密码学中的高级加密标准,该加密算法采用对称分组密码体制,密钥长度的最少支持为 128、192、256,分组长度 128 位,算法应易于各种硬件和软件实现。这种加密算法是美国联邦政府采用的区块加密标准,这个标准用来替代原先的 DES,已经被多方分析且广为全世界所使用。
AES 加密算法被设计为支持 128/192/256 位(/32=nb) 数据块大小(即分组长度);支持 128/192/256 位(/32=nk) 密码长度,在 10 进制里,对应 34×1038、62×1057、1.1×1077 个密钥。

3.RSA 加密算法
RSA 加密算法是目前最有影响力的公钥加密算法,并且被普遍认为是目前最优秀的公钥方案之一。RSA 是第一个能同时用于加密和数宇签名的算法,它能够抵抗到目前为止已知的所有密码攻击,已被 ISO 推荐为公钥数据加密标准。RSA 加密算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

4.Base64 加密算法
Base64 加密算法是网络上最常见的用于传输 8bit 字节代码的编码方式之一,Base64 编码可用于在 HTTP 环境下传递较长的标识信息。例如,在 JAVAPERSISTENCE 系统 HIBEMATE 中,采用了 Base64 来将一个较长的唯一标识符编码为一个字符串,用作 HTTP 表单和 HTTPGETURL 中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在 URL(包括隐藏表单域)中的形式。此时,采用 Base64 编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。

5.MD5 加密算法
MD5 为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。对 MD5 加密算法简要的叙述可以为:MD5 以 512 位分组来处理输入的信息,且每一分组又被划分为 16 个 32 位子分组,经过了一系列的处理后,算法的输出由四个 32 位分组组成,将这四个 32 位分组级联后将生成 — 个 128 位散列值。
MD5 被广泛用于各种软件的密码认证和钥匙识别上。MD5 用的是哈希函数,它的典型应用是对一段信息产生信息摘要,以防止被篡改。MD5 的典型应用是对一段 Message 产生 fingerprin 指纹,以防止被 “篡改”。如果再有 — 个第三方的认证机构,用 MD5 还可以防止文件作者的 “抵赖”,这就是所谓的数字签名应用。MD5 还广泛用于操作系统的登陆认证上,如 UNIX、各类 BSD 系统登录密码、数字签名等诸多方。

6.SHA1 加密算法
SHA1 是和 MD5 一样流行的消息摘要算法。SHA 加密算法模仿 MD4 加密算法。SHA1 设计为和数字签名算法(DSA)一起使用。
SHA1 主要适用于数字签名标准里面定义的数字签名算法。对于长度小于 2“64 位的消息,SHA1 会产生一个 160 位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。SHA1 不可以从消息摘要中复原信息,而两个不同的消息不会产生同样的消息摘要。这样,SHA1 就可以验证数据的完整性,所以说 SHA1 是为了保证文件完整性的技术。
SHA1 加密算法可以采用不超过 264 位的数据输入,并产生一个 160 位的摘要。输入被划分为 512 位的块,并单独处理。160 位缓冲器用来保存散列函数的中间和最后结果。缓冲器可以由 5 个 32 位寄存器(A、B、C、D 和 E)来表示。SHA1 是一种比 MD5 的安全性强的算法,理论上,凡是采取 “消息摘要” 方式的数字验证算法都是有 “碰撞” 的 —— 也就是两个不同的东西算出的消息摘要相同,互通作弊图就是如此。但是安全性高的算法要找到指定数据的 “碰撞” 很困难,而利用公式来计算 “碰撞” 就更困难一目前为止通用安全算法中仅有 MD5 被破解。
 

  1. #include <iostream>
  2. #include <openssl/des.h>
  3. #include <openssl/aes.h>
  4. #include <openssl/rsa.h>
  5. #include <openssl/md5.h>
  6. #include <openssl/sha.h>
  7. // 加密解密类
  8. class Encryption {
  9. public:
  10. // 加密算法枚举
  11. enum Algorithm {
  12. DES,
  13. AES,
  14. RSA,
  15. MD5,
  16. SHA1
  17. };
  18. // 构造函数
  19. Encryption(Algorithm algorithm);
  20. // 析构函数
  21. ~Encryption();
  22. // 加密函数
  23. std::string encrypt(const std::string& plaintext);
  24. // 解密函数
  25. std::string decrypt(const std::string& ciphertext);
  26. private:
  27. Algorithm m_algorithm;
  28. DES_cblock m_desKey;
  29. AES_KEY m_aesKey;
  30. RSA* m_rsaKey;
  31. // DES加密函数
  32. std::string desEncrypt(const std::string& plaintext);
  33. // DES解密函数
  34. std::string desDecrypt(const std::string& ciphertext);
  35. // AES加密函数
  36. std::string aesEncrypt(const std::string& plaintext);
  37. // AES解密函数
  38. std::string aesDecrypt(const std::string& ciphertext);
  39. // RSA加密函数
  40. std::string rsaEncrypt(const std::string& plaintext);
  41. // RSA解密函数
  42. std::string rsaDecrypt(const std::string& ciphertext);
  43. // MD5加密函数
  44. std::string md5Encrypt(const std::string& plaintext);
  45. // SHA1加密函数
  46. std::string sha1Encrypt(const std::string& plaintext);
  47. };
  48. // 构造函数
  49. Encryption::Encryption(Algorithm algorithm) : m_algorithm(algorithm), m_rsaKey(nullptr) {
  50. // 初始化加密库
  51. switch (m_algorithm) {
  52. case DES:
  53. DES_random_key(&m_desKey);
  54. break;
  55. case AES:
  56. unsigned char aesKey[AES_BLOCK_SIZE];
  57. RAND_bytes(aesKey, sizeof(aesKey));
  58. AES_set_encrypt_key(aesKey, 256, &m_aesKey);
  59. break;
  60. case RSA:
  61. // 使用openssl生成RSA密钥对
  62. // TODO: 替换为实际生成RSA密钥对的代码
  63. m_rsaKey = RSA_generate_key(1024, 3, nullptr, nullptr);
  64. break;
  65. default:
  66. break;
  67. }
  68. }
  69. // 析构函数
  70. Encryption::~Encryption() {
  71. // 清理加密库资源
  72. switch (m_algorithm) {
  73. case RSA:
  74. RSA_free(m_rsaKey);
  75. break;
  76. default:
  77. break;
  78. }
  79. }
  80. // 加密函数
  81. std::string Encryption::encrypt(const std::string& plaintext) {
  82. switch (m_algorithm) {
  83. case DES:
  84. return desEncrypt(plaintext);
  85. case AES:
  86. return aesEncrypt(plaintext);
  87. case RSA:
  88. return rsaEncrypt(plaintext);
  89. case MD5:
  90. return md5Encrypt(plaintext);
  91. case SHA1:
  92. return sha1Encrypt(plaintext);
  93. default:
  94. return "";
  95. }
  96. }
  97. // 解密函数
  98. std::string Encryption::decrypt(const std::string& ciphertext) {
  99. switch (m_algorithm) {
  100. case DES:
  101. return desDecrypt(ciphertext);
  102. case AES:
  103. return aesDecrypt(ciphertext);
  104. case RSA:
  105. return rsaDecrypt(ciphertext);
  106. default:
  107. return "";
  108. }
  109. }
  110. // DES加密函数
  111. std::string Encryption::desEncrypt(const std::string& plaintext) {
  112. DES_cblock desIv;
  113. DES_random_key(&desIv);
  114. DES_key_schedule schedule;
  115. DES_set_key_checked(&m_desKey, &schedule);
  116. std::string ciphertext;
  117. ciphertext.resize(plaintext.size());
  118. DES_ncbc_encrypt(reinterpret_cast<const unsigned char*>(plaintext.data()),
  119. reinterpret_cast<unsigned char*>(ciphertext.data()),
  120. plaintext.size(),
  121. &schedule,
  122. &desIv,
  123. DES_ENCRYPT);
  124. return ciphertext;
  125. }
  126. // DES解密函数
  127. std::string Encryption::desDecrypt(const std::string& ciphertext) {
  128. DES_cblock desIv;
  129. DES_random_key(&desIv);
  130. DES_key_schedule schedule;
  131. DES_set_key_checked(&m_desKey, &schedule);
  132. std::string plaintext;
  133. plaintext.resize(ciphertext.size());
  134. DES_ncbc_encrypt(reinterpret_cast<const unsigned char*>(ciphertext.data()),
  135. reinterpret_cast<unsigned char*>(plaintext.data()),
  136. ciphertext.size(),
  137. &schedule,
  138. &desIv,
  139. DES_DECRYPT);
  140. return plaintext;
  141. }
  142. 非常抱歉,以下是代码的继续完善部分:
  143. // AES加密函数
  144. std::string Encryption::aesEncrypt(const std::string& plaintext) {
  145. std::string ciphertext;
  146. ciphertext.resize(plaintext.size());
  147. AES_encrypt(reinterpret_cast<const unsigned char*>(plaintext.data()),
  148. reinterpret_cast<unsigned char*>(ciphertext.data()),
  149. &m_aesKey);
  150. return ciphertext;
  151. }
  152. // AES解密函数
  153. std::string Encryption::aesDecrypt(const std::string& ciphertext) {
  154. std::string plaintext;
  155. plaintext.resize(ciphertext.size());
  156. AES_decrypt(reinterpret_cast<const unsigned char*>(ciphertext.data()),
  157. reinterpret_cast<unsigned char*>(plaintext.data()),
  158. &m_aesKey);
  159. return plaintext;
  160. }
  161. // RSA加密函数
  162. std::string Encryption::rsaEncrypt(const std::string& plaintext) {
  163. std::string ciphertext;
  164. ciphertext.resize(RSA_size(m_rsaKey));
  165. RSA_public_encrypt(plaintext.size(),
  166. reinterpret_cast<const unsigned char*>(plaintext.data()),
  167. reinterpret_cast<unsigned char*>(ciphertext.data()),
  168. m_rsaKey,
  169. RSA_PKCS1_PADDING);
  170. return ciphertext;
  171. }
  172. // RSA解密函数
  173. std::string Encryption::rsaDecrypt(const std::string& ciphertext) {
  174. std::string plaintext;
  175. plaintext.resize(RSA_size(m_rsaKey));
  176. RSA_private_decrypt(ciphertext.size(),
  177. reinterpret_cast<const unsigned char*>(ciphertext.data()),
  178. reinterpret_cast<unsigned char*>(plaintext.data()),
  179. m_rsaKey,
  180. RSA_PKCS1_PADDING);
  181. return plaintext;
  182. }
  183. // MD5加密函数
  184. std::string Encryption::md5Encrypt(const std::string& plaintext) {
  185. unsigned char hash[MD5_DIGEST_LENGTH];
  186. MD5(reinterpret_cast<const unsigned char*>(plaintext.data()),
  187. plaintext.size(),
  188. hash);
  189. char hexHash[MD5_DIGEST_LENGTH * 2 + 1];
  190. for (int i = 0; i < MD5_DIGEST_LENGTH; ++i) {
  191. sprintf(hexHash + 2 * i, "%02x", hash[i]);
  192. }
  193. return hexHash;
  194. }
  195. // SHA1加密函数
  196. std::string Encryption::sha1Encrypt(const std::string& plaintext) {
  197. unsigned char hash[SHA_DIGEST_LENGTH];
  198. SHA1(reinterpret_cast<const unsigned char*>(plaintext.data()),
  199. plaintext.size(),
  200. hash);
  201. char hexHash[SHA_DIGEST_LENGTH * 2 + 1];
  202. for (int i = 0; i < SHA_DIGEST_LENGTH; ++i) {
  203. sprintf(hexHash + 2 * i, "%02x", hash[i]);
  204. }
  205. return hexHash;
  206. }

这是一个能够支持DES加密、AES加密、RSA加密、MD5加密和SHA1加密的加密解密类。根据你的需求,可以通过调用encrypt和decrypt函数进行加密和解密操作,并指定要使用的算法。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/460210
推荐阅读
相关标签
  

闽ICP备14008679号