SHA3 加密算法C語言測試代碼(基於Keccak算法)

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章