SHA3 加密算法C语言测试代码(基于Keccak算法),sha3keccak


2012年10月,美国NIST选择了Keccak算法作为SHA - 3的标准算法,Keccak拥有良好的加密性能以及抗解密能力。

介绍 Keccak

Keccak算法读作为“ket-chakGuido Bertoni, Joan Daemen, Michael Peters, and Giles Van Assche工作 SHA-3候选人在2008年10月提交

Keccak采用了创新的“海绵引擎散列消息文本它是快速的,在英特尔酷睿2处理器下的平均速度为12.5周期每字节它设计简单,方便硬件实现

Keccak已可以抵御最小的复杂度为2n的攻击,其中N为散列的大小。它具有广泛的安全边际。至目前为止,第三方密码分析已经显示出Keccak没有严重的弱点。尽管如此,Keccak的创建者已经启动Crunchy加密比赛,挑起人们发现和报告成功且可核查的攻击Keccak的兴趣

如下两篇文章介绍的非常详细的介绍了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 <stdio.h>
#include <string.h>
#include <stdlib.h>
//---------------------------------------

/****************************************/
//宏定义转换类型
//#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<hashL;i++)
	{
		if(i%0x10==0)
			printf("\n");
		printf("%02x ",dist[i]);//输出小写
		//printf("%02X ",dist[i]);//输出大写
	}
	printf("\n");
}



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文件


0
0
   

查看评论

相关内容

    暂无相关文章