SHA1加密 c實現

2021-09-17 20:53:59 字數 3062 閱讀 2012

在vs2013下編譯且成功實現。

sha1加密演算法實現思路:

前提:需要乙個

unsigned long w[80]

unsigned long h[5]

unsigned long a,b,c,d,e

unsigned long temp

對明文首先進行填充,假設明文為p,

則p的bit長度要滿足 % 512 == 448

不滿足需要高位填充乙個1,其餘位補充0,最後的64位填充長度,假設bit長度為0x70注意記憶體裡 我們看到的是00 00 00 00 00 00 00 70(十六進製制)

填充完後 512bit(64位元組)一組 每組分成32個字(4位元組)

首先需要將w[0] ~ w[15]填充為我們自己的data

然後依據

temp = w[i -3]

^ w[i -8]

^ w[i -14]

^ w[i -16]

;w[i]

=roleft

(temp,1)

;

生成之後的w[i],其中roleft為迴圈左移n位

接著就可以進行運算了,首先h[5]陣列的五個常數起始值,然後傳遞給a,b,c,d,e作為臨時變數儲存中間結果,最後再賦值給h[5]作為下乙個塊的起始值。

運算過程:每20組會更換乙個常數ki和乙個迭代公式

具體參考**如下(c實現):

/*

sha1 演算法產出的是160位的摘要 即 32 * 5長度

有五個字(這裡為32位)

*/#include

#include

#include

#pragma warning(disable:4309)

#pragma warning(disable:4996)

#define each_hadle_len 64

//每次處理64位元組

char cipher[40]

="\0"

;//32 * 5 32位表示 8個十六進製制

typedef

struct sha1_context

sha1_context;

dword roleft

(dword value,

int index)

void

sha1init

(sha1_context *sha1)

void

processeachblock

(sha1_context *sha1)

for(i =

16; i <

80; i++

)//初始化a b c d e

a = sha1->hashres[0]

; b = sha1->hashres[1]

; c = sha1->hashres[2]

; d = sha1->hashres[3]

; e = sha1->hashres[4]

;for

( i =

0; i <

20; i++

)for

(i =

20; i <

40; i++

)for

(i =

40; i <

60; i++

)for

(i =

60; i <

80; i++

)//獲得新的hash值

sha1->hashres[0]

+= a;

sha1->hashres[1]

+= b;

sha1->hashres[2]

+= c;

sha1->hashres[3]

+= d;

sha1->hashres[4]

+= e;

}//每次處理512bit 即是處理64位元組

void

sha1update

(sha1_context *sha1,

char

*data)

//對最後進行一輪進行一些補位操作 這裡先清空 這樣就可以不需要填0操作

memset

(sha1->block,0,

sizeof

(char

)* each_hadle_len)

;memcpy

(sha1->block, data, sha1->length)

;//剩餘的資料進行填充

sha1->block[sha1->length]

=0x80

;//最高位填充1

unsigned

long

long bitlen = sha1->length <<3;

//獲得bit長度 從而填充最後64bit位

memcpy(&

(sha1->block[56]

),&bitlen,

sizeof

(unsigned

long

long))

;//直接copy記憶體的話 因為記憶體是小端序的 所以非常方便 學到了!

for(

int i =

0; i <

4; i++

)processeachblock

(sha1)

;//最後一次運算

}void

printsha1

(sha1_context *sha1)

}void

sha1encrypt

(char

*data)

//傳入要加密的資料

;sha1init

(&sha1)

;//初始化長度

sha1update

(&sha1, data)

;//產生40位元組的hash值

printsha1

(&sha1);}

intmain()

asp下sha1加密函式

sha1.asp檔案 function sha1 data sha1 hex sha1 data end function 呼叫檔案 response.write sha1 abcdef 得到的結果為 1f8ac10f23c5b5bc1167bda84b833e5c057a77d2 asp.net的...

如何使用java進行sha1加密

安全雜湊演算法 secure hash algorithm 主要適用於數字簽名 標準 digital signature standard dss 裡面定義的數字簽名演算法 digital signature algorithm dsa 在sha1演算法中,我們必須把原始訊息 字串,檔案等 轉換成位...

hashlib模組 md5加密,sha1加密

python py 1 2 3 4 time 2018 1 31 author songhao zeropython file encrypt md5.py python py import hashlib python 內建的 hashlib 模組提供了常見的摘要演算法 或稱雜湊演算法,雜湊演算法...