如下两篇文章介绍的非常详细的介绍了SHA3加密标准原理
中文链接:http://www.oschina.net/translate/keccak-the-new-sha-3-encryption-standard
英文链接:http://www.drdobbs.com/security/keccak-the-new-sha-3-encryption-standard/240154037
下面是SHA3-224、SHA3-256、SHA3-384、SHA3-512测试代码
main.c
#include "sha3nist.h"
#include
#include
#include
//---------------------------------------
/****************************************/
//宏定义转换类型
//#define HASHBITL_64 64
#define HASHBITL_224 224
#define HASHBITL_256 256
#define HASHBITL_384 384
#define HASHBITL_512 512
/****************************************/
/****************************************/
//函数声明
void HashMyself(int opt_hashBitL, unsigned char *message_value, int len);//SHA3哈希转换
/****************************************/
/****************************************/
//定义全局变量
#define MAX_MESSAGE_DIGEST 512 //定义最大消息摘要长度
unsigned char message_digest[MAX_MESSAGE_DIGEST] = "HELLO HASH";//需要加密的消息摘要
/****************************************/
int main(int argc,char *argv[])
{
//printf("\nmessage_digest:%s\n", message_digest);
#if 0
FILE *fp0=fopen("message_digest.txt", "r");//打开文件
if (fp0==NULL)
{
perror("message_digest.txt file open error!\n");
return -1;
}
else
{
//message_digest数组全部清0
memset(message_digest, 0, sizeof(message_digest));
//读取文件第1行的数据,保存在message_digest数组里
fgets((char *)message_digest,sizeof(message_digest),fp0);
//忽略读取到的第一行的数据,message_digest数组全部清0
memset(message_digest, 0, sizeof(message_digest));
//读取文件中第2行的数据,并保存在message_digest数组里
fgets((char *)message_digest,sizeof(message_digest),fp0);
//将读取的数据打印出来,方便查看
printf("Read the message digest for:%s\n", (const char *)message_digest);
}
fclose (fp0);//关闭文件描述符
#endif
HashMyself(HASHBITL_224, message_digest, strlen((const char *)message_digest)); //SHA-3 224哈希转换
HashMyself(HASHBITL_256, message_digest, strlen((const char *)message_digest)); //SHA-3 256哈希转换
HashMyself(HASHBITL_384, message_digest, strlen((const char *)message_digest)); //SHA-3 384哈希转换
HashMyself(HASHBITL_512, message_digest, strlen((const char *)message_digest)); //SHA-3 512哈希转换
return 0;
}
/************************************************
函 数 名:HashMyself
功 能:SHA-3哈希转换
输入参数:opt_hashBitL 输出长度值(长度可以为224、256、384、512bit)
message_value:消息摘要
len:消息摘要的长度
输 出:打印哈希转换值
*************************************************/
//SHA3哈希转换
void HashMyself(int opt_hashBitL, unsigned char *message_value, int len)
{
int i=0;
unsigned char dist[0x40] = {0};
int hashBitL = opt_hashBitL, hashL = hashBitL/8;
Hash(hashBitL, message_value, len*8, dist);
printf("\nThe hash-SHA-3 %d value:", hashBitL);
for (i=0;i
makefile
# 指令编译器和选项
CC=gcc
CFLAGS=-Wall -std=gnu99
# 目标文件
TARGET=HashCalc
# 源文件
SRCS=keccak.c sha3nist.c main.c
OBJS = $(SRCS:.c=.o)
$(TARGET):$(OBJS)
# @echo TARGET:$@
# @echo OBJECTS:$^
$(CC) -o $@ $^
clean:
rm -rf $(TARGET) $(OBJS)
%.o:%.c
$(CC) $(CFLAGS) -o $@ -c $<
完整测试代码下载地址:
http://download.csdn.net/download/baidu_34919559/9920184
测试说明
测试代码由makefile进行管理
将整个文件夹拷贝到Linux目录下,使用gcc编译
编译运行步骤:
1、在本文件夹目录下使用Linux命令行输入 make 进行编译链接生成可执行文件HashCalc
2. 命令行下输入 ./HashCalc 执行程序
命令行输入make clean可清理编译生成的文件
非Linux gcc编译器,不用makefile下
main.c依赖于keccak.c和sha3nist.c文件