sha1 go实现

//补位
func add(x string) []byte{
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)
	}
}
return buf

}

//分组
func divGroup_512(x []byte)([][]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
}
return t2

}
//将每一512位分组分为16个小分组,,每组32位(4字节)
var child0 []byte
var child11 []byte
var child22 [][]byte
var child33 [][][]byte
func divgroup_16(x [][]byte)[][][]byte{
var len = len(x)

for i:=0;i<len ;i++  {
		child0=x[i]//第i个512分组
		//每个512分组内分为16小组
	for k:=1;k<=16 ;k++  {
		for j:=k*4-4;j<k*4 ;j++ {
			child11=append(child11,child0[j])//每四个为一小组
		}
		child22=append(child22,child11)
		child11=nil
	}
	child33=append(child33,child22)
}
return child33

}
//扩充为80组
func expand80(x [][][]byte) [][][]byte {
var group80 [][][]byte
var yyy [][]byte
var uuu [][]byte
/*

fmt.Print(group80)*/
for i:=0;i< len(x);i++  {
	yyy=x[i]//16分组
	//fmt.Println(yyy)

	//将每一个16分组扩充为80组
	for k:=0;k<16 ;k++  {
		uuu=append(uuu,yyy[k])
	}
	//fmt.Println(uuu)
	for k:=16;k<80 ;k++  {
		t1:=BytesToInt1(uuu[k-3])
		t2:=BytesToInt1(uuu[k-8])
		t3:=BytesToInt1(uuu[k-14])
		t4:=BytesToInt1(uuu[k-16])
		t5:=t1^t2^t3^t4
		t6:=t5<<1
		uuu=append(uuu,IntToBytes2(t6))
	}
	group80=append(group80,uuu)
	uuu=nil
}
return group80

}

//循环
var(
A uint=0x67452301
B uint=0xEFCDAB89
C uint=0x98BADCFE
D uint=0x10325476
E uint=0xC3D2E1F0
A1=A
B1=B
C1=C
D1=D
E1=E
k1 uint=0x5A827999
K2 uint=0x6ED9EBA1
k3 uint=0x8F188CDC
k4 uint=0xCA62C1D6
)
func trans( x [][][]byte)[][]byte {
var ddd [][]byte
for i:=0;i< len(x);i++ {
ddd=x[i]//一个80分组
// 第一轮
for i:=0;i<20 ;i++ {

		A=A<<5+F1(B,C,D)+E+BytesToInt1(ddd[i])+k1
		B=A1
		C=B1<<30
		D=C1
		E=D1
	}
	//第二轮
	for i:=20;i<40 ;i++  {
		A=A<<5+F2(B,C,D)+E+BytesToInt1(ddd[i])+K2
		B=A1
		C=B1<<30
		D=C1
		E=D1
	}
	//第三轮
	for i:=40;i<60 ;i++  {
		A=A<<5+F3(B,C,D)+E+BytesToInt1(ddd[i])+k3
		B=A1
		C=B1<<30
		D=C1
		E=D1
	}
	//fmt.Println(A)
	//第四轮
	for i:=60;i<80 ;i++  {
		A=A<<5+F4(B,C,D)+E+BytesToInt1(ddd[i])+k4
		B=A1
		C=B1<<30
		D=C1
		E=D1
	}
	A+=A1
	B+=B1
	C+=C1
	D+=D1
	E+=E1
}
var result []uint
result=append(result,A)
result=append(result,B)
result=append(result,C)
result=append(result,D)
result=append(result,E)

resultt:=op(result)

return resultt

}

//四轮计算函数

//0-19
func F1(B,C,D uint) uint {
var T1=B&C
var T2=^B&D
return T1|T2
}
//20-39
func F2(B,C,D uint)uint {
return BCD
}
//40-59
func F3(B,C,D uint)uint {
var t1 =B&C
var t2 =B&D
var t3 =C&D
return t1|t2|t3
}
//60-79
func F4(B,C,D uint)uint {
return BCD
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值