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

MD5讯息摘要演算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码杂凑函数,可以产生出一个128位元(16位元组)的散列值(hash value),用于确保信息传输完整一致。

go 调用 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)
}

运行结果

go run md5.go//运行结果
5eb63bbbe01eeed093cb22bb8f5acdc3
5eb63bbbe01eeed093cb22bb8f5acdc3

md5 实现原理

对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

  1. 填充:如果输入信息的长度(bit)对512求余的结果不等于448,就需要填充使得对512求余的结果等于448。填充的方法是填充一个1和n个0。填充完后,信息的长度就为N*512+448(bit);

  2. 记录信息长度:用64位来存储填充前信息长度。这64位加在第一步结果的后面,这样信息长度就变为N*512+448+64=(N+1)*512位。

  3. 装入标准的幻数(四个整数):标准的幻数(物理顺序)是(A=(01234567)16,B=(89ABCDEF)16,C=(FEDCBA98)16,D=(76543210)16)。如果在程序中定义应该是(A=0X67452301,B=0XEFCDAB89,C=0X98BADCFE,D=0X10325476)

  4. 四轮循环运算:循环的次数是分组的个数(N+1)

    • 将每一512字节细分成16个小组,每个小组64位(8个字节)
    • 先认识四个线性函数(&是与,|是或,^是异或)
    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)  
    • 设Mj表示消息的第j个子分组(从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)}

md5加密算法原理及其GO语言实现相关推荐

  1. MD5加密算法原理及一些其他的加密算法

    Md5加密算法: 概述:md5算法也可以称为消息摘要算法,属于hash算法的一种,md5算法对输入的任意长度的消息进行运行,然后产生一个128位的消息摘要 特点: #不可逆性 唯一性:相同数据的md5 ...

  2. 了解MD5加密算法原理及其应用

    了解MD5加密算法原理及其应用 前言 一.普通强度MD5破解方法 二.Md5算法应用 (1)MD5加密原理 (2)MD5的安全性 (3)MD5加密算法的应用 三.改进后的加密方法 (1)目前MD5加密 ...

  3. SM4加密算法原理以及C语言实现

    文章目录 一.算法原理描述 1.密钥及密钥参量: 2.加密算法: 3.解密算法: 4.密钥扩展算法: 二.C语言算法实现 .h部分代码: .c部分代码: 一.算法原理描述 SM4分组密码算法是一个迭代 ...

  4. 简要分析用MD5加密算法加密信息(如有疑问,敬请留言)

    一.引言 最近看了媒体的一篇关于"网络上公开叫卖个人隐私信息"报导,不法分子通过非法手段获得的个人隐私信息,其详细.准确程度简直令人瞠口结舌.在互联网飞速发展的现在,我们不难想到, ...

  5. php md5加密算法源码,MD5加密和哈希算法

    MD5加密算法为现在应用最广泛的哈希算法之一,该算法广泛应用于互联网网站的用户文件加密,能够将用户密码加密为128位的长整数.数据库并不明文存储用户密码,而是在用户登录时将输入密码字符串进行MD5加密 ...

  6. Md5加密算法的原理及应用

    MD5是一个安全的散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程不可逆:所以要解密MD5没有现成的算法,只能用穷举法,把可能出现的明文,用MD5算法散列之后 ...

  7. 关于Md5加密算法的原理及应用

    MD5是一个安全的散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程不可逆:所以要解密MD5没有现成的算法,只能用穷举法,把可能出现的明文,用MD5算法散列之后 ...

  8. MD5加密算法的原理和应用

    MD5是一个安全的散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程不可逆:所以要解密MD5没有现成的算法,只能用穷举法,把可能出现的明文,用MD5算法散列之后 ...

  9. C语言实现MD5加密算法

    转载声明:http://blog.csdn.net/haroroda/article/details/45935099 这次我分享的是MD5加密算法.其实MD5这个大名在还没上密码学课之前我就听说过了 ...

最新文章

  1. Java改知能机_Java 面试突击之 Java 并发知识基础 进阶考点全解析
  2. 实时的激光雷达点云压缩
  3. jenkins自动化部署工具
  4. 前端每日实战:56# 视频演示如何用纯 CSS 描述程序员的生活
  5. 数据库管理系统与数据库系统
  6. 批量 材质 调整_寒霜引擎的PBR实践3.0(一)材质篇
  7. Python数学问题2:求100以内素数之和
  8. [160]八款最佳的远程桌面工具
  9. html弹窗乱码,javascript弹窗是乱码怎么办?
  10. 公司让微信加人有没有软件_没有人想要使用软件
  11. 致远OA表单自定义函数(明细表排名 )
  12. android反加密反加固,[原创]记一次爱加密反调试分析及绕过思路
  13. origin画图软件 多个子图融合
  14. 论文阅读笔记- Dremel
  15. R语言-出图时的中英文字体解决方案
  16. Piggy-Bank - 九度教程第 102 题
  17. 阿语python美多商城-商品-商品详情页之第6.6.1节商品详情页分析和准备
  18. 用74ls90及少量器件制作电子时钟
  19. Java设计模式面试题总结
  20. Google机器学习速成课程 - 视频笔记整理汇总 - 基础篇核心部分

热门文章

  1. ML之sklearn:sklearn.metrics中常用的函数参数(比如confusion_matrix等 )解释及其用法说明之详细攻略
  2. CV之FR:DIY脚本通过人脸图像得到人脸特征向量并输出多张人脸图片之两两图片之间的距离
  3. 从去除噪点的说起,有OpenCV要什么PS?
  4. os_mutex.c(全)
  5. pycharm专业版-2017.3.3 安装+anaconda3-2019.03-windows
  6. react-native-sound的使用
  7. 图片懒加载原理-实例二
  8. mysql百万级分页优化
  9. hdu 4268 Alice and Bob(STL版)
  10. STM32的启动分析