日韩性视频-久久久蜜桃-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ò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲欧美少妇 | jizz国产在线观看 | 福利在线播放 | 九草在线观看 | 最新av在线播放 | 中文在线资源天堂 | 色综合图区 | 日韩成人av免费在线观看 | 18禁裸乳无遮挡啪啪无码免费 | 久色91| 筱田优av| a久久久久 | 男人的天堂影院 | 国产精品成人3p一区二区三区 | 午夜视频污 | 色福利在线 | 欧美三级电影在线观看 | 天天草综合 | 国产高清成人久久 | 国产一区二区自拍视频 | 麻豆网站在线看 | 国产午夜av | 在线毛片网 | 人人草人人插 | 神马影院一区二区 | 色哟哟一区二区 | 国产精品污www一区二区三区 | 色哟哟精品一区 | 欧美人与禽zozzo性之恋的特点 | 久久精品国产亚洲av无码娇色 | 午夜资源网 | 国产精品久久婷婷 | www.九九热 | 一二三不卡 | 毛片一级视频 | 天天想你在线观看完整版电影免费 | 人人妻人人澡人人爽欧美一区双 | 免费av网站在线 | 欧美精品二区三区四区免费看视频 | 日韩精品少妇 | 国产激情视频一区二区 | 重口另类| 日韩二区三区四区 | 成人天堂网| 国产一级大片在线观看 | 精品国产一区在线 | 午夜在线观看免费视频 | 亚洲一区二区视频在线观看 | 性xxx18| 99久久99久久精品国产片桃花 | av网站免费在线观看 | 成人一级网站 | 四季av一区二区三区免费观看 | 中文字幕91爱爱 | 亚洲av无码专区在线电影 | 国产精品久久久久久福利 | 精品精品 | 国产精品乱码一区二三区小蝌蚪 | 五月婷婷狠狠爱 | 黑人玩弄人妻一区二区三区四 | 日韩精品中文字幕在线播放 | 青青艹av | 国产永久视频 | 青青色在线 | 久久神马影院 | 日韩久 | 中国美女黄色一级片 | 欧美第五页 | 久久精品久久国产 | 99久久精品无免国产免费 | 毛片基地免费 | 狠狠狠狠狠狠狠干 | 免费在线看黄视频 | 免费毛片一区二区三区久久久 | 午夜影院在线免费观看 | 国产91在线免费观看 | 黑人操少妇 | 97av视频在线 | 亚洲成a人片在线www | 国产精品色哟哟 | 美女黄色免费网站 | 国产r级在线 | 在线免费观看a视频 | 男女激情实录 | 日本韩国在线 | 国产免费91 | 国产色吧| 亚洲一区二区三区播放 | 先锋影视av | 中文字幕一区二区久久人妻网站 | 后进极品美女圆润翘臀 | 中文字幕高清在线 | 美女超碰在线 | 国产亚洲精品成人无码精品网站 | 欧美美女啪啪 | a天堂中文在线观看 | 女人扒开屁股让我添 | 成人3d动漫在线观看 | xxxx.国产|