2012年10月,美國NIST選擇了Keccak算法作爲SHA - 3的標準算法,Keccak擁有良好的加密性能以及抗解密能力。
介紹 Keccak
Keccak算法(讀作爲“ket-chak”)是Guido 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文件