之所以能接触到Crypto++ ,是因为本人在项目中要求用DES算法进行加密。再此,我默认大家是了解DES算法的原理。在自己实现和选择库两者中,经过曲折历程之后,最终选择Crypto++ 库。这个库包含了我们常见的加密算法,不再赘述有哪些了,本篇文章主要是关于DES调用怎么使用,因为好多文章都在介绍AES(比较新的原因吧)

点击此处icon-default.png?t=LA92https://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填充模式,其他形式类似。

  1. 加密过程
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.测试结果

 进行结果核对,至此完毕。

更多推荐