crypto++笔记

打印 上一主题 下一主题

主题 538|帖子 538|积分 1614

《深入浅出cryptoPP密码学库》学习笔记。crypto++库帮助文档:https://www.cryptopp.com/docs/ref/index.html
进制与编码

以2进制,8进制,10进制,16进制字符串构造整数
  1. Integer Int2("011111101010000b");
  2. Integer Int8("102345676543210o");
  3. Integer Int10("1234567890987654321");
  4. Integer Int16("1234567890ABCDEFh");
复制代码
base系列编码算法定义在各base64.h base32.h hex.h头文件中
  1. //base64编码与解码
  2. #include<iostream>
  3. #include<base64.h>
  4. #include<files.h>
  5. using namespace std;
  6. using namespace CryptoPP;
  7. int main()
  8. {
  9.         string message= "我我我我我我我我我我我";
  10.         StringSource Base64String(message, true, new Base64Encoder(new FileSink(cout)));
  11.         string base64Message = "ztLO0s7SztLO0s7SztLO0s7SztLO0g==";
  12.         StringSource Base64String2(base64Message, true, new Base64Decoder(new FileSink(cout)));
  13. }
复制代码
ASN.1定义了一套编码标准,其中有BER,DER等,为了与PGP,openSSL兼容,cryptopp定义了对数据进行BER,DER编解码的函数
生成一个512位随机数,并保存为der格式文件
  1. #include<iostream>
  2. #include<osrng.h>
  3. #include<files.h>
  4. using namespace std;
  5. using namespace CryptoPP;
  6. int main()
  7. {
  8.         Integer bigNumber;
  9.         AutoSeededRandomPool rng;
  10.         bigNumber.Randomize(rng, 512);
  11.         bigNumber.DEREncode(FileSink("bignumber.der").Ref());
  12. }
复制代码
pipeling数据处理范式

该范式将数据比作水流,从source经过filter最终流向sink
cryptopp将所有数据源称为source,所有数据处理类称为filter,所有能存储数据的特定数据结构称为sink
从StringSource流向HexEncoder再流向FileSink
  1. #include<iostream>
  2. #include<hex.h>
  3. #include<files.h>
  4. using namespace std;
  5. using namespace CryptoPP;
  6. int main()
  7. {
  8.         string my;
  9.         cin >> my;
  10.         StringSource myCin(my, true, new HexEncoder(new FileSink("my.txt")));
  11. }
复制代码
source可以使用GET()取出数据,sink可以使用PUT()放入数据,filter可以使用GET()和PUT()取出或放入数据
  1. #include<iostream>
  2. #include<hex.h>
  3. #include<files.h>
  4. #include<secblock.h>
  5. using namespace std;
  6. using namespace CryptoPP;
  7. int main()
  8. {
  9.         string my;
  10.         cin >> my;
  11.         SecByteBlock secGet(8);//每次取8个字符
  12.         StringSource myCin(my, true);
  13.         HexEncoder hexEncoder;
  14.         FileSink fileSink("my.txt");
  15.         myCin.Get(secGet, secGet.size());
  16.         hexEncoder.Put(secGet, secGet.size());
  17.         hexEncoder.Get(secGet, secGet.size());
  18.         fileSink.Put(secGet, secGet.size());
  19. }
复制代码
也可以通过Attach连接“流”的“水道”,通过Detach更改“水道”
  1. #include<iostream>
  2. #include<hex.h>
  3. #include<files.h>
  4. #include<secblock.h>
  5. using namespace std;
  6. using namespace CryptoPP;
  7. int main()
  8. {
  9.         string my;
  10.         cin >> my;
  11.         StringSource myCin(my, true);
  12.         HexEncoder hexEncoder;
  13.         SecByteBlock secGet(2);
  14.         hexEncoder.Attach(new FileSink("my.txt"));
  15.         myCin.Get(secGet, secGet.size());
  16.         hexEncoder.Put(secGet, secGet.size());
  17.         hexEncoder.Detach(new FileSink(cout));
  18.         myCin.Get(secGet, secGet.size());
  19.         hexEncoder.Put(secGet, secGet.size());
  20. }
复制代码
通过Redirector和ChannelSwitch多“水道”输出
示例中加入了不经过filter处理的,转为16进制处理的,base64处理的多个“水道”,在通过Redirector连接。
  1. #include<iostream>
  2. #include<hex.h>
  3. #include<files.h>
  4. #include<secblock.h>
  5. #include<base64.h>
  6. #include<channels.h>
  7. using namespace std;
  8. using namespace CryptoPP;
  9. int main()
  10. {
  11.         string my;
  12.         cin >> my;
  13.         FileSink o(cout);
  14.         HexEncoder hexEncoder(new FileSink(cout));
  15.         Base64Encoder base64Encoder(new FileSink(cout));
  16.         ChannelSwitch cs;
  17.         cs.AddDefaultRoute(o);
  18.         cs.AddDefaultRoute(hexEncoder);
  19.         cs.AddDefaultRoute(base64Encoder);
  20.         StringSource myCin(my, true, new Redirector(cs));
  21. }
复制代码
工具

计时

[code]//#includeTimer tm(TimerBase::SECONDS);//设置以秒为单位        cout
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

民工心事

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表