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

孤者浪人 提交于 2020-08-07 15:10:29

使用的库: c r y p t o + + crypto++ crypto++;使用语言: c p p cpp cpp;使用开发工具: v s 2017 vs2017 vs2017

1. 主要思路

SHA-256实现流程.png
思路图

2. 关键类的作用

  1. FileSink : a .   :a.\space :a. 使用BufferedTransformation将数据写入文件; b .   b.\space b. 传递现有的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的路由中以某种方式转换数据,而缓冲转换提供跨对象的接口。

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

1.crypto++维基

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!