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

   2023-02-09 学习力0
核心提示:其实对称加密中的:DES\3DES\AES 采取的加解密步骤一致,只是小的细节不太一样.大家多看看就能写出来了// rsao1.gopackage mainimport ("bytes""crypto/aes""crypto/cipher""crypto/des""fmt")/*明文加密的分组操作.分组的长度 = 密钥的长度//key = 64bit/8.将
其实对称加密中的: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
}

 

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • intellij idea go go go!
    安装如下:1. intellij idea2. jdk-8u31-windows-x643.1. scala:Scala是一门多范式的编程语言,一种类似java的编程语言[1]  ,设计初衷是实现可伸缩的语言[2]  、并集成面向对象编程和函数式编程的各种特性。 2.IdeaVimEmulates Vim editorVim是一个类似
    03-08
  • 用 VSCode 搭建 Go 语言开发环境
    用 VSCode 搭建 Go 语言开发环境
    介绍这是来自 Funai Research Institute Digital 的 osw。由于我决定使用 Go 语言进行工作,所以我会在学习时将其记录在备忘录中。如果您可以参考,我将不胜感激。目标听众从现在开始学习 Go 语言的人我正在考虑使用 VSCode本次使用的环境这次,我们将基于以
    03-08
  • Go语言使用goroutine及通道实现并发详解
    Go语言使用goroutine及通道实现并发详解
    目录使用通道接收数据阻塞接收数据非阻塞接收数据接收任意数据,忽略掉接收的数据循环接收数据使用通道接收数据在上一篇文章中介绍了通道以及使用通道发送数据,本篇接着了解通道的基本内容,如何使用通道接收数据;通道的接收同样使用"-"操作符;使用通道接
  • Go 数据结构之堆排序示例详解
    Go 数据结构之堆排序示例详解
    目录堆排序堆排序过程动画显示开始堆排序代码实现总结堆排序堆排序是一种树形选择排序算法。简单选择排序算法每次选择一个关键字最小的记录需要 O(n) 的时间,而堆排序选择一个关键字最小的记录需要 O(nlogn)的时间。堆可以看作一棵完全二叉树的顺序存储结构
  • Go语言数据结构之希尔排序示例详解 go语言堆排序
    Go语言数据结构之希尔排序示例详解 go语言堆排
    目录希尔排序算法思想图解算法Go 代码实现:总结希尔排序在插入排序中,在待排序序列的记录个数比较少,而且基本有序,则排序的效率较高。1959 年,Donald Shell 从“减少记录个数” 和 “基本有序” 两个方面对直接插入排序进行了改进,提出了希尔排序
  • 【每天自动更新】Go增强月-分享你的开发必备知识-LGTM排行榜!
    【每天自动更新】Go增强月-分享你的开发必备知
    这篇文章是“Go增强月——让我们分享你需要知道的发展知识——”本文支持主题。我们将使用 Qiita API v2 来收集似乎在参与“Go 增强月-让我们分享您需要了解的开发知识-”的文章。我将在收集的文章组(数据)上尝试这个和那个。按 LGTM 编号对文章进行排序投
  • Go REFLECT Library反射类型详解
    Go REFLECT Library反射类型详解
    目录一、反射概述二、反射类型对象基本数类型的 反射类型对象引用数据类型的 反射类型对象结构体的 反射类型对象指针的 反射类型对象一、反射概述反射是指程序在运行期间对程序本身进行访问和修改的能力。程序在编译过程中变量会被转换为内存地址,变量名不会
  • Go-ethereum 解析ethersjs中产生的签名信息思路详解
    Go-ethereum 解析ethersjs中产生的签名信息思
    目录Go-ethereum 解析ethersjs中产生的签名信息1. ethers 消息签名1.1 ethers 对签名消息进行解析2. Golang 签名解析3. 总结Go-ethereum 解析ethersjs中产生的签名信息在签名验证的过程中,我们判断签名正确的前提是,签名解析后的公钥,和发起这次动作的人是
  • go并发编程sync.Cond使用场景及实现原理
    目录使用场景实现原理copyCheckerWaitSignalBroadcast使用场景sync.Cond是go标准库提供的一个条件变量,用于控制一组goroutine在满足特定条件下被唤醒。sync.Cond常用于一组goroutine等待,一个goroutine通知(事件发生)的场景。如果只有一个goroutine等待,
  • go 熔断原理分析与源码解读
    go 熔断原理分析与源码解读
    目录正文熔断原理熔断器实现hystrixBreaker和googlebreaker对比源码解读结束语正文熔断机制(Circuit Breaker)指的是在股票市场的交易时间中,当价格的波动幅度达到某一个限定的目标(熔断点)时,对其暂停交易一段时间的机制。此机制如同保险丝在电流过大时
点击排行