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

密码学库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;
}

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

更多示例代码详见《深入浅出CryptoPP密码学库》随书电子文档:https://github.com/locomotive-crypto/crypto_book_1st

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值