func tsetCompressor(compressor func(inb []byte) (outb []byte), decompressor func(inb []byte) (outb []byte)) { origin := []byte("123") ob := compressor([]byte("123")) output := decompressor(ob) kmgTest.Equal(origin, output) //for i:=1;i<20;i++ { // fmt.Println(kmgHex.UpperEncodeBytesToString(compressor(bytes.Repeat([]byte{'1'},i)))) //} //for i:=1;i<100;i++ { // fmt.Println(kmgHex.UpperEncodeBytesToString(compressor(kmgRand.MustCryptoRandBytes(i)))) //} for _, i := range []int{1, 10, 100, 1000, 1e4, 1e5} { ob = compressor(kmgRand.MustCryptoRandBytes(i)) fmt.Println(i, len(ob), len(ob)-i) } for _, path := range []string{ "/Users/bronze1man/tmp/vanke.sql", "/bin/kmg", } { c := kmgFile.MustReadFile(path) t := time.Now() ob = compressor(c) dur := time.Since(t) fmt.Println(path, kmgNet.SizeString(int64(len(c))), kmgNet.SizeString(int64(len(ob))), float64(len(ob))/float64(len(c)), dur) } fmt.Println() }
/* 只加密,不压缩 对称加密,正确包含psk的所有功能, 让Aes加密和magicCode进行传输错误验证. AES-CTR magicCode完整性验证 最坏情况多20个字节 */ func EncryptV3(key *[32]byte, data []byte) (output []byte) { Iv := kmgRand.MustCryptoRandBytes(16) //此处只会报操作系统不支持的错误. block, err := aes.NewCipher((*key)[:]) if err != nil { panic(err) //此处只会由于key长度错误而报错,而此处key长度不会错误. } afterCbcSize := len(data) output = make([]byte, afterCbcSize+16+4) copy(output[:16], Iv) copy(output[16:len(data)+16], data) copy(output[len(data)+16:len(data)+16+4], magicCode4) ctr := cipher.NewCTR(block, Iv) ctr.XORKeyStream(output[16:], output[16:]) return output }
/* 对称加密,正确包含psk的所有功能,不考虑性能 key为任意长度 data为任意长度 会在原文的最后面加上原文的sha512的内容,并且加密 使用随机化iv 使用aes,cbc,32位密码 输入密码hash使用sha384 数据padding使用PKCS5Padding 不会修改输入的数据 */ func EncryptV2(key []byte, data []byte) (output []byte) { keyHash := sha512.Sum512(key) aseKey := keyHash[:32] cbcIv := kmgRand.MustCryptoRandBytes(16) //此处只会报操作系统不支持的错误. block, err := aes.NewCipher(aseKey) if err != nil { panic(err) //此处只会由于key长度错误而报错,而此处key长度不会错误. } blockSize := block.BlockSize() paddingSize := blockSize - len(data)%blockSize afterCbcSize := paddingSize + len(data) output = make([]byte, afterCbcSize+64+16) copy(output[:16], cbcIv) copy(output[16:], data) hashData := sha512.Sum512(data) copy(output[len(data)+16:len(data)+64+16], hashData[:]) copy(output[len(data)+64+16:], bytes.Repeat([]byte{byte(paddingSize)}, paddingSize)) blockmode := cipher.NewCBCEncrypter(block, cbcIv) blockmode.CryptBlocks(output[16:], output[16:]) return output }
/* 先压缩,后加密, 对称加密,正确包含psk的所有功能, 不管是否可以压缩.保证最多会比明文数据增加58个字节. */ func CompressAndEncryptBytesEncode(key *[32]byte, data []byte) (output []byte) { //先压缩 压缩不了只会多16个字节而已,不需要进行优化 data = kmgCompress.FlateMustCompress(data) //后加密 cbcIv := kmgRand.MustCryptoRandBytes(16) //此处只会报操作系统不支持的错误. block, err := aes.NewCipher((*key)[:]) if err != nil { panic(err) //此处只会由于key长度错误而报错,而此处key长度不会错误. } blockSize := block.BlockSize() paddingSize := blockSize - len(data)%blockSize afterCbcSize := paddingSize + len(data) output = make([]byte, afterCbcSize+16+16) copy(output[:16], cbcIv) copy(output[16:], data) hashData := sha512.Sum512(data) copy(output[len(data)+16:len(data)+16+16], hashData[:16]) //只有前16位,其他的废弃 copy(output[len(data)+16+16:], bytes.Repeat([]byte{byte(paddingSize)}, paddingSize)) blockmode := cipher.NewCBCEncrypter(block, cbcIv) blockmode.CryptBlocks(output[16:], output[16:]) return output }
func EncryptTester(encrypt func(key *[32]byte, data []byte) (output []byte), decrypt func(key *[32]byte, data []byte) (output []byte, err error), maxOverhead int) { key := &[32]byte{0xd8, 0x51, 0xea, 0x81, 0xb9, 0xe, 0xf, 0x2f, 0x8c, 0x85, 0x5f, 0xb6, 0x14, 0xb2} //加密数据,可以正确解密测试 for _, origin := range [][]byte{ []byte(""), []byte("1"), []byte("12"), []byte("123"), []byte("1234"), []byte("12345"), []byte("123456"), []byte("1234567"), []byte("12345678"), []byte("123456789"), []byte("1234567890"), []byte("123456789012345"), []byte("1234567890123456"), []byte("12345678901234567"), bytes.Repeat([]byte("1234567890"), 100), } { ob := encrypt(key, origin) ret, err := decrypt(key, ob) kmgTest.Equal(err, nil, origin) kmgTest.Equal(ret, origin) } //任意数据传入解密不会挂掉,并且会报错 for _, origin := range [][]byte{ []byte(""), []byte("1"), []byte("12"), []byte("123"), []byte("1234"), []byte("12345"), []byte("123456"), []byte("1234567"), []byte("12345678"), []byte("123456789"), []byte("1234567890"), []byte("123456789012345"), []byte("1234567890123456"), []byte("12345678901234567"), } { _, err := decrypt(key, origin) kmgTest.Ok(err != nil) } origin := []byte("1234567890123456712345678901234567") //多次加密得到不同的结果 (随机化iv) kmgTest.Ok(!bytes.Equal(encrypt(key, origin), encrypt(key, origin))) //修改任何一个字节都会报错 (hash) ob := encrypt(key, origin) for i := 0; i < len(ob); i++ { newOb := make([]byte, len(ob)) newOb[i] = -newOb[i] _, err := decrypt(key, newOb) kmgTest.Ok(err != nil) } for _, i := range []int{1, 10, 100, 1000, 10000} { ob := encrypt(key, kmgRand.MustCryptoRandBytes(i)) kmgTest.Ok(len(ob)-i <= maxOverhead, i) } }