SHA-256使用以及相关流程说明

使用的库:crypto++crypto++crypto++;使用语言:cppcppcpp;使用开发工具:vs2017vs2017vs2017

1. 主要思路

SHA-256使用以及相关流程说明
SHA-256使用以及相关流程说明

2. 关键类的作用

  1. FileSink:a. :a.\space:a. 使用BufferedTransformation将数据写入文件b. b.\spaceb. 传递现有的ostream,库将对其进行写入 c. \space c.\space c. 可以让该库为您打开一个ostream(在这种情况下,将使用ios :: trunc打开文件)。

    • 伴随源对象是FileSource→文件写入数据
  2. HexEncoder将字节编码为基数为16的编码数据。 伙伴解码器是HexDecoder。

    • HexEncoder和HexDecoder字母为0123456789ABCDEF。 解码器接受大写和小写值。
    • HexEncoder采用指向BufferedTransformation的指针。 因为使用了指针,所以HexEncoder拥有附加的转换,因此将销毁它。 有关更多详细信息,请参见所有权。
    • 如果您需要将字节数组快速格式化为适合源代码的C样式数组或C字符串,请参阅ArrayEncoder。
  3. StringSource字节数组、C 字符串和C++字符串的源。可以实现对源与字符串之间的映射。

  4. BufferedTransformation是加密器中数据流的基本单位。从缓冲转换派生的对象可以参与管道。管道中的每个筛选器在通往Sink的路由中以某种方式转换数据,而缓冲转换提供跨对象的接口。

    • 缓冲转换是转换流转换哈希转换的概括。
数据接收包含的去往其中会进行数据的转换传入参数提供跨对象的接口,完成数据流的通用形态传入参数接收器管道PipeliningBufferedTransformation筛选器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. 结果

SHA-256使用以及相关流程说明

5. 参考文章

1.crypto++维基

上一篇:python3.7安装Crypto


下一篇:[转]Apache Commons IO入门教程