crypto++笔记
《深入浅出cryptoPP密码学库》学习笔记。crypto++库帮助文档:https://www.cryptopp.com/docs/ref/index.html进制与编码
以2进制,8进制,10进制,16进制字符串构造整数
Integer Int2("011111101010000b");
Integer Int8("102345676543210o");
Integer Int10("1234567890987654321");
Integer Int16("1234567890ABCDEFh");base系列编码算法定义在各base64.h base32.h hex.h头文件中
//base64编码与解码
#include<iostream>
#include<base64.h>
#include<files.h>
using namespace std;
using namespace CryptoPP;
int main()
{
string message= "我我我我我我我我我我我";
StringSource Base64String(message, true, new Base64Encoder(new FileSink(cout)));
string base64Message = "ztLO0s7SztLO0s7SztLO0s7SztLO0g==";
StringSource Base64String2(base64Message, true, new Base64Decoder(new FileSink(cout)));
}ASN.1定义了一套编码标准,其中有BER,DER等,为了与PGP,openSSL兼容,cryptopp定义了对数据进行BER,DER编解码的函数
生成一个512位随机数,并保存为der格式文件
#include<iostream>
#include<osrng.h>
#include<files.h>
using namespace std;
using namespace CryptoPP;
int main()
{
Integer bigNumber;
AutoSeededRandomPool rng;
bigNumber.Randomize(rng, 512);
bigNumber.DEREncode(FileSink("bignumber.der").Ref());
}pipeling数据处理范式
该范式将数据比作水流,从source经过filter最终流向sink
cryptopp将所有数据源称为source,所有数据处理类称为filter,所有能存储数据的特定数据结构称为sink
从StringSource流向HexEncoder再流向FileSink
#include<iostream>
#include<hex.h>
#include<files.h>
using namespace std;
using namespace CryptoPP;
int main()
{
string my;
cin >> my;
StringSource myCin(my, true, new HexEncoder(new FileSink("my.txt")));
}source可以使用GET()取出数据,sink可以使用PUT()放入数据,filter可以使用GET()和PUT()取出或放入数据
#include<iostream>
#include<hex.h>
#include<files.h>
#include<secblock.h>
using namespace std;
using namespace CryptoPP;
int main()
{
string my;
cin >> my;
SecByteBlock secGet(8);//每次取8个字符
StringSource myCin(my, true);
HexEncoder hexEncoder;
FileSink fileSink("my.txt");
myCin.Get(secGet, secGet.size());
hexEncoder.Put(secGet, secGet.size());
hexEncoder.Get(secGet, secGet.size());
fileSink.Put(secGet, secGet.size());
}也可以通过Attach连接“流”的“水道”,通过Detach更改“水道”
#include<iostream>
#include<hex.h>
#include<files.h>
#include<secblock.h>
using namespace std;
using namespace CryptoPP;
int main()
{
string my;
cin >> my;
StringSource myCin(my, true);
HexEncoder hexEncoder;
SecByteBlock secGet(2);
hexEncoder.Attach(new FileSink("my.txt"));
myCin.Get(secGet, secGet.size());
hexEncoder.Put(secGet, secGet.size());
hexEncoder.Detach(new FileSink(cout));
myCin.Get(secGet, secGet.size());
hexEncoder.Put(secGet, secGet.size());
}通过Redirector和ChannelSwitch多“水道”输出
示例中加入了不经过filter处理的,转为16进制处理的,base64处理的多个“水道”,在通过Redirector连接。
#include<iostream>
#include<hex.h>
#include<files.h>
#include<secblock.h>
#include<base64.h>
#include<channels.h>
using namespace std;
using namespace CryptoPP;
int main()
{
string my;
cin >> my;
FileSink o(cout);
HexEncoder hexEncoder(new FileSink(cout));
Base64Encoder base64Encoder(new FileSink(cout));
ChannelSwitch cs;
cs.AddDefaultRoute(o);
cs.AddDefaultRoute(hexEncoder);
cs.AddDefaultRoute(base64Encoder);
StringSource myCin(my, true, new Redirector(cs));
}工具
计时
//#includeTimer tm(TimerBase::SECONDS);//设置以秒为单位 cout
页:
[1]