60 lines
1.2 KiB
Go
60 lines
1.2 KiB
Go
package experiment
|
|
|
|
import (
|
|
"encoding/binary"
|
|
)
|
|
|
|
var aesA = [][]byte{
|
|
{1, 0, 0, 0, 1, 1, 1, 1},
|
|
{1, 1, 0, 0, 0, 1, 1, 1},
|
|
{1, 1, 1, 0, 0, 0, 1, 1},
|
|
{1, 1, 1, 1, 0, 0, 0, 1},
|
|
{1, 1, 1, 1, 1, 0, 0, 0},
|
|
{0, 1, 1, 1, 1, 1, 0, 0},
|
|
{0, 0, 1, 1, 1, 1, 1, 0},
|
|
{0, 0, 0, 1, 1, 1, 1, 1},
|
|
}
|
|
|
|
var aesC = &ffe{
|
|
v: [8]byte{1, 1, 0, 0, 0, 1, 1, 0},
|
|
}
|
|
|
|
func aesSBox(in byte) byte {
|
|
r := NewFFE(in)
|
|
r = aesField.Invert(r)
|
|
r = Transform(aesA, r)
|
|
r = aesField.Add(r, aesC)
|
|
return r.Byte()
|
|
}
|
|
|
|
func toBytes(x []uint32) []byte {
|
|
data := make([]byte, 16)
|
|
|
|
binary.LittleEndian.PutUint32(data[0:], x[0])
|
|
binary.LittleEndian.PutUint32(data[4:], x[1])
|
|
binary.LittleEndian.PutUint32(data[8:], x[2])
|
|
binary.LittleEndian.PutUint32(data[12:], x[3])
|
|
return data
|
|
}
|
|
|
|
func toUints(b []byte) []uint32 {
|
|
r := make([]uint32, 4)
|
|
r[0] = binary.LittleEndian.Uint32(b[0:])
|
|
r[1] = binary.LittleEndian.Uint32(b[4:])
|
|
r[2] = binary.LittleEndian.Uint32(b[8:])
|
|
r[3] = binary.LittleEndian.Uint32(b[12:])
|
|
return r
|
|
}
|
|
|
|
// 模拟aesni指令
|
|
// 注意aes是列优先的。
|
|
func aesni(a, key []uint32) []uint32 {
|
|
|
|
aBuf := toBytes(a)
|
|
kBuf := toBytes(key)
|
|
|
|
AesLastRound(aBuf, kBuf)
|
|
|
|
return toUints(aBuf)
|
|
}
|