自己练习的代码,有错务在意,感谢
补位:
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
}