• go加密算法:CBC对称加密(一)--3DES/AES


    其实对称加密中的:DES3DESAES 采取的加解密步骤一致,只是小的细节不太一样.大家多看看就能写出来了
    // 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
    }
  • 相关阅读:
    (转)MVC 与三层架构
    (转)CentOS一键安装Nginx脚本
    (转)Python异常类的继承关系
    CMFCPropertyGridProperty用法
    C语言终极面试及答案分析
    C/C++函数指针(typedef简化定义)
    UNIX 家族及Linux
    Socket的综合应用总结
    Socket模型(二):完成端口(IOCP)
    socket通信中select函数的使用和解释
  • 原文地址:https://www.cnblogs.com/eilinge/p/10146876.html
Copyright © 2020-2023  润新知