• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

C/C++ Crypto密码库调用的实现方法

c++ 搞代码 4年前 (2022-01-06) 64次浏览 已收录 0个评论
文章目录[隐藏]

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搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:C/C++ Crypto密码库调用的实现方法

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址