1. 程式人生 > >go加密演算法:CBC對稱加密(一)--3DES/AES

go加密演算法:CBC對稱加密(一)--3DES/AES

其實對稱加密中的:DES\3DES\AES 採取的加解密步驟一致,只是小的細節不太一樣.大家多看看就能寫出來了
// rsao1.go
package main

import (
    "bytes"
    "crypto/aes"
    "crypto/cipher"
    "crypto/des"
    "fmt"
)

/*
明文加密的分組操作
    .分組的長度 = 金鑰的長度  //key = 64bit/8
    .將每組資料和金鑰進行位運算
    .每組的密文長度 = 每組的明文長度
*/
func main() {
    fmt.Println("=== des 加解密 ===")
    scr :
= []byte("少壯不努力,活該你單身") key := []byte("12345678") src := encryptDES(scr, key) //fmt.Println("enpadding", src):每次執行加密後的資料一樣 des := decryptDES(src, key) fmt.Println("depadding", des) fmt.Println("=== 3des 加解密 ===") scr1 := []byte("少壯不努力,活該你單身,223333") key1 := []byte("aaabbbaa12345678ccddeeff") src1 :
= encryptTripleDES(scr1, key1) //fmt.Println("enpadding", src1):每次執行加密後的資料一樣 des1 := decryptTripleDES(src1, key1) fmt.Println("depadding", des1) fmt.Println("=== aes 加解密 ===") scra := []byte("少壯不努力,活該你單身,223333") keya := []byte("aaabbbaa12345678") srca := encryptAES(scra, keya)
//fmt.Println("enpadding", srca):每次執行加密後的資料一樣 desa := decryptAES(srca, keya) fmt.Println("depadding", desa) } func padding(src []byte, blockSize int) []byte { //func padding(src []byte, blockSize int) { //1.擷取加密程式碼 段數 fmt.Println("enpadding", src) padding := blockSize - len(src)%blockSize //2.有餘數 padText := bytes.Repeat([]byte{byte(padding)}, padding) //3.新增餘數 src = append(src, padText...) return src } func Depadding(src []byte) []byte { //1.取出最後一個元素 lasteum := int(src[len(src)-1]) //2.刪除和最後一個元素相等長的位元組 //fmt.Println("src", src) newText := src[:len(src)-lasteum] return newText } //des加解密 //加密 func encryptDES(src, key []byte) []byte { //1.建立並返回一個使用DES演算法的cipher.Block介面。 block, err := des.NewCipher(key) if err != nil { panic(err) } //2.對src進行填充 src = padding(src, block.BlockSize()) //3.返回blockModel //vi := []byte("aaaabbbb") //blockModel := cipher.NewCBCEncrypter(block, vi) //fmt.Println("src[:block.BlockSize()]", key[:block.BlockSize()]) blockModel := cipher.NewCBCEncrypter(block, key[:block.BlockSize()]) //4.crypto加密連續塊 blockModel.CryptBlocks(src, src) return src } //解密 func decryptDES(src, key []byte) []byte { //1.建立並返回一個使用DES演算法的cipher.Block介面。 block, err := des.NewCipher(key) if err != nil { panic(err) } //2.crypto解密 //vi := []byte("aaaabbbb") //fmt.Println("src[:block.BlockSize()]", key[:block.BlockSize()]) blockModel := cipher.NewCBCDecrypter(block, key[:block.BlockSize()]) //3.解密連續塊 blockModel.CryptBlocks(src, src) //.刪除填充陣列 src = Depadding(src) return src } //3des加解密 //3des加密 func encryptTripleDES(src, key []byte) []byte { //1.建立並返回一個使用DES演算法的cipher.Block介面。 block, err := des.NewTripleDESCipher(key) if err != nil { panic(err) } //2.對src進行填充 src = padding(src, block.BlockSize()) //3.返回blockModel //vi := []byte("aaaabbbb") //blockModel := cipher.NewCBCEncrypter(block, vi) //fmt.Println("src[:block.BlockSize()]", key[:block.BlockSize()]) blockModel := cipher.NewCBCEncrypter(block, key[:block.BlockSize()]) //4.crypto加密連續塊 blockModel.CryptBlocks(src, src) return src } /* 要求金鑰長度: .16 ,24 ,32 byte .在go介面中指定的金鑰長度為16位元組 分組長度 .16 ,24 ,32 byte .分組長度和金鑰長度相等 */ //3des解密 func decryptTripleDES(src, key []byte) []byte { //1.建立並返回一個使用DES演算法的cipher.Block介面。 block, err := des.NewTripleDESCipher(key) if err != nil { panic(err) } //2.crypto解密 //vi := []byte("aaaabbbb") //fmt.Println("src[:block.BlockSize()]", key[:block.BlockSize()]) blockModel := cipher.NewCBCDecrypter(block, key[:block.BlockSize()]) //3.解密連續塊 blockModel.CryptBlocks(src, src) //.刪除填充陣列 src = Depadding(src) return src } //aes加解密 //aes加密 func encryptAES(src, key []byte) []byte { //1.建立並返回一個使用DES演算法的cipher.Block介面。 block, err := aes.NewCipher(key) if err != nil { panic(err) } //2.對src進行填充 src = padding(src, block.BlockSize()) //3.返回blockModel //vi := []byte("aaaabbbb") //blockModel := cipher.NewCBCEncrypter(block, vi) //fmt.Println("key[:block.BlockSize()]", key[:block.BlockSize()]) blockModel := cipher.NewCBCEncrypter(block, key[:block.BlockSize()]) //block.BlockSize() ==len(key) //4.crypto加密連續塊 blockModel.CryptBlocks(src, src) return src } //aes解密 func decryptAES(src, key []byte) []byte { //1.建立並返回一個使用DES演算法的cipher.Block介面。 block, err := aes.NewCipher(key) if err != nil { panic(err) } //2.crypto解密 //vi := []byte("aaaabbbb") //fmt.Println("src[:block.BlockSize()]", key[:block.BlockSize()]) blockModel := cipher.NewCBCDecrypter(block, key[:block.BlockSize()]) //block.BlockSize() ==len(key) //3.解密連續塊 blockModel.CryptBlocks(src, src) //.刪除填充陣列 src = Depadding(src) return src }