天天看点

go加解密系列——3DES加解密

3DES(或称为Triple DES)是对称加密,是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。

由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。

常见的加解密模式有:ECB、CBC、CTR、OFB、CFB,常见的填充模式有:NoPadding、ZeroPadding、PKCS5Padding、PKCS7Padding

加解密模式对IV的要求

ECB 不需要IV
CBC 需要IV
CTR 需要IV
OFB 需要IV
CFB 需要IV

几种填充模式

NoPadding 原始数据不补位,要求原始数据长度必须符合当前加密算法的block的整数倍,否则会报错。优点是,当原始数据长度固定,生成的密文长度最小。
ZeroPadding 用0补位,缺点是无法区分当前的0是原始数据,还是补位数据
PKCS5Padding 缺N位补N值。缺点是补位是固定8位,无法适当当前算法的block大小
PKCS7Padding 缺N位补N值。以当前算法的block大小进行动态计算补位大小,适用性广

 安装:

go get github.com/agclqq/goencryption
           

3des-cbc-pkcs7加密示例:

package main

import (
	"fmt"
	"github.com/agclqq/goencryption"
)

var plainText = []byte("lovegoencryption")
var key = []byte("qwertyui12345678poiuytre")  //The key length of 3des must be 24
var iv = []byte("poiuytre")

func main() {
	//使用3des-cbc-pkcs7进行加密
	cryptText, err := goencryption.TripleDesCBCPkcs7Encrypt(plainText, key, iv)
	if err != nil {
		fmt.Println(err)
		return
	}
	//将不可打印密文转为base64输出
	out := goencryption.Base64Encode(cryptText)
	fmt.Println(out)

	//将out解码为原始密文
	cText, err := goencryption.Base64Decode(out)
	if err != nil {
		fmt.Println(err)
		return
	}
	//使用3des-cbc-pkcs7进行解密
	text, err := goencryption.TripleDesCBCPkcs7Decrypt(cText, key, iv)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Printf("%s\n", text)
}
           

输出

zq2IUVtrb0U8CeePzoNBlsmlV9WvW2xo
lovegoencryption
           

其他更多方法可参考 github.com/agclqq/goencryption/3des.go

更便利的 EasyEncrypt / EasyDecrypt:

package main

import (
	"fmt"
	"github.com/agclqq/goencryption"
)

var plainTextStr = "lovegoencryption"
var keyStr = "qwertyui12345678poiuytre"
var ivStr = "poiuytre"

func main() {
	//使用3des-cbc-pkcs7进行加密,并用base64输出
	cryptText, err := goencryption.EasyEncrypt("3des/cbc/pkcs7/base64", plainTextStr, keyStr, ivStr)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(cryptText)

	//使用base64转码,并用3des-cbc-pkcs7进行解密
	text, err := goencryption.EasyDecrypt("3des/cbc/pkcs7/base64", cryptText, keyStr, ivStr)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(text)
}
           

输出

zq2IUVtrb0U8CeePzoNBlsmlV9WvW2xo
lovegoencryption