main.go
package main
import "fmt"
// 測試檔案
func main() {
fmt.Println("des 加解密")
key := []byte("1234abdd")
src := []byte("特點: 密文沒有規律, 明文分組是和一個資料流進行的按位異或操作, 最終生成了密文")
cipherText := desEncrypt(src, key)
plainText := desDecrypt(cipherText, key)
fmt.Printf("解密之後的資料: %s\n", string(plainText))
fmt.Println("aes 加解密 ctr模式 ... ")
key1 := []byte("1234abdd12345678")
cipherText = aesEncrypt(src, key1)
plainText = aesDecrypt(cipherText, key1)
fmt.Printf("解密之後的資料: %s\n", string(plainText))
}
對稱加密.go
package main
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"crypto/des"
)
// des的CBC加密
// 編寫填充函式, 如果最後一個分組位元組數不夠, 填充
// ......位元組數剛好合適, 新增一個新的分組
// 填充個的位元組的值 == 缺少的位元組的數
func paddingLastGroup(plainText []byte, bloclSize int) []byte {
// 1. 求出最後一個組中剩餘的位元組數 28 % 8 = 3...4 32 % 8 = 4 ...0
padNum := bloclSize - len(plainText) % bloclSize
// 2. 建立新的切片, 長度 == padNum, 每個位元組值 byte(padNum)
char := []byte{byte(padNum)} // 長度1,
// 切片建立, 並初始化
newPlain := bytes.Repeat(char, padNum)
// 3. newPlain陣列追加到原始明文的後邊
newText := append(plainText, newPlain...)
return newText
}
// 去掉填充的資料
func unPaddingLastGrooup(plainText []byte) []byte {
// 1. 拿去切片中的最後一個位元組
length := len(plainText)
lastChar := plainText[length -1] //
number := int(lastChar) // 尾部填充的位元組個數
return plainText[:length - number]
}
// des加密
func desEncrypt(plainText, key []byte) []byte {
// 1. 建一個底層使用des的密碼介面
block, err := des.NewCipher(key)
if err != nil {
panic(err)
}
// 2. 明文填充
newText := paddingLastGroup(plainText, block.BlockSize())
// 3. 建立一個使用cbc分組介面
iv := []byte("12345678")
blockMode := cipher.NewCBCEncrypter(block, iv)
// 4. 加密
cipherText := make([]byte, len(newText))
blockMode.CryptBlocks(cipherText, newText)
// blockMode.CryptBlocks(newText, newText)
return cipherText
}
// des解密
func desDecrypt(cipherText, key []byte) []byte {
// 1. 建一個底層使用des的密碼介面
block, err := des.NewCipher(key)
if err != nil {
panic(err)
}
// 2. 建立一個使用cbc模式解密的介面
iv := []byte("12345678")
blockMode := cipher.NewCBCDecrypter(block, iv)
// 3. 解密
blockMode.CryptBlocks(cipherText, cipherText)
// 4. cipherText現在儲存的是明文, 需要刪除加密時候填充的尾部資料
plainText := unPaddingLastGrooup(cipherText)
return plainText
}
// aes加密, 分組模式ctr
func aesEncrypt(plainText, key []byte) []byte {
// 1. 建一個底層使用aes的密碼介面
block, err := aes.NewCipher(key)
if err != nil {
panic(err)
}
// 2. 建立一個使用ctr分組介面
iv := []byte("12345678abcdefgh")
stream := cipher.NewCTR(block, iv)
// 4. 加密
cipherText := make([]byte, len(plainText))
stream.XORKeyStream(cipherText, plainText)
return cipherText
}
// des解密
func aesDecrypt(cipherText, key []byte) []byte {
// 1. 建一個底層使用des的密碼介面
block, err := aes.NewCipher(key)
if err != nil {
panic(err)
}
// 2. 建立一個使用ctr模式解密的介面
iv := []byte("12345678abcdefgh")
stream := cipher.NewCTR(block, iv)
// 3. 解密
stream.XORKeyStream(cipherText, cipherText)
return cipherText
}
禁止 學習某地爬蟲,知乎爬蟲,CSDN 爬蟲。
本文,首發在 learnku 社群。
@author
汪春波(www.shxdledu.cn)
本作品採用《CC 協議》,轉載必須註明作者和本文連結