Example #1
0
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()
}
Example #2
0
/*
只加密,不压缩
对称加密,正确包含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
}
Example #3
0
/*
对称加密,正确包含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
}
Example #4
0
/*
先压缩,后加密,
对称加密,正确包含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)
	}
}