package main

import (
"bytes"
"crypto/aes"
"crypto/cipher"
"crypto/des"
"encoding/base64"
"fmt"
) // main 入口函数
func main() {
// DES密钥
key := "12345678" // 占8字节
// 3DES密钥
// key = "abcdefgh0123456712345678" //占24字节
// AES密钥 key长度 16 24 32 对应 AES-128 AES-192 AES-256
// key = "abcdefgh0123456712345678" //占24字节 data := "学习技术,改变世界"
chipherArr, err := SCEncryptString(data, key, "des")
if err != nil {
panic(err)
}
fmt.Printf("加密后字节数组:%v\n", chipherArr)
fmt.Printf("加密后16进制:%x\n", chipherArr) originalBytes, err := SCDecryptString(chipherArr, key, "des")
if err != nil {
panic(err)
}
fmt.Println("解密后:", string(originalBytes))
} // SCEncrypt DES加密
func SCEncrypt(originalBytes, key []byte, scType string) ([]byte, error) {
// 1、实例化密码器block(参数为密钥)
var err error
var block cipher.Block
switch scType {
case "des":
block, err = des.NewCipher(key)
case "3des":
block, err = des.NewTripleDESCipher(key)
case "aes":
block, err = aes.NewCipher(key)
}
if err != nil {
return nil, err
}
blockSize := block.BlockSize()
fmt.Println("---blockSize---", blockSize)
// 2、对明文填充字节(参数为原始字节切片和密码对象的区块个数)
paddingBytes := PKCSSPadding(originalBytes, blockSize)
fmt.Println("填充后的字节切片:", paddingBytes)
// 3、 实例化加密模式(参数为密码对象和密钥)
blockMode := cipher.NewCBCEncrypter(block, key[:blockSize])
fmt.Println("加密模式:", blockMode)
// 4、对填充字节后的明文进行加密(参数为加密字节切片和填充字节切片)
cipherBytes := make([]byte, len(paddingBytes))
blockMode.CryptBlocks(cipherBytes, paddingBytes)
return cipherBytes, nil
} // SCDecrypt 解密字节切片,返回字节切片
func SCDecrypt(cipherBytes, key []byte, scType string) ([]byte, error) {
// 1、实例化密码器block(参数为密钥)
var err error
var block cipher.Block
switch scType {
case "des":
block, err = des.NewCipher(key)
case "3des":
block, err = des.NewTripleDESCipher(key)
case "aes":
block, err = aes.NewCipher(key)
}
if err != nil {
return nil, err
}
blockSize := block.BlockSize()
// 2、 实例化解密模式(参数为密码对象和密钥)
blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
// fmt.Println("解密模式:", blockMode)
// 3、对密文进行解密(参数为加密字节切片和填充字节切片)
paddingBytes := make([]byte, len(cipherBytes))
blockMode.CryptBlocks(paddingBytes, cipherBytes)
// 4、去除填充字节(参数为填充切片)
originalBytes := PKCSSUnPadding(paddingBytes)
return originalBytes, nil
} // SCEncryptString SCEncryptString
func SCEncryptString(originalText, key, scType string) (string, error) {
chipherArr, err := SCEncrypt([]byte(originalText), []byte(key), scType)
if err != nil {
panic(err)
}
base64str := base64.StdEncoding.EncodeToString(chipherArr)
return base64str, nil
} // SCDecryptString SCDecryptString
func SCDecryptString(chipherText, key, scType string) (string, error) {
chipherArr, _ := base64.StdEncoding.DecodeString(chipherText)
chipherArr, err := SCDecrypt(chipherArr, []byte(key), scType)
if err != nil {
panic(err)
}
return string(chipherArr), nil
} // PKCSSPadding 填充字节的函数
func PKCSSPadding(data []byte, blockSize int) []byte {
padding := blockSize - len(data)%blockSize
fmt.Println("要填充的字节:", padding)
// 初始化一个元素为padding的切片
slice1 := []byte{byte(padding)}
slice2 := bytes.Repeat(slice1, padding)
return append(data, slice2...)
} // ZeroPadding 填充字节的函数
func ZeroPadding(data []byte, blockSize int) []byte {
padding := blockSize - len(data)%blockSize
fmt.Println("要填充的字节:", padding)
// 初始化一个元素为padding的切片
slice1 := []byte{0}
slice2 := bytes.Repeat(slice1, padding)
return append(data, slice2...)
} // PKCSSUnPadding 去除填充字节的函数
func PKCSSUnPadding(data []byte) []byte {
unpadding := data[len(data)-1]
result := data[:(len(data) - int(unpadding))]
return result
} // ZeroUnPadding 去除填充字节的函数
func ZeroUnPadding(data []byte) []byte {
return bytes.TrimRightFunc(data, func(r rune) bool {
return r == 0
})
}

  

go语言 实现对称加密解密算法的更多相关文章

  1. Asp.Net 常用工具类之加密——对称加密DES算法(2)

    又到周末,下午博客园看了两篇文章,关于老跳和老赵的程序员生涯,不禁感叹漫漫程序路,何去何从兮! 转眼毕业的第三个年头,去过苏州,跑过上海,从一开始的凌云壮志,去年背起行囊默默回到了长沙准备买房,也想有 ...

  2. AES对称加密解密类

    import java.io.UnsupportedEncodingException; import javax.crypto.Cipher; import javax.crypto.spec.Se ...

  3. 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输

    Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...

  4. 一组PHP可逆加密解密算法

    对于大部分密码加密,我们可以采用md5.sha1等方法.可以有效防止数据泄露,但是这些方法仅适用于无需还原的数据加密. 对于需要还原的信息,则需要采用可逆的加密解密算法. 下面一组PHP函数是实现此加 ...

  5. RC4加密解密算法

    RC4相对是速度快.安全性高的加密算法.在实际应用中,我们可以对安全系数要求高的文本进行多重加密,这样破解就有一定困难了.如下测试给出了先用RC4加密,然后再次用BASE64编码,这样双重锁定,保证数 ...

  6. java 实现 DES加密 解密算法

    DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种: ...

  7. 数据的加密传输——单片机上实现TEA加密解密算法

    各位大侠在做数据传输时,有没有考虑过把数据加密起来进行传输,若在串口或者无线中把所要传的数据加密起来,岂不是增加了通信的安全性.常用的加密解密算法比如DES.RSA等,受限于单片机的内存和运算速度,实 ...

  8. md5加密以及可逆的加密解密算法

    md5加密 package gov.mof.fasp2.gcfr.adjustoffset.adjust; import java.security.MessageDigest; public cla ...

  9. N个整数(数的大小为0-255)的序列,把它们加密为K个整数(数的大小为0-255).再将K个整数顺序随机打乱,使得可以从这乱序的K个整数中解码出原序列。设计加密解密算法,且要求K<=15*N.

    N个整数(数的大小为0-255)的序列,把它们加密为K个整数(数的大小为0-255).再将K个整数顺序随机打乱,使得可以从这乱序的K个整数中解码出原序列.设计加密解密算法,且要求K<=15*N. ...

随机推荐

  1. SQL server 游标用法

    declare @EmpCode varchar(50), @EmpName varchar(50), @EmpAddress varchar(200);declare curEmployee cur ...

  2. 并发编程之J.U.C的第一篇

    并发编程之J.U.C AQS 原理 ReentrantLock 原理 1. 非公平锁实现原理 2)可重入原理 3. 可打断原理 5) 条件变量实现原理 3. 读写锁 3.1 ReentrantRead ...

  3. CSS语法、选择器、继承、层叠

    行内样式(内联样式) <h1 style="color:red;font-size:20px;">css行内样式</h1> 内部样式表(嵌入样式) < ...

  4. maven的核心概念——继承

    15.1 为什么需要继承机制 由于非compile范围的依赖信息是不能在“依赖链”中传递的,所以有需要的工程只能单独配置.例如: Hello <dependency> <groupI ...

  5. mybatis中用到的9种设计模式

    1.Builder模式:例如SqlSessionFactoryBuilder.XMLConfigBuilder.XMLMapperBuilder.XMLStatementBuilder.CacheBu ...

  6. NodeJS_0001:关于install的方式

    最近在写Node程序的时候,突然对 npm install 的-save和-save-dev 这两个参数的使用比较混乱.其实博主在这之前对这两个参数的理解也是模糊的,各种查资料和实践后对它们之间的异同 ...

  7. C#设计模式学习笔记:设计原则

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8287784.html,记录一下学习过程以备后续查用. 写代码也是有原则的,我们之所以使用设计模式,主要是为了 ...

  8. Json与Ajax(注册实例)

    需要在服务器上进行哈 jquery的ajax方法: // jquery请求 $.ajax({ url: "./server/slider.json", type: "po ...

  9. iframe在iphone手机上的问题

    问题1: 通过document.addEventListener("scroll",function(){})对页面滚动监听事件进行监听,但ios下$(document).scro ...

  10. BZOJ 4239: 巴士走读 最短路

    显然,我们可以将询问按照规定时间从小到大排序,依次处理. 那么我们显然要求合法的点中从 $n$ 号点出发到达点 $i$ 的最迟时间,我们令这个为 $f[i]$ 而 $f[i]$ 显然可以用最短路来求. ...