Crypto 库是C/C++的加密算法库,这个加密库很流行,基本上涵盖了市面上的各类加密解密算法,感兴趣的可以参考一下
Crypto 库是C/C++的加密算法库,这个加密库很流行,基本上涵盖了市面上的各类加密解密算法,以下代码是我在学习是来源gao@daima#com搞(%代@#码网总结的,放到这里用于后期需要时能够快速解决问题。
项目地址:https://www.cryptopp.com/
Sha256加密算法
Sha系列加密算法包括很多,基本上有以下几种格式的加密方式,位数越大加密强度越大,此算法属于单向加密算法与MD5类似但安全性高于MD5。
- SHA-1:生成摘要的性能比MD5略低
- SHA-256:可以生成长度256bit的信息摘要
- SHA-224:可以生成长度224bit的信息摘要
- SHA-384:可以生成长度384bit的信息摘要
- SHA-512:可以生成长度512bit的信息摘要
#include #include #include #include #include #include #include #include #pragma comment(lib, "cryptlib.lib") using namespace std; using namespace CryptoPP; // 计算文件的 SHA256 值 string CalSHA256_ByFile(char *pszFileName) { string value; SHA256 sha256; FileSource(pszFileName, true, new HashFilter(sha256, new HexEncoder(new StringSink(value)))); return value; } // 计算数据的 SHA256 值 string CalSHA256_ByMem(PBYTE pData, DWORD dwDataSize) { string value; SHA256 sha256; StringSource(pData, dwDataSize, true, new HashFilter(sha256, new HexEncoder(new StringSink(value)))); return value; } int main(int argc, char * argv[]) { string src = "hello lyshark"; string dst; // 单独计算MD5值的使用 MD5 md5; StringSource(src, true, new HashFilter(md5, new HexEncoder(new StringSink(dst)))); cout << "计算字符串MD5: " << dst << endl; // 单独计算CRC32值 CRC32 crc32; StringSource(src, true, new HashFilter(crc32, new HexEncoder(new StringSink(dst)))); cout << "计算字符串CRC32: " << dst << endl; // 计算一个数组 BYTE pArrayData[] = { 10, 20, 30, 40, 50 }; DWORD dwArraySize = sizeof(pArrayData); dst.clear(); StringSource(pArrayData, dwArraySize, true, new HashFilter(md5, new HexEncoder(new StringSink(dst)))); cout << "计算数组的MD5: " << dst << endl; // 直接对文件计算Sha256散列值 string sha = CalSHA256_ByFile("c://BuidIAT.exe"); cout << "文件散列值: " << sha << endl; // 读入文件到内存后计算 HANDLE hFile = CreateFile(L"c://BuidIAT.exe", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL); DWORD dwFileSize = GetFileSize(hFile, NULL); BYTE *pData = new BYTE[dwFileSize]; ReadFile(hFile, pData, dwFileSize, NULL, NULL); string sha2 = CalSHA256_ByMem(pData, dwFileSize); cout << "内存中文件散列值: " << sha2.c_str() << endl; system("pause"); return 0; }
AES 加密与解密
AES是对称加密,AES可使用16,24或32字节密钥(分别对应128,192和256位)。 Crypto++ 库缺省的密钥长度是16字节,也就是 AES:: DEFAULT_KEYLENGTH。
对于 ECB 和 CBC 模式,处理的数据必须是块大小的倍数。或者,你可以用 StreamTransformationFilter 围绕这个模式对象,并把它作为一个过滤器对象。StreamTransformationFilter 能够缓存数据到块中并根据需要填充。
#include #include #include #include #include #include #include #pragma comment(lib, "cryptlib.lib") using namespace std; using namespace CryptoPP; int main(int argc, char * argv[]) { cout << "Key 长度: " << AES::DEFAULT_KEYLENGTH << endl; cout << "最小长度: " << AES::MIN_KEYLENGTH << endl; cout << "最大长度: " << AES::MAX_KEYLENGTH << endl; cout << "Block Size: " << AES::BLOCKSIZE << endl; AutoSeededRandomPool rand; // 产生一个随机数的密钥 SecByteBlock Key(0x00, AES::DEFAULT_KEYLENGTH); rand.GenerateBlock(Key, Key.size()); // 产生一个随机的初始向量 SecByteBlock ival(AES::BLOCKSIZE); rand.GenerateBlock(ival, ival.size()); byte plainText[] = "hello lyshark"; size_t Textlen = std::strlen((char*)plainText) + 1; cout << "待加密字符串长度: " << Textlen << endl; // 加密字符串 CFB_Mode::Encryption cfbEncryption(Key, Key.size(), ival); cfbEncryption.ProcessData(plainText, plainText, Textlen); cout << "显示加密后的十六进制数: "; StringSource strSource1(plainText, Textlen, true, new HexEncoder(new FileSink(cout))); // 解密字符串 并将数据输出到Cout流上 CFB_Mode::Decryption cfbDecryption(Key, Key.size(), ival); cfbDecryption.ProcessData(plainText, plainText, Textlen); cout << endl << "显示解密后的十六进制数: "; StringSource strSource2(plainText, Textlen, true, new HexEncoder(new FileSink(cout))); cout << endl; system("pause"); return 0; }
以下代码使用CBC模式加密与解密指定字符串。如果需要针对字符串进行加解密则需要使用以下代码实现.
#include #include #include #include #include #include #include #pragma comment(lib, "cryptlib.lib") using namespace std; using namespace CryptoPP; int main(int argc, char * argv[]) { // 开辟空间并将空间赋予初始值0 byte key[CryptoPP::AES::DEFAULT_KEYLENGTH], iv[CryptoPP::AES::BLOCKSIZE]; memset(key, 0x00, CryptoPP::AES::DEFAULT_KEYLENGTH); memset(iv, 0x00, CryptoPP::AES::BLOCKSIZE); // 指定需要加密的字符串与 std::string plain以上就是C/C++ Crypto密码库调用的实现方法的详细内容,更多请关注gaodaima搞代码网其它相关文章!