Crypto++ 之 DES加密算法
·
之所以能接触到Crypto++ ,是因为本人在项目中要求用DES算法进行加密。再此,我默认大家是了解DES算法的原理。在自己实现和选择库两者中,经过曲折历程之后,最终选择Crypto++ 库。这个库包含了我们常见的加密算法,不再赘述有哪些了,本篇文章主要是关于DES调用怎么使用,因为好多文章都在介绍AES(比较新的原因吧)
点击此处
https://www.cryptopp.com/ 可以去下载Crypto++源码,目前是8.6版本。支持VS2003~2019的编译,自己获取源码后自己编译即可,有机会再介绍,环境配置过程及遇到的一些坑。下面直接上源码,看看是怎么调用Crypto++库实现DES算法:(默认环境已经配置好,不会的可以留言),对于DES有很多模式像:EBC、CBC、CFB、OFB、CTR,还有几种填充方式:NO_PADDING、ZEROS_PADDING、PKCS_PADDING、ONE_AND_ZEROS_PADDING、W3C_PADDING。本文选用CBC模式和PKCS_PADDING填充模式,其他形式类似。
- 加密过程
std::string DES_CBC_Encryption(IN std::string sKey, IN std::string sIV, IN const char* plainText)
{
std::string strCipherText;
try
{
//填key
CryptoPP::SecByteBlock key(CryptoPP::DES::MAX_KEYLENGTH);
memset(key, 0x30, key.size());
sKey.size() <= CryptoPP::DES::MAX_KEYLENGTH ? memcpy(key, sKey.c_str(), sKey.size()) :
memcpy(key, sKey.c_str(), CryptoPP::DES::MAX_KEYLENGTH);
//填iv
CryptoPP::byte iv[CryptoPP::DES::BLOCKSIZE];
memset(iv, 0x30, CryptoPP::DES::BLOCKSIZE);
sIV.size() <= CryptoPP::DES::BLOCKSIZE ? memcpy(iv, sIV.c_str(), sIV.size()) :
memcpy(iv, sIV.c_str(), CryptoPP::DES::BLOCKSIZE);
CryptoPP::DES::Encryption desEncryption((CryptoPP::byte*)key, CryptoPP::DES::MAX_KEYLENGTH);
CryptoPP::CBC_Mode_ExternalCipher::Encryption cbcEncryption(desEncryption, iv);
CryptoPP::StreamTransformationFilter cbcEncryptor(cbcEncryption,
new CryptoPP::HexEncoder(new CryptoPP::StringSink(strCipherText)),
CryptoPP::BlockPaddingSchemeDef::BlockPaddingScheme::PKCS_PADDING);
cbcEncryptor.Put((CryptoPP::byte*)plainText, strlen(plainText));
cbcEncryptor.MessageEnd();
}
catch (const CryptoPP::Exception& e)
{
std::cout << e.what() << std::endl;
}
return strCipherText;
}
2. 解密过程
std::string DES_CBC_Decryption(IN std::string sKey, IN std::string sIV, IN const char* cipherText)
{
std::string strPlainText;
try
{
//填key
CryptoPP::SecByteBlock key(CryptoPP::DES::MAX_KEYLENGTH);
memset(key, 0x30, key.size());
sKey.size() <= CryptoPP::DES::MAX_KEYLENGTH ? memcpy(key, sKey.c_str(), sKey.size()) :
memcpy(key, sKey.c_str(), CryptoPP::DES::MAX_KEYLENGTH);
//填iv
CryptoPP::byte iv[CryptoPP::DES::BLOCKSIZE];
memset(iv, 0x30, CryptoPP::DES::BLOCKSIZE);
sIV.size() <= CryptoPP::DES::BLOCKSIZE ? memcpy(iv, sIV.c_str(), sIV.size()) :
memcpy(iv, sIV.c_str(), CryptoPP::DES::BLOCKSIZE);
CryptoPP::CBC_Mode<CryptoPP::DES>::Decryption cbcDecryption((CryptoPP::byte*)key,
CryptoPP::DES::MAX_KEYLENGTH, iv);
CryptoPP::HexDecoder decryptor(new CryptoPP::StreamTransformationFilter(cbcDecryption,
new CryptoPP::StringSink(strPlainText), CryptoPP::BlockPaddingSchemeDef::BlockPaddingScheme::PKCS_PADDING));
decryptor.Put((CryptoPP::byte*)cipherText, strlen(cipherText));
decryptor.MessageEnd();
}
catch (const CryptoPP::Exception& e)
{
std::cout << e.what() << std::endl;
}
return strPlainText;
}
3. 进行测试
int main()
{
std::string strKey = "12345678"; //8位密钥
std::string strIV = "87654321"; //8位偏移量
std::string strCBCEncryp = DES_CBC_Encryption(strKey, strIV,"LOVE-Crypopp");
std::cout << "DES_CBC_Encryption = " << strCBCEncryp << std::endl;
std::string strCBCDecryp = DES_CBC_Decryption(strKey, strIV, strCBCEncryp.c_str());
std::cout << "DES_CBC_Decryption = " << strCBCDecryp << std::endl;
}
4.测试结果

进行结果核对,至此完毕。
更多推荐
所有评论(0)