赞
踩
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 被破解。
- #include <iostream>
- #include <openssl/des.h>
- #include <openssl/aes.h>
- #include <openssl/rsa.h>
- #include <openssl/md5.h>
- #include <openssl/sha.h>
-
- // 加密解密类
- class Encryption {
- public:
- // 加密算法枚举
- enum Algorithm {
- DES,
- AES,
- RSA,
- MD5,
- SHA1
- };
-
- // 构造函数
- Encryption(Algorithm algorithm);
-
- // 析构函数
- ~Encryption();
-
- // 加密函数
- std::string encrypt(const std::string& plaintext);
-
- // 解密函数
- std::string decrypt(const std::string& ciphertext);
-
- private:
- Algorithm m_algorithm;
-
- DES_cblock m_desKey;
- AES_KEY m_aesKey;
- RSA* m_rsaKey;
-
- // DES加密函数
- std::string desEncrypt(const std::string& plaintext);
-
- // DES解密函数
- std::string desDecrypt(const std::string& ciphertext);
-
- // AES加密函数
- std::string aesEncrypt(const std::string& plaintext);
-
- // AES解密函数
- std::string aesDecrypt(const std::string& ciphertext);
-
- // RSA加密函数
- std::string rsaEncrypt(const std::string& plaintext);
-
- // RSA解密函数
- std::string rsaDecrypt(const std::string& ciphertext);
-
- // MD5加密函数
- std::string md5Encrypt(const std::string& plaintext);
-
- // SHA1加密函数
- std::string sha1Encrypt(const std::string& plaintext);
- };
-
- // 构造函数
- Encryption::Encryption(Algorithm algorithm) : m_algorithm(algorithm), m_rsaKey(nullptr) {
- // 初始化加密库
- switch (m_algorithm) {
- case DES:
- DES_random_key(&m_desKey);
- break;
- case AES:
- unsigned char aesKey[AES_BLOCK_SIZE];
- RAND_bytes(aesKey, sizeof(aesKey));
- AES_set_encrypt_key(aesKey, 256, &m_aesKey);
- break;
- case RSA:
- // 使用openssl生成RSA密钥对
- // TODO: 替换为实际生成RSA密钥对的代码
- m_rsaKey = RSA_generate_key(1024, 3, nullptr, nullptr);
- break;
- default:
- break;
- }
- }
-
- // 析构函数
- Encryption::~Encryption() {
- // 清理加密库资源
- switch (m_algorithm) {
- case RSA:
- RSA_free(m_rsaKey);
- break;
- default:
- break;
- }
- }
-
- // 加密函数
- std::string Encryption::encrypt(const std::string& plaintext) {
- switch (m_algorithm) {
- case DES:
- return desEncrypt(plaintext);
- case AES:
- return aesEncrypt(plaintext);
- case RSA:
- return rsaEncrypt(plaintext);
- case MD5:
- return md5Encrypt(plaintext);
- case SHA1:
- return sha1Encrypt(plaintext);
- default:
- return "";
- }
- }
-
- // 解密函数
- std::string Encryption::decrypt(const std::string& ciphertext) {
- switch (m_algorithm) {
- case DES:
- return desDecrypt(ciphertext);
- case AES:
- return aesDecrypt(ciphertext);
- case RSA:
- return rsaDecrypt(ciphertext);
- default:
- return "";
- }
- }
-
- // DES加密函数
- std::string Encryption::desEncrypt(const std::string& plaintext) {
- DES_cblock desIv;
- DES_random_key(&desIv);
-
- DES_key_schedule schedule;
- DES_set_key_checked(&m_desKey, &schedule);
-
- std::string ciphertext;
- ciphertext.resize(plaintext.size());
-
- DES_ncbc_encrypt(reinterpret_cast<const unsigned char*>(plaintext.data()),
- reinterpret_cast<unsigned char*>(ciphertext.data()),
- plaintext.size(),
- &schedule,
- &desIv,
- DES_ENCRYPT);
-
- return ciphertext;
- }
-
- // DES解密函数
- std::string Encryption::desDecrypt(const std::string& ciphertext) {
- DES_cblock desIv;
- DES_random_key(&desIv);
-
- DES_key_schedule schedule;
- DES_set_key_checked(&m_desKey, &schedule);
-
- std::string plaintext;
- plaintext.resize(ciphertext.size());
-
- DES_ncbc_encrypt(reinterpret_cast<const unsigned char*>(ciphertext.data()),
- reinterpret_cast<unsigned char*>(plaintext.data()),
- ciphertext.size(),
- &schedule,
- &desIv,
- DES_DECRYPT);
-
- return plaintext;
- }
-
- 非常抱歉,以下是代码的继续完善部分:
-
-
- // AES加密函数
- std::string Encryption::aesEncrypt(const std::string& plaintext) {
- std::string ciphertext;
- ciphertext.resize(plaintext.size());
-
- AES_encrypt(reinterpret_cast<const unsigned char*>(plaintext.data()),
- reinterpret_cast<unsigned char*>(ciphertext.data()),
- &m_aesKey);
-
- return ciphertext;
- }
-
- // AES解密函数
- std::string Encryption::aesDecrypt(const std::string& ciphertext) {
- std::string plaintext;
- plaintext.resize(ciphertext.size());
-
- AES_decrypt(reinterpret_cast<const unsigned char*>(ciphertext.data()),
- reinterpret_cast<unsigned char*>(plaintext.data()),
- &m_aesKey);
-
- return plaintext;
- }
-
- // RSA加密函数
- std::string Encryption::rsaEncrypt(const std::string& plaintext) {
- std::string ciphertext;
- ciphertext.resize(RSA_size(m_rsaKey));
-
- RSA_public_encrypt(plaintext.size(),
- reinterpret_cast<const unsigned char*>(plaintext.data()),
- reinterpret_cast<unsigned char*>(ciphertext.data()),
- m_rsaKey,
- RSA_PKCS1_PADDING);
-
- return ciphertext;
- }
-
- // RSA解密函数
- std::string Encryption::rsaDecrypt(const std::string& ciphertext) {
- std::string plaintext;
- plaintext.resize(RSA_size(m_rsaKey));
-
- RSA_private_decrypt(ciphertext.size(),
- reinterpret_cast<const unsigned char*>(ciphertext.data()),
- reinterpret_cast<unsigned char*>(plaintext.data()),
- m_rsaKey,
- RSA_PKCS1_PADDING);
-
- return plaintext;
- }
-
- // MD5加密函数
- std::string Encryption::md5Encrypt(const std::string& plaintext) {
- unsigned char hash[MD5_DIGEST_LENGTH];
- MD5(reinterpret_cast<const unsigned char*>(plaintext.data()),
- plaintext.size(),
- hash);
-
- char hexHash[MD5_DIGEST_LENGTH * 2 + 1];
- for (int i = 0; i < MD5_DIGEST_LENGTH; ++i) {
- sprintf(hexHash + 2 * i, "%02x", hash[i]);
- }
-
- return hexHash;
- }
-
- // SHA1加密函数
- std::string Encryption::sha1Encrypt(const std::string& plaintext) {
- unsigned char hash[SHA_DIGEST_LENGTH];
- SHA1(reinterpret_cast<const unsigned char*>(plaintext.data()),
- plaintext.size(),
- hash);
-
- char hexHash[SHA_DIGEST_LENGTH * 2 + 1];
- for (int i = 0; i < SHA_DIGEST_LENGTH; ++i) {
- sprintf(hexHash + 2 * i, "%02x", hash[i]);
- }
-
- return hexHash;
- }
这是一个能够支持DES加密、AES加密、RSA加密、MD5加密和SHA1加密的加密解密类。根据你的需求,可以通过调用encrypt和decrypt函数进行加密和解密操作,并指定要使用的算法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。