民工心事 发表于 2022-8-11 17:06:13

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]
查看完整版本: crypto++笔记