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
}

原文地址:https://www.cnblogs.com/eilinge/p/10146876.html

时间: 2024-11-02 11:25:54

go加密算法:CBC对称加密(一)--3DES/AES的相关文章

最全加密算法之对称加密和非对称加密

常见加密算法 : DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合: 3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高: RC2和 RC4:用变长密钥对大量数据进行加密,比 DES 快: IDEA(International Data Encryption Algorithm)国际数据加密算法:使用 128 位密钥提供非常强的安全性: RSA:由 RSA 公司发明,是一个支持变长密钥的公共

加密算法:对称加密和非对称加密

对称加密算法 所谓对称,就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密.密钥是控制加密及解密过程的指令.算法是一组规则,规定如何进行加密和解密. 对称加密算法的优点是算法公开.计算量小.加密速度快.加密效率高. 对称加密算法的缺点是在数据传送前,发送方和接收方必须商定好秘钥,然后使双方都能保存好秘钥.其次如果一方的秘钥被泄露,那么加密信息也就不安全了.另外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一秘钥,这会使得收.发双方所拥有的钥匙数量巨大,密钥管理成为双方的负

C#对称加密(3des)和非对称加密(rsa)算法

3DES加密/解密算法的C#实现:(实现的方式很多,仅供参考) public static bool DecryptFromBase64(string base64String, string key,out string DecryptString) { DecryptString = ""; try { // encode to bytes byte[] KEY = HexStringToByteArray(key); byte[] CRYPTSTRING = Convert.Fr

对称加密与非对称加密

(一)对称加密(Symmetric Cryptography) 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key).对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中. 对称加密通常使用的是相对较小的密钥,一般小于256 bit.因为密钥越大,加密越强,但加密与解密的过程越慢.如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密,不行的话就再用1解:但如果你的密钥有1 MB

Android安全加密:对称加密与非对称加密

凯撒密码 1. 介绍 凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加密和解密.明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文.例如,当偏移量是3 的时候,所有的字母A 将被替换成D,B 变成E,由此可见,位数就是凯撒密码加密和解密的密钥. 例如:字符串"ABC"的每个字符都右移3 位则变成"DEF",解密的时候"DEF"的每个字符左移3 位即能

对称加密和非对称加密的比较

对称加密: 对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥,即加密密钥也可以用作解密密钥,这种方法在密码学中叫做对称加密算法,对称加密算法使用起来简单快捷,密钥较短,且破译困难,除了数据加密标准(DES),另一个对称密钥加密系统是国际数据加密算法(IDEA),它比DES的加密性好,而且对计算机功能要求也没有那么高.IDEA加密标准由PGP(PrettyGood Privacy)系统使用. 对称加密算法在电子商务交易过程中存在几个问题: 1.要求提供一条安全的渠道使通讯双方

https 结合使用 对称加密和非对称加密

(一)对称加密(Symmetric Cryptography) ---共享密钥加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key),这种方法在密码学中叫做对称加密算法.对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中.对称加密通常使用的是相对较小的密钥,一般小于256 bit.因为密钥越大,加密越强,但加密与解密的过程越慢.如果你只用1 bit来做这个密钥,那黑客们可以先试着用

对称加密和非对称加密笔记

对称加密:采用了对称密码编码技术,特点是文件的加密和解密使用相同的密钥,即加密秘钥也可以用作解密密钥,这种方法在密码学中叫做对称加密算法. 对称加密使用简单,并且密钥较短,且破译困难. 在电子商务交易过程中的缺点: 1.要求提供一条安全的渠道使通讯双方在首次通讯时协商一个共同的密钥. 2.密钥的数目难于管理.因为对于每一个合作者都需要使用不同的密钥,很难适应开放社会中大量的信息交流. 3.对称加密算法一般不能提供信息完整性的鉴别.它无法验证发送者和接受者的身份. 4.对称加密算法的管理和分发工作

非对称加密和对称加密的区别

在了解对称加密和非对称加密的区别之前我们先了解一下它们的定义: 对称加密(Symmetric Cryptography),又称私钥加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key),这种方法在密码学中叫做对称加密算法.对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中.对称加密通常使用的是相对较小的密钥,一般小于256 bit.因为密钥越大,加密越强,但加密与解密的过程越慢.如