go加密算法:CBC對稱加密(一)--DES


package main

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

//cipher包實現了多個標准的用於包裝底層塊加密算法的加密算法實現。

/*
DES的操作
加解密實現思路
    加密-CBC分組模式
        1.創建並返回一個使用DES算法的cipher.Block接口
            .秘鑰長度為64bit,即64/8 = 8字節(byte)
        2.對最后一個明文分組進行數據填充
            .DES是以64比特的明文(比特序列)為一個單位來進行加密的
            .最后一組不夠64bit,則需要進行數據填充
        3.創建一個密碼分組為鏈接模式的,底層使用DES加密的BlockMode接口
        4.加密連續的數據塊

    解密
        1.創建並返回一個使用DES算法的cipher.Block接口
        2.創建一個密碼分組為鏈接模式的,底層使用DES解密的BlockMode接口
        3.數據塊解密
        4.去掉最后一組的填充數據
*/

//使用des進行對稱加密

func paddingText(src []byte, blockSize int) []byte {
    //1.截取加密代碼 段數
    fmt.Println("加密之前的數據", src)
    padding := blockSize - len(src)%blockSize
    //2.無余數
    if padding == 0 {
        padText := bytes.Repeat([]byte{byte(blockSize)}, blockSize)
        src = append(src, padText...)
    } else { //else 一定直接要添加到該右括號的后面,不能令起一行
        //3.有余數
        padText := bytes.Repeat([]byte{byte(padding)}, padding)
        src = append(src, padText...)
    }
    //4.添加余數
    //src = append(src, padText...)
    return src

}
func unPaddingText(src []byte) []byte {
    //1.取出最后一個元素
    lasteum := int(src[len(src)-1])
    //2.刪除和最后一個元素相等長的字節
    newText := src[:len(src)-lasteum]
    return newText
}

func encryptDES(src, key []byte) []byte {
    //1.創建並返回一個使用DES算法的cipher.Block接口
    /*
            func NewCipher(key []byte) (cipher.Block, error)
          創建並返回一個使用DES算法的cipher.Block接口。
    */
    block, err := des.NewCipher(key)
    if err != nil {
        fmt.Println(err)
    }
    //2.對最后一個明文分組進行數據填充
    src = paddingText(src, block.BlockSize())

    //3.創建一個密碼分組為鏈接模式的,底層使用DES加密的BlockMode接口
    //iv := make([]byte,block.BlockSize())
    iv := []byte("aaaabbbb")
    /*
            func NewCBCEncrypter(b Block, iv []byte) BlockMode
          返回一個密碼分組鏈接模式的、底層用b加密的BlockMode接口,初始向量iv的長度必須等於b的塊尺寸。
    */
    blockMode := cipher.NewCBCEncrypter(block, iv)
    /*
      type BlockMode interface {
        // 返回加密字節塊的大小
        BlockSize() int
        // 加密或解密連續的數據塊,src的尺寸必須是塊大小的整數倍,src和dst可指向同一內存地址
        CryptBlocks(dst, src []byte)
      }
    */
    //4.加密連續的數據塊
    dst := make([]byte, len(src))
    blockMode.CryptBlocks(dst, src)

    return dst
}

func decryptDES(src, key []byte) []byte {
    //1.創建並返回一個使用DES算法的cipher.Block接口
    Block, err := des.NewCipher(key)
    if err != nil {
        panic(err)
    }
    //2.創建一個密碼分組為鏈接模式的,底層使用DES解密的BlockMode接口
    //iv := make([]byte,Block.BlockSize())
    iv := []byte("aaaabbbb")
    //func NewCBCDecrypter(b Block, iv []byte) BlockMode
    //返回一個密碼分組鏈接模式的、底層用b解密的BlockMode接口,初始向量iv必須和加密時使用的iv相同。
    blockMode := cipher.NewCBCDecrypter(Block, iv)
    //3.數據塊解密
    //dst := make([]byte,len(src))
    //blockMode.CryptBlocks(dst,src)
    blockMode.CryptBlocks(src, src)
    //4.去掉最后一組的填充數據
    newText := unPaddingText(src)
    return newText
}

func main() {
    fmt.Println("====DES加解密====")
    src := []byte("少壯不努力,老大徒傷悲")
    key := []byte("12345678")
    str := encryptDES(src, key)
    str = decryptDES(str, key)

    fmt.Println("解密之后的數據", str)
}
/*

加密之前的數據 [229 176 145 229 163 174 228 184 141 229 138 170 229 138 155 44 232

        128 129 229 164 167 229 190 146 228 188 164 230 130 178]

解密之后的數據 [229 176 145 229 163 174 228 184 141 229 138 170 229 138 155 44 232

        128 129 229 164 167 229 190 146 228 188 164 230 130 178]

*/

 


免責聲明!

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



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