日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

md5加密算法原理及其GO语言实现

發(fā)布時(shí)間:2025/3/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 md5加密算法原理及其GO语言实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

md5加密算法原理及其GO語(yǔ)言實(shí)現(xiàn)

MD5訊息摘要演算法(英語(yǔ):MD5 Message-Digest Algorithm),一種被廣泛使用的密碼雜湊函數(shù),可以產(chǎn)生出一個(gè)128位元(16位元組)的散列值(hash value),用于確保信息傳輸完整一致。

go 調(diào)用 md5 方法

新建 md5.go 文件,代碼如下:

package mainimport("fmt""crypto/md5""encoding/hex" )func main(){data := []byte("hello world")s := fmt.Sprintf("%x", md5.Sum(data))fmt.Println(s)// 也可以用這種方式h := md5.New()h.Write(data)s = hex.EncodeToString(h.Sum(nil))fmt.Println(s) }

運(yùn)行結(jié)果

go run md5.go//運(yùn)行結(jié)果 5eb63bbbe01eeed093cb22bb8f5acdc3 5eb63bbbe01eeed093cb22bb8f5acdc3

md5 實(shí)現(xiàn)原理

對(duì)MD5算法簡(jiǎn)要的敘述可以為:MD5以512位分組來(lái)處理輸入的信息,且每一分組又被劃分為16個(gè)32位子分組,經(jīng)過(guò)了一系列的處理后,算法的輸出由四個(gè)32位分組組成,將這四個(gè)32位分組級(jí)聯(lián)后將生成一個(gè)128位散列值。

  • 填充:如果輸入信息的長(zhǎng)度(bit)對(duì)512求余的結(jié)果不等于448,就需要填充使得對(duì)512求余的結(jié)果等于448。填充的方法是填充一個(gè)1和n個(gè)0。填充完后,信息的長(zhǎng)度就為N*512+448(bit);

  • 記錄信息長(zhǎng)度:用64位來(lái)存儲(chǔ)填充前信息長(zhǎng)度。這64位加在第一步結(jié)果的后面,這樣信息長(zhǎng)度就變?yōu)镹*512+448+64=(N+1)*512位。

  • 裝入標(biāo)準(zhǔn)的幻數(shù)(四個(gè)整數(shù)):標(biāo)準(zhǔn)的幻數(shù)(物理順序)是(A=(01234567)16,B=(89ABCDEF)16,C=(FEDCBA98)16,D=(76543210)16)。如果在程序中定義應(yīng)該是(A=0X67452301,B=0XEFCDAB89,C=0X98BADCFE,D=0X10325476)

  • 四輪循環(huán)運(yùn)算:循環(huán)的次數(shù)是分組的個(gè)數(shù)(N+1)

    • 將每一512字節(jié)細(xì)分成16個(gè)小組,每個(gè)小組64位(8個(gè)字節(jié))
    • 先認(rèn)識(shí)四個(gè)線性函數(shù)(&是與,|是或,^是異或)
    F(X,Y,Z)=(Y ^ Z) & X) ^ Z G(X,Y,Z)=((X ^ Y) & Z) ^ Y H(X,Y,Z)=X ^ Y ^ Z I(X,Y,Z)=Y ^ (X | ^Z)
    • 設(shè)Mj表示消息的第j個(gè)子分組(從0到15),<<
  • 完整代碼

    package mainimport("fmt""unsafe" )const Size = 16const (chunk = 64init0 = 0x67452301init1 = 0xEFCDAB89init2 = 0x98BADCFEinit3 = 0x10325476 ) // digest represents the partial evaluation of a checksum. type digest struct {s [4]uint32x [chunk]bytenx intlen uint64 }func (d *digest) Reset() {d.s[0] = init0d.s[1] = init1d.s[2] = init2d.s[3] = init3d.nx = 0d.len = 0 }func (d *digest) Write(p []byte) (nn int, err error) {nn = len(p)d.len += uint64(nn)if d.nx > 0 {n := copy(d.x[d.nx:], p)d.nx += nif d.nx == chunk {blockGeneric(d, d.x[:])d.nx = 0}p = p[n:]}if len(p) >= chunk {n := len(p) &^ (chunk - 1)blockGeneric(d, p[:n])p = p[n:]}if len(p) > 0 {d.nx = copy(d.x[:], p)}fmt.Printf("%v\n",d)return }func (d *digest) checkSum() [Size]byte { // Padding. Add a 1 bit and 0 bits until 56 bytes mod 64.len := d.lenvar tmp [64]bytetmp[0] = 0x80if len%64 < 56 {d.Write(tmp[0 : 56-len%64])fmt.Printf("%v",d)} else {d.Write(tmp[0 : 64+56-len%64])} // Length in bits.len <<= 3for i := uint(0); i < 8; i++ {tmp[i] = byte(len >> (8 * i))}d.Write(tmp[0:8])if d.nx != 0 {panic("d.nx != 0")}var digest [Size]bytefor i, s := range d.s {digest[i*4] = byte(s)digest[i*4+1] = byte(s >> 8)digest[i*4+2] = byte(s >> 16)digest[i*4+3] = byte(s >> 24)}return digest }func blockGeneric(dig *digest, p []byte) {a := dig.s[0]b := dig.s[1]c := dig.s[2]d := dig.s[3]var X *[16]uint32for len(p) >= chunk {aa, bb, cc, dd := a, b, c, dX = (*[16]uint32)(unsafe.Pointer(&p[0])) // Round 1.a += (((c ^ d) & b) ^ d) + X[0] + 3614090360a = a<<7 | a>>(32-7) + bd += (((b ^ c) & a) ^ c) + X[1] + 3905402710d = d<<12 | d>>(32-12) + ac += (((a ^ b) & d) ^ b) + X[2] + 606105819c = c<<17 | c>>(32-17) + db += (((d ^ a) & c) ^ a) + X[3] + 3250441966b = b<<22 | b>>(32-22) + ca += (((c ^ d) & b) ^ d) + X[4] + 4118548399a = a<<7 | a>>(32-7) + bd += (((b ^ c) & a) ^ c) + X[5] + 1200080426d = d<<12 | d>>(32-12) + ac += (((a ^ b) & d) ^ b) + X[6] + 2821735955c = c<<17 | c>>(32-17) + db += (((d ^ a) & c) ^ a) + X[7] + 4249261313b = b<<22 | b>>(32-22) + ca += (((c ^ d) & b) ^ d) + X[8] + 1770035416a = a<<7 | a>>(32-7) + bd += (((b ^ c) & a) ^ c) + X[9] + 2336552879d = d<<12 | d>>(32-12) + ac += (((a ^ b) & d) ^ b) + X[10] + 4294925233c = c<<17 | c>>(32-17) + db += (((d ^ a) & c) ^ a) + X[11] + 2304563134b = b<<22 | b>>(32-22) + ca += (((c ^ d) & b) ^ d) + X[12] + 1804603682a = a<<7 | a>>(32-7) + bd += (((b ^ c) & a) ^ c) + X[13] + 4254626195d = d<<12 | d>>(32-12) + ac += (((a ^ b) & d) ^ b) + X[14] + 2792965006c = c<<17 | c>>(32-17) + db += (((d ^ a) & c) ^ a) + X[15] + 1236535329b = b<<22 | b>>(32-22) + c // Round 2.a += (((b ^ c) & d) ^ c) + X[(1+5*0)&15] + 4129170786a = a<<5 | a>>(32-5) + bd += (((a ^ b) & c) ^ b) + X[(1+5*1)&15] + 3225465664d = d<<9 | d>>(32-9) + ac += (((d ^ a) & b) ^ a) + X[(1+5*2)&15] + 643717713c = c<<14 | c>>(32-14) + db += (((c ^ d) & a) ^ d) + X[(1+5*3)&15] + 3921069994b = b<<20 | b>>(32-20) + ca += (((b ^ c) & d) ^ c) + X[(1+5*4)&15] + 3593408605a = a<<5 | a>>(32-5) + bd += (((a ^ b) & c) ^ b) + X[(1+5*5)&15] + 38016083d = d<<9 | d>>(32-9) + ac += (((d ^ a) & b) ^ a) + X[(1+5*6)&15] + 3634488961c = c<<14 | c>>(32-14) + db += (((c ^ d) & a) ^ d) + X[(1+5*7)&15] + 3889429448b = b<<20 | b>>(32-20) + ca += (((b ^ c) & d) ^ c) + X[(1+5*8)&15] + 568446438a = a<<5 | a>>(32-5) + bd += (((a ^ b) & c) ^ b) + X[(1+5*9)&15] + 3275163606d = d<<9 | d>>(32-9) + ac += (((d ^ a) & b) ^ a) + X[(1+5*10)&15] + 4107603335c = c<<14 | c>>(32-14) + db += (((c ^ d) & a) ^ d) + X[(1+5*11)&15] + 1163531501b = b<<20 | b>>(32-20) + ca += (((b ^ c) & d) ^ c) + X[(1+5*12)&15] + 2850285829a = a<<5 | a>>(32-5) + bd += (((a ^ b) & c) ^ b) + X[(1+5*13)&15] + 4243563512d = d<<9 | d>>(32-9) + ac += (((d ^ a) & b) ^ a) + X[(1+5*14)&15] + 1735328473c = c<<14 | c>>(32-14) + db += (((c ^ d) & a) ^ d) + X[(1+5*15)&15] + 2368359562b = b<<20 | b>>(32-20) + c // Round 3.a += (b ^ c ^ d) + X[(5+3*0)&15] + 4294588738a = a<<4 | a>>(32-4) + bd += (a ^ b ^ c) + X[(5+3*1)&15] + 2272392833d = d<<11 | d>>(32-11) + ac += (d ^ a ^ b) + X[(5+3*2)&15] + 1839030562c = c<<16 | c>>(32-16) + db += (c ^ d ^ a) + X[(5+3*3)&15] + 4259657740b = b<<23 | b>>(32-23) + ca += (b ^ c ^ d) + X[(5+3*4)&15] + 2763975236a = a<<4 | a>>(32-4) + bd += (a ^ b ^ c) + X[(5+3*5)&15] + 1272893353d = d<<11 | d>>(32-11) + ac += (d ^ a ^ b) + X[(5+3*6)&15] + 4139469664c = c<<16 | c>>(32-16) + db += (c ^ d ^ a) + X[(5+3*7)&15] + 3200236656b = b<<23 | b>>(32-23) + ca += (b ^ c ^ d) + X[(5+3*8)&15] + 681279174a = a<<4 | a>>(32-4) + bd += (a ^ b ^ c) + X[(5+3*9)&15] + 3936430074d = d<<11 | d>>(32-11) + ac += (d ^ a ^ b) + X[(5+3*10)&15] + 3572445317c = c<<16 | c>>(32-16) + db += (c ^ d ^ a) + X[(5+3*11)&15] + 76029189b = b<<23 | b>>(32-23) + ca += (b ^ c ^ d) + X[(5+3*12)&15] + 3654602809a = a<<4 | a>>(32-4) + bd += (a ^ b ^ c) + X[(5+3*13)&15] + 3873151461d = d<<11 | d>>(32-11) + ac += (d ^ a ^ b) + X[(5+3*14)&15] + 530742520c = c<<16 | c>>(32-16) + db += (c ^ d ^ a) + X[(5+3*15)&15] + 3299628645b = b<<23 | b>>(32-23) + c // Round 4.a += (c ^ (b | ^d)) + X[(7*0)&15] + 4096336452a = a<<6 | a>>(32-6) + bd += (b ^ (a | ^c)) + X[(7*1)&15] + 1126891415d = d<<10 | d>>(32-10) + ac += (a ^ (d | ^b)) + X[(7*2)&15] + 2878612391c = c<<15 | c>>(32-15) + db += (d ^ (c | ^a)) + X[(7*3)&15] + 4237533241b = b<<21 | b>>(32-21) + ca += (c ^ (b | ^d)) + X[(7*4)&15] + 1700485571a = a<<6 | a>>(32-6) + bd += (b ^ (a | ^c)) + X[(7*5)&15] + 2399980690d = d<<10 | d>>(32-10) + ac += (a ^ (d | ^b)) + X[(7*6)&15] + 4293915773c = c<<15 | c>>(32-15) + db += (d ^ (c | ^a)) + X[(7*7)&15] + 2240044497b = b<<21 | b>>(32-21) + ca += (c ^ (b | ^d)) + X[(7*8)&15] + 1873313359a = a<<6 | a>>(32-6) + bd += (b ^ (a | ^c)) + X[(7*9)&15] + 4264355552d = d<<10 | d>>(32-10) + ac += (a ^ (d | ^b)) + X[(7*10)&15] + 2734768916c = c<<15 | c>>(32-15) + db += (d ^ (c | ^a)) + X[(7*11)&15] + 1309151649b = b<<21 | b>>(32-21) + ca += (c ^ (b | ^d)) + X[(7*12)&15] + 4149444226a = a<<6 | a>>(32-6) + bd += (b ^ (a | ^c)) + X[(7*13)&15] + 3174756917d = d<<10 | d>>(32-10) + ac += (a ^ (d | ^b)) + X[(7*14)&15] + 718787259c = c<<15 | c>>(32-15) + db += (d ^ (c | ^a)) + X[(7*15)&15] + 3951481745b = b<<21 | b>>(32-21) + ca += aab += bbc += ccd += ddp = p[chunk:]}dig.s[0] = adig.s[1] = bdig.s[2] = cdig.s[3] = d }func main() {var d digestd.Reset()data := []byte("hello world")d.Write(data)hashnum := d.checkSum()fmt.Printf("%x\n",hashnum)}

    總結(jié)

    以上是生活随笔為你收集整理的md5加密算法原理及其GO语言实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲福利在线观看 | 9l视频自拍九色9l视频 | 性色综合 | 亚洲 高清 成人 动漫 | 国产91美女视频 | 97在线免费观看 | 欧美一区二区高清视频 | 欧美日韩免费网站 | 18岁成年人网站 | 国产欧美一区二区精品久久久 | 西西人体高清44rt·net | 福利免费在线观看 | 女生被男生桶 | 久久精品国产亚洲AV成人婷婷 | 91av免费在线观看 | 欧美在线中文 | 狠狠操狠狠插 | 老司机在线观看视频 | 亚洲综合色自拍一区 | 日韩精品无码一本二本三本色 | 桃色一区 | 成人夜晚看av | av手机免费在线观看 | 少妇人妻偷人精品无码视频 | 天堂va蜜桃| fc2成人免费视频 | 亚洲一区精品视频在线观看 | 国产精品探花一区二区在线观看 | 毛片一级视频 | 午夜一区在线 | 精品久久精品久久 | 日本123区 | 亚洲精品乱码久久久久久久 | 男女无套免费视频网站动漫 | 一级特黄色片 | 欧美日韩国产高清视频 | 久久精品久久精品久久精品 | 歪歪6080 | 沟厕沟厕近拍高清视频 | 国产美女在线观看 | 伊人国产一区 | 国产3p露脸普通话对白 | 一二三四精品 | 成人精品 | 热久久av| 97精品国产 | 黄在线视频 | 亚洲性一区 | 97国产精品人人爽人人做 | 加勒比波多野结衣 | 中文字幕一区二区三区在线视频 | 懂色a v| 久久丫精品国产亚洲av不卡 | 97在线看 | 久久久噜噜噜久久 | 日本a视频 | 久久久精品中文字幕 | 欧美亚洲综合久久 | 综合亚洲网 | 中文字幕三级 | 久久久久久av无码免费看大片 | 国产123在线 | 波多在线播放 | av在线免费网址 | 中文字幕第8页 | 黄色一级片免费 | 超碰在线图片 | 一级午夜| 久久精品视频99 | 久久二| 神马一区二区三区 | 精品欧美一区二区三区免费观看 | 久热精品视频 | 国产专区在线视频 | 粉嫩av一区二区夜夜嗨 | 刘亦菲毛片一区二区三区 | 欧美成人精品在线视频 | 成人av网址在线 | 九九热免费在线视频 | 亚洲卡一| bbbbbxxxxx性欧美 | 成人久久18免费网站图片 | 国产69精品久久久 | 国产欧美激情在线观看 | 久久久久久久亚洲av无码 | 狠狠干在线观看 | 午夜免费福利在线观看 | 国产你懂得 | 婷婷五月花 | 国产一道本 | 国产女主播自拍 | 日韩精品中文字幕一区二区 | 国产99久久九九精品无码 | 国产精品无码粉嫩小泬 | 中文字幕天堂 | 9l视频自拍蝌蚪9l视频成人 | 国产一区亚洲二区三区 | 久久情趣视频 | 日韩大片在线观看 |