CryptoPP的 AES算法的使用(加密字符串)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Lunar_Queen/article/details/82220980

密码学库CryptoPP中包含了大量的分组密码算法。如下图所示:
这里写图片描述
今天,介绍一下其中的AES算法的使用。和前面谈到的Cryptopp提供的随机数发生器一样,分组密码属于对称密码学的一个重要分支。在Cryptopp中,分组密码都继承自BlockCipherDocumentation。
这里写图片描述
因此,它们都有共同的接口。所以,如果想使用其他的分组密码加密下面示例代码中的字符串,只需要将AES的类名字替换成所使用的分组密码类名字即可。
关于Cryptopp中随机数发生器的使用,详见专栏《CryptoPP的使用以及设计原理和设计思想》(专栏链地址链接:https://blog.csdn.net/column/details/25854.html

下面的示例程序演示了如何使用CryptoPP的AES算法加密和解密一个字符串。

示例代码如下:

#include<cryptlib.h>
#include<osrng.h>
#include<iostream>
#include<files.h>
#include<aes.h>
#include<modes.h>
#include<filters.h>
#include<hex.h>
using namespace std;
using namespace CryptoPP;


int main()
{

    cout << "key length: " << AES::DEFAULT_KEYLENGTH << endl;
    cout << "key length (min): " << AES::MIN_KEYLENGTH << endl;
    cout << "key length (max): " << AES::MAX_KEYLENGTH << endl;
    cout << "block size: " << AES::BLOCKSIZE << endl;

    AutoSeededRandomPool rnd;

    //产生一个随机数的密钥
    SecByteBlock key(0x00, AES::DEFAULT_KEYLENGTH);
    rnd.GenerateBlock( key, key.size() );

    //产生一个随机的初始向量
    SecByteBlock iv(AES::BLOCKSIZE);
    rnd.GenerateBlock(iv, iv.size());

    byte plainText[] = "Hello! How are you.";
    size_t messageLen = std::strlen((char*)plainText) + 1;

    //加密字符串
    CFB_Mode<AES>::Encryption cfbEncryption(key, key.size(), iv);
    cfbEncryption.ProcessData(plainText, plainText, messageLen);

    cout << endl << "加密结果(十六进制表示):" << endl;
                                                                   //显示加密结果至cout
    StringSource strSource1(plainText,messageLen,true,new HexEncoder( new FileSink(cout)));

    //解密字符串
    CFB_Mode<AES>::Decryption cfbDecryption(key, key.size(), iv);
    cfbDecryption.ProcessData(plainText, plainText, messageLen);

    cout << endl << "解密结果(十六进制表示):" << endl;
                                                                   //显示解密结果至cout
    StringSource strSource2(plainText,messageLen,true,new HexEncoder( new FileSink(cout)));
    cout << endl;


    return 0;
}

执行上述程序,运行结果如下图所示:
这里写图片描述

在上面的示例代码中,使用到了CryptoPP的pipeling相关算法,例如StringSource、FileSink、HexEncoder等。这些算法的出现,使得CryptoPP库使用起来非常的便利。关于这些算法的使用后续将一一列举,可以在专栏《CryptoPP的使用以及设计原理和设计思想》(专栏链地址链接:https://blog.csdn.net/column/details/25854.html)中寻找。

在上面的代码中,加密时使用到了分组密码常用的加密模式CFB模式,这是必须的。分组密码在使用的时候必须使用相关的分组模式,否则,会导致不安全。分组密码的模式还有OFB、CTR等模式。

猜你喜欢

转载自blog.csdn.net/Lunar_Queen/article/details/82220980