CSHADigest:SHA1 Digest 算法的快速单类实现






2.60/5 (4投票s)
2005 年 3 月 14 日
2分钟阅读

42317

1087
在Unix/Win下的SHA1摘要的单类实现 - 简单而快速。
目录
一、引言
CSHADigest
类的设计目标是快速,并且可以轻松集成到独立平台上的应用程序中。此类符合 SHA1 摘要 160 位定义。
注意:演示项目可在 UNIX 和 Win 平台上运行。
II. 概述
class CSHADigest { public: /*******************************************/ /* Constructor and Destructor definitions */ /*******************************************/ CSHADigest(); virtual ~CSHADigest(); /*******************************************/ /* Use for compute SHA from a file */ /*******************************************/ int ComputeInputFile(const char filePathName[]); /*******************************************/ /* Use for compute SHA from a buffer */ /*******************************************/ void Start(); int ComputeInputBuffer(const uByte* buffer, uInt32 bufferSize); void Stop(); /*******************************************/ /* Return the last result */ /*******************************************/ //Note : Valid only after call Stop() uByte* GetByteResult(); void GetByteResult(uByte* byteResult); char* GetHexResult(); void GetHexResult(char* hexResult); /*******************************************/ /* Static functions (perhaps usefull) */ /*******************************************/ static uInt32 GetFileSize(const char filePathName[]); static void ConvertByteResultToHexResult(const uByte* byteResult, char* hexResult); protected: /******************************************************/ /* Context struct for each call of ComputeInputBuffer */ /******************************************************/ struct SSHAContext { uInt32 intermediateHash[5]; uInt32 lengthLow; uInt32 lengthHigh; uInt16 messageBlockIndex; uByte messageBlock[64]; }; SSHAContext SHAContext; /******************************************************/ /* Internal functions for computation */ /******************************************************/ void PadMessage(); void ProcessMessageBlock(); /******************************************************/ /* this buffer include the last SHA Digest result */ /******************************************************/ uByte byteResult[20]; char hexResult[41]; };
III. 使用CSHADigest类
如何摘要一个字符串
void Start(); int ComputeInputBuffer(const uByte* buffer, uInt32 bufferSize); void Stop();
步骤 1:创建一个 CSHADigest
类的实例。
CSHADigest SHADigest;
步骤 2:使用 Start()
初始化摘要过程。
步骤 3:每次需要时调用 ComputeInputBuffer()
。如果检测到错误,则返回 0,否则返回 1。
步骤 4:完成并且要计算结果时,调用 Stop()
。
获取摘要结果调用
char* GetHexResult()
(SHA摘要以十六进制格式编码为 40 个字符。)
或
uByte* GetByteResult()
(SHA摘要以二进制格式编码为 20 个字节。)
在SHADigest.cpp 文件中查看 main 函数,以获得一个很好的例子。
警告:GetByteResult()
(或 GetHexResult()
)返回的 SHA 摘要结果仅在 SHADigest
实例存在期间有效。在其他情况下,最好使用 GetByteResult(uByte* byteResult)
(或 GetHexResult(char* hexResult)
)。
如何摘要一个文件
int ComputeInputFile(const char filePathName[]);
步骤 1:创建一个 CSHADigest
类的实例。
CSHADigest SHADigest;
步骤 2:只需使用有效的文件路径作为参数调用 ComputeInputFile()
。如果检测到错误,则返回 0,否则返回 1。
获取摘要结果调用
char* GetHexResult()
(摘要以十六进制格式编码为 40 个字符。)
或
uByte* GetByteResult()
(摘要以二进制格式编码为 20 个字节。)
查看 SHADigest.cpp 文件以获得一个很好的例子。
警告:GetByteResult()
(或 GetHexResult()
)返回的 SHA 摘要结果仅在 SHADigest
实例存在期间有效。在其他情况下,最好使用 GetByteResult(uByte* byteResult)
(或 GetHexResult(char* hexResult)
)。
使用SHADigest程序
在 Windows 平台上
编译并将 SHADigest.exe 复制到 [根目录盘符]\windows\System32\ 文件夹中。
现在,启动一个新的命令解释器实例 (cmd.exe)
使用以下参数执行 SHADigest
要计算文件的 SHADigest
SHADigest -f FilePathName (or just SHADigest FilePathName)
要计算字符串的 SHADigest
SHADigest -s string
要计算一些字符串的 SHADigest
SHADigest -s string1 string2 [...] stringN
在 Unix 平台上
要编译该程序,请输入 make。要将 SHADigest 复制到 /usr/bin/ 文件夹中,只需键入 make install。(您必须以 root 身份登录。)
现在,启动一个 shell。使用以下参数执行 SHADigest
要计算文件的 SHADigest
SHADigest -f FilePathName (or just SHADigest FilePathName)
要计算字符串的 SHADigest
SHADigest -s string
要计算一些字符串的 SHADigest
SHADigest -s string1 string2 [...] stringN