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