go实现md5

自己练习的代码,有错务在意,感谢

补位:
func opdata(x string){
var bytedata =[]byte(x)//将字符串转为字节数组
var bytelen = len(bytedata)//字节长
var bitlen = bytelen*8//位长
//FillSize = 448 - ((mLen * 8) % 512); //计算需填充的bit数
var needbit = 448 - (bitlen % 512)
var needbyte =needbit/8
var buf []byte
//如果小于448位
if bitlen<=448 {
for _,v:= range bytedata{
buf=append(buf,v)//将原数据加入切片
}
buf=append(buf,0x80)//补1
for i:=bytelen+1;i<56 ;i++ {
buf=append(buf,0x00)//补0
}
//填充后64位,为数据长度

	var ooo  [64]byte
	bytelen <<= 3
	for i := uint(0); i < 8; i++ {
		ooo[i] = byte(bytelen >> (8 * i))
	}
	for _,v:=range ooo [0:8] {
		buf=append(buf,v)
	}
} else if bitlen>448 {
	for _, v := range bytedata {
		buf = append(buf, v)
	}
	//补01
	buf = append(buf, 0x10)

	for i := 0; i < needbyte-1; i++ {
		buf = append(buf, 0x00)
	}
	//补长度

	var ooo  [64]byte
	bytelen <<= 3
	for i := uint(0); i < 8; i++ {
		ooo[i] = byte(bytelen >> (8 * i))
	}
	for _,v:=range ooo [0:8] {
		buf=append(buf,v)
	}
}
/*for _,v:=range buf {
	fmt.Print(v)
}*/
//divGroup512(buf)

}

每512位分组
func divGroup512(x []byte){
var t1 []byte
var t2 [][]byte
var len= len(x)
var num =len/64
for i:=1;i<=num ;i++ {//共分为nunm个512分组
for k:=i64-64;k<i64 ;k++ {//每一512分组的值
t1=append(t1,x[k])
}
t2=append(t2,t1)
t1=nil
}
//divgroup(t2)
}
每十六位分组
var child []byte
var child1 []byte
var child2 [][]byte
func divgroup16(x [][]byte){
var len = len(x)

for i:=0;i<len ;i++  {
	for _,v:=range x[i]{
		child=append(child,v)
	}
	for k:=1;k<=16 ;k++  {
		for j:=k*4;j<k*4-4 ;j--  {
			child1=append(child1,child[j])
		}
		child2=append(child2,child1)
		child1=nil
	}
	child=nil
}
//trans(child2)

}

循环的四个函数
func F(x,y,z uint) uint{
f:=(x&y)|((^x)&z)
return f
}
func G(x,y,z uint) uint{
g:=(x&z)|(y&(^z))
return g
}
func H(x,y,z uint) uint{
h:=xyz
return h
}
func I(x,y,z uint) uint{
i:=y(x|(z))
return i
}
//四个操作
// FF(a,b,c,d,Mj,s,ti)表示a=b+((a+F(b,c,d)+Mj+ti)<<<s)
// GG(a,b,c,d,Mj,s,ti)表示a=b+((a+G(b,c,d)+Mj+ti)<<<s)
// HH(a,b,c,d,Mj,s,ti)表示a=b+((a+H(b,c,d)+Mj+ti)<<<s)
// II(a,b,c,d,Mj,s,ti)表示a=b+((a+I(b,c,d)+Mj+ti)<<<s)
//参数a,b,c,d,Mj(消息的第j个分组),s(表示循环左移s位),ti(是4294967296*abs(sin(i))的整数部分)

//位移量s
var sv =[][]uint{
{7,12,17,22},
{5,9,14,20},
{4,11,16,23},
{6,10,15,21},
}

func FF(a,b,c,d,Mj,s,ti uint)uint{
t1:=F(b,c,d)
t2:=a+t1+Mj+ti
t3:=t2<<s
t4:=t3+a
return t4
}
func GG(a,b,c,d,Mj,s,ti uint) uint{
t1:=G(b,c,d)
t2:=a+t1+Mj+ti
t3:=t2<<s
t4:=t3+a
return t4
}
func HH(a,b,c,d,Mj,s,ti uint) uint {
t1 := H(b, c, d)
t2 := a + t1 + Mj + ti
t3 := t2 << s
t4 := t3 + a
return t4
}
func II(a,b,c,d,Mj,s,ti uint) uint {
t1 := I(b, c, d)
t2 := a + t1 + Mj + ti
t3 := t2 << s
t4 := t3 + a
return t4
}

猜你喜欢

转载自blog.csdn.net/Monster1m/article/details/86689483