SHA-256使用以及相關流程說明

使用的庫:crypto++crypto++;使用語言:cppcpp;使用開發工具:vs2017vs2017

1. 主要思路

SHA-256實現流程.png
思路圖

2. 關鍵類的作用

  1. FileSink:a. :a.\space使用BufferedTransformation將數據寫入文件b. b.\space傳遞現有的ostream,庫將對其進行寫入 c. \space c.\space可以讓該庫爲您打開一個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++維基

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章