使用的庫:;使用語言:;使用開發工具:
1. 主要思路
2. 關鍵類的作用
-
FileSink使用BufferedTransformation將數據寫入文件; 傳遞現有的ostream,庫將對其進行寫入;可以讓該庫爲您打開一個ostream(在這種情況下,將使用ios :: trunc打開文件)。
- 伴隨源對象是FileSource→文件寫入數據
-
HexEncoder將字節編碼爲基數爲16的編碼數據。 夥伴解碼器是HexDecoder。
- HexEncoder和HexDecoder字母爲0123456789ABCDEF。 解碼器接受大寫和小寫值。
- HexEncoder採用指向BufferedTransformation的指針。 因爲使用了指針,所以HexEncoder擁有附加的轉換,因此將銷燬它。 有關更多詳細信息,請參見所有權。
- 如果您需要將字節數組快速格式化爲適合源代碼的C樣式數組或C字符串,請參閱ArrayEncoder。
-
StringSource是字節數組、C 字符串和C++字符串的源。可以實現對源與字符串之間的映射。
-
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;
}