Skip to main content

go-des

golang des 加解密

代码仓库地址-集成了多种加密方式方法和签名算法

package des

import (
"crypto/cipher"
"crypto/des"
"jihulab.com/rickyngu/gocrypto/errors"
"jihulab.com/rickyngu/gocrypto/util"
"runtime"
)

// des 加密
// plainText: 明文
// iv: 初始化向量
// key:密钥
//返回 加密后的结果和错误
func DesEncrypt(plainText, iv, key []byte) ([]byte, error) {
if len(iv) != 8 {
_, file, line, _ := runtime.Caller(0)
return nil, util.Error(file, line+1, errors.DesIvError)
}
block, err := des.NewCipher(key)
if err != nil {
_, file, line, _ := runtime.Caller(0)
return nil, util.Error(file, line+1, errors.DesKeyError)
}
// padding plainText
newText := util.PaddingLastGroup(plainText, des.BlockSize)
// Create a CBC interface
blockMode := cipher.NewCBCEncrypter(block, iv)
// use same one to save space
blockMode.CryptBlocks(newText, newText)
return newText, nil
}

// des 解密
// cipherText: 密文
// iv: 初始化向量
// key:密钥
//返回 解密后的结果和错误
func DesDecrypt(cipherText, iv, key []byte) ([]byte, error) {
if len(iv) != 8 {
_, file, line, _ := runtime.Caller(0)
return nil, util.Error(file, line+1, errors.DesIvError)
}
block, err := des.NewCipher(key)
if err != nil {
_, file, line, _ := runtime.Caller(0)
return nil, util.Error(file, line+1, errors.DesKeyError)
}
// Create a CBC interface
blockMode := cipher.NewCBCDecrypter(block, iv)
plainText := make([]byte, len(cipherText))
blockMode.CryptBlocks(plainText, cipherText)
return util.UnpaddingLastGroup(plainText), nil
}

// 3des 加密
// plainText: 明文
// iv: 初始化向量
// key:密钥
//返回 加密后的结果和错误
func TripleDesEncrypt(plainText, iv, key []byte) ([]byte, error) {
if len(iv) != 8 {
_, file, line, _ := runtime.Caller(0)
return nil, util.Error(file, line+1, errors.DesIvError)
}
block, err := des.NewTripleDESCipher(key)
if err != nil {
_, file, line, _ := runtime.Caller(0)
return nil, util.Error(file, line+1, errors.TripleDesKeyError)
}
// padding plainText
newText := util.PaddingLastGroup(plainText, des.BlockSize)
// Create a CBC interface
blockMode := cipher.NewCBCEncrypter(block, iv)
// use same one to save space
blockMode.CryptBlocks(newText, newText)
return newText, nil
}

// 3des 解密
// cipherText: 密文
// iv: 初始化向量
// key:密钥
//返回 解密后的结果和错误
func TripleDesDecrypt(cipherText, iv, key []byte) ([]byte, error) {
if len(iv) != 8 {
_, file, line, _ := runtime.Caller(0)
return nil, util.Error(file, line+1, errors.DesIvError)
}
block, err := des.NewCipher(key)
if err != nil {
_, file, line, _ := runtime.Caller(0)
return nil, util.Error(file, line+1, errors.TripleDesKeyError)
}
// Create a CBC interface
blockMode := cipher.NewCBCDecrypter(block, iv)
plainText := make([]byte, len(cipherText))
blockMode.CryptBlocks(plainText, cipherText)
return util.UnpaddingLastGroup(plainText), nil
}

测试代码

test code
func TestDes(t *testing.T) {
iv := []byte("12345678")
key := []byte("ladykill")
plainText := []byte("hellocrypto")
cipherText,err := DesEncrypt(plainText,iv,key)
if err != nil{
fmt.Println(err)
os.Exit(0)
}
fmt.Printf("加密后:%s\n",string(cipherText))
decryText,_ := DesDecrypt(cipherText,iv,key)
fmt.Printf("解密后:%s\n",string(decryText))
// 测试iv大小错误
iv = []byte("ladykiller9")
cipherText,err = DesEncrypt(plainText,iv,key)
if err != nil {
fmt.Println(err)
os.Exit(0)
}
// 测试key大小错误
key = []byte("ladykiller9")
plainText = []byte("helloworld")
cipherText,err = DesEncrypt(plainText,iv,key)
if err != nil {
fmt.Println(err)
os.Exit(0)
}
}

func Test3Des(t *testing.T) {
iv := []byte("12345678")
key := []byte("ladykill")
plainText := []byte("helloworld")
cipherText,err := TripleDesEncrypt(plainText,iv,key)
if err != nil{
fmt.Println(err)
os.Exit(0)
}
fmt.Printf("加密后:%s\n",string(cipherText))
decryText,_ := TripleDesDecrypt(cipherText,iv,key)
fmt.Printf("解密后:%s\n",string(decryText))
// 测试iv大小错误
iv = []byte("ladykiller9")
cipherText,err = TripleDesDecrypt(plainText,iv,key)
if err != nil {
fmt.Println(err)
os.Exit(0)
}
// 测试key大小错误
key = []byte("ladykiller9")
plainText = []byte("helloworld")
cipherText,err = TripleDesDecrypt(plainText,iv,key)
if err != nil {
fmt.Println(err)
os.Exit(0)
}
}