65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.60/5 (4投票s)

2005 年 3 月 14 日

2分钟阅读

viewsIcon

42317

downloadIcon

1087

在Unix/Win下的SHA1摘要的单类实现 - 简单而快速。

CSHADigest1.jpg (20013 octets)

CSHADigest2.jpg (44367 octets)

目录

  1. 引言
  2. 概述
  3. 使用CSHADigest类
  4. 使用SHADigest程序

一、引言

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 平台上

CSHADigest1.jpg (20013 octets)

编译并将 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 平台上

CSHADigest2.jpg (44367 octets)

要编译该程序,请输入 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
© . All rights reserved.