使用的库: c r y p t o + + crypto++ crypto++;使用语言: c p p cpp cpp;使用开发工具: v s 2017 vs2017 vs2017
1. 主要思路
2. 关键类的作用
-
FileSink : a . :a.\space :a. 使用BufferedTransformation将数据写入文件; b . b.\space b. 传递现有的ostream,库将对其进行写入; c . \space c.\space c. 可以让该库为您打开一个ostream(在这种情况下,将使用ios :: trunc打开文件)。
- 伴随源对象是FileSource→文件写入数据
-
HexEncoder将字节编码为基数为16的编码数据。 伙伴解码器是HexDecoder。
- HexEncoder和HexDecoder字母为0123456789ABCDEF。 解码器接受大写和小写值。
- HexEncoder采用指向BufferedTransformation的指针。 因为使用了指针,所以HexEncoder拥有附加的转换,因此将销毁它。 有关更多详细信息,请参见所有权。
- 如果您需要将字节数组快速格式化为适合源代码的C样式数组或C字符串,请参阅ArrayEncoder。
-
StringSource是字节数组、C 字符串和C++字符串的源。可以实现对源与字符串之间的映射。
-
BufferedTransformation :是加密器中数据流的基本单位。从缓冲转换派生的对象可以参与管道。管道中的每个筛选器在通往Sink的路由中以某种方式转换数据,而缓冲转换提供跨对象的接口。
- 缓冲转换是转换、流转换和哈希转换的概括。
数据
接收
包含的
去往其中会进行数据的转换
传入参数
提供跨对象的接口,完成数据流的通用形态
传入参数
源
接收器
管道Pipelining
BufferedTransformation
筛选器
Sink的路由
3. 具体实现
注意:这个实现是使用crypto++第三方库进行调用实现,并不是自己编写
#include<hex.h>
#include<files.h>
int main(){
using namespace CryptoPP;
//使用输出流,输出到文件中,但是这个文件还没有保存
HexEncoder encoder(new FileSink(std::cout));
std::string msg = "Yoda said, Do or do not. There is no try.";
std::string digest;
SHA256 hash;
//1、使用update添加数据
hash.Update((const byte*)msg.data(), msg.size());
digest.resize(hash.DigestSize());//将最后的hash接收设为SHA-256的hash字节大小
//final计算并重置哈希
hash.Final((byte*)&digest[0]);
std::cout << "Message: " << msg << std::endl;
std::cout << "Digest: ";
/*
1. 重定向器是不属于其附加转换的接收器。重定向器将结束所有权链,但仍将其接收的数据传递给其引用的筛选器(在 此特定情况下避免了附加的单词)。由于重定向器最终不拥有附加的转换,因此缓冲区转换引用将传递给构造函数而 不是指针。
2. 关键是BufferedTransformation的子类,所以可以直接带入StringSource
*/
StringSource(digest, true, new Redirector(encoder));
std::cout << std::endl;
}
4. 结果
5. 参考文章
来源:oschina
链接:https://my.oschina.net/u/4364022/blog/4325670