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

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

密码学库CryptoPP中包含的对称密码算法包括分组密码算法和流密码算法。关于分组密码算法的使用,详见:https://blog.csdn.net/Lunar_Queen/article/details/82220980(以AES为例)。
密码学库Cryptopp中包含的流密码算法较少,如下图所示:
这里写图片描述
和随机数发生器、分组密码算法等一样,流密码算法也是密码学的一个重要分支。在Cryptopp中,所有的流密码算法都继承自SymmetricCipherDocumentation。
这里写图片描述
因此,它们都有一样的接口。在下面的示例代码中,只需要将使用的流密码算法类名用其他的流密码替换即可以实现用该算法对相应的字符串的加密和解密。

以流密码Salsa20算法为例,演示其使用方法。

获取算法相关的信息(密钥Key和初始向量IV)源代码:

#include<cryptlib.h>
#include<iostream>
#include<salsa.h> //包含Salsa20算法的头文件
using namespace std;
using namespace CryptoPP;


int main()
{
    //Salsa20的密钥(Key)长度和初始化向量IV大小(单位:字节)
    Salsa20::Encryption enc;
    cout << "缺省密钥长度:" << enc.DefaultKeyLength() << endl;
    cout << "最小的密钥长度:" << enc.MinKeyLength() << endl;
    cout << "最大的秘钥长度:" << enc.MaxKeyLength() << endl;

    cout << "缺省的初始向量大小:" << enc.DefaultIVLength() << endl;
    cout << "最小的初始向量大小:" << enc.MinIVLength() << endl;
    cout << "最大的初始向量大小" << enc.MaxIVLength() << endl;

    return 0;
}

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

完整示例代码如下:

#include<cryptlib.h>
#include<iostream>
#include<secblock.h> //包含SecByteBlock算法的头文件
#include<hex.h> //包含HexEncoder算法的头文件
#include<files.h> //包含FileSink算法的头文件
#include<osrng.h> //包含AutoSeededRandomPool算法的头文件
#include<salsa.h> //包含Salsa20算法的头文件
using namespace std;
using namespace CryptoPP;


int main()
{
    //Salsa20的密钥(Key)长度和初始化向量IV大小(单位:字节)

    Salsa20::Encryption enc;//定义加密对象
    Salsa20::Decryption dec;//定义解密对象

    cout << "缺省密钥长度:" << enc.DefaultKeyLength() << endl;
    cout << "最小的密钥长度:" << enc.MinKeyLength() << endl;
    cout << "最大的秘钥长度:" << enc.MaxKeyLength() << endl;

    cout << "缺省的初始向量大小:" << enc.DefaultIVLength() << endl;
    cout << "最小的初始向量大小:" << enc.MinIVLength() << endl;
    cout << "最大的初始向量大小" << enc.MaxIVLength() << endl << endl << endl;

    //定义一个随机数发生器,用于产生随机的密钥Key和初始向量IV
    AutoSeededRandomPool prng;

    //将得到字符以十六进制的形式输出至屏幕(cout)
    HexEncoder hexcoder(new FileSink(cout));

    //plain待加密的明文
    //cipher加密后的密文
    //recover解密后的明文
    string plain("Hello world,I love you very much"),cipher,recover;

    //动态申请空间以存储接下来生成密钥key和初始向量iv
    SecByteBlock key(enc.DefaultKeyLength()),iv(enc.DefaultIVLength());

    //产生随机的key和iv
    prng.GenerateBlock(key,key.size());
    prng.GenerateBlock(iv,iv.size());

    //以十六进制形式打印输出key
    cout << "key:" << endl;
    hexcoder.Put(key.data(),key.size());
    hexcoder.MessageEnd();
    cout << endl;

    //以十六进制形式打印输出iv
    cout << "iv:" << endl;
    hexcoder.Put(iv.data(),iv.size());
    hexcoder.MessageEnd();
    cout << endl;
    cout << endl;

    //加密和解密准备
    enc.SetKeyWithIV(key,key.size(),iv,iv.size());
    dec.SetKeyWithIV(key,key.size(),iv,iv.size());

    //执行加密
    cipher.resize(plain.size());//分配存储空间
    enc.ProcessData((CryptoPP::byte*)&cipher[0],
        (CryptoPP::byte*)plain.c_str(),plain.size());


    //输出加密前的明文字符串(十六进制)
    cout << "plain:" << endl;
    hexcoder.Put((CryptoPP::byte*)plain.c_str(),plain.size());
    hexcoder.MessageEnd();
    cout << endl;

    //输出加密后的密文字符串(十六进制)
    cout << "cipher:" << endl;
    hexcoder.Put((CryptoPP::byte*)cipher.c_str(),plain.size());
    hexcoder.MessageEnd();
    cout << endl;

    //执行解密
    recover.resize(cipher.size());
    dec.ProcessData((CryptoPP::byte*)&recover[0],
        (CryptoPP::byte*)cipher.c_str(),cipher.size());

    //输出解密后的明文字符串(十六进制)
    cout << "recover:" << endl;
    hexcoder.Put((CryptoPP::byte*)recover.c_str(),recover.size());
    hexcoder.MessageEnd();
    cout << endl;

    return 0;
}

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

猜你喜欢

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