《深入浅出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));
- }
复制代码 工具
计时
[code]//#includeTimer tm(TimerBase::SECONDS);//设置以秒为单位 cout |