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
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM