go语言 实现对称加密解密算法
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语言 实现对称加密解密算法的更多相关文章
- Asp.Net 常用工具类之加密——对称加密DES算法(2)
又到周末,下午博客园看了两篇文章,关于老跳和老赵的程序员生涯,不禁感叹漫漫程序路,何去何从兮! 转眼毕业的第三个年头,去过苏州,跑过上海,从一开始的凌云壮志,去年背起行囊默默回到了长沙准备买房,也想有 ...
- AES对称加密解密类
import java.io.UnsupportedEncodingException; import javax.crypto.Cipher; import javax.crypto.spec.Se ...
- 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输
Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...
- 一组PHP可逆加密解密算法
对于大部分密码加密,我们可以采用md5.sha1等方法.可以有效防止数据泄露,但是这些方法仅适用于无需还原的数据加密. 对于需要还原的信息,则需要采用可逆的加密解密算法. 下面一组PHP函数是实现此加 ...
- RC4加密解密算法
RC4相对是速度快.安全性高的加密算法.在实际应用中,我们可以对安全系数要求高的文本进行多重加密,这样破解就有一定困难了.如下测试给出了先用RC4加密,然后再次用BASE64编码,这样双重锁定,保证数 ...
- java 实现 DES加密 解密算法
DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种: ...
- 数据的加密传输——单片机上实现TEA加密解密算法
各位大侠在做数据传输时,有没有考虑过把数据加密起来进行传输,若在串口或者无线中把所要传的数据加密起来,岂不是增加了通信的安全性.常用的加密解密算法比如DES.RSA等,受限于单片机的内存和运算速度,实 ...
- md5加密以及可逆的加密解密算法
md5加密 package gov.mof.fasp2.gcfr.adjustoffset.adjust; import java.security.MessageDigest; public cla ...
- N个整数(数的大小为0-255)的序列,把它们加密为K个整数(数的大小为0-255).再将K个整数顺序随机打乱,使得可以从这乱序的K个整数中解码出原序列。设计加密解密算法,且要求K<=15*N.
N个整数(数的大小为0-255)的序列,把它们加密为K个整数(数的大小为0-255).再将K个整数顺序随机打乱,使得可以从这乱序的K个整数中解码出原序列.设计加密解密算法,且要求K<=15*N. ...
随机推荐
- 吴裕雄--天生自然 R语言数据可视化绘图(1)
par(ask=TRUE) opar <- par(no.readonly=TRUE) # make a copy of current settings attach(mtcars) # be ...
- PHP0012:PHP操作文件目录
WIN下文件夹的只读权限是0555
- 汇桔网被曝拖欠12月份工资至今,强制买产品,CEO称去年交易额超400亿
三言财经消息,近日有汇桔网员工爆料,汇桔网拖欠12月工资至今,通知延迟到4月才发放. 此外爆料还指出,"各种手法逼迫大家离开,员工要么继续忍受,要么主动离职,要么停薪留职.都不同意只能仲裁. ...
- 【React Native】集成声网Agora语音通讯
前言: 公司的产品是一款基于社交的内容聊天软件,需要集成语音通讯功能,在写iOS原生项目时,用到的就是Agora SDK,现在写React Native也直接采用了Agora的库. 集成iOS.And ...
- Java中Thread方法启动线程
public class ThreadTest extends Thread { private int count = 10; @Override public void run() { //重写 ...
- HTML表格概念、语法、操作、案例
创建两行三列表格 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- 10.HanLP实现k均值--文本聚类
笔记转载于GitHub项目:https://github.com/NLP-LOVE/Introduction-NLP 10. 文本聚类 正所谓物以类聚,人以群分.人们在获取数据时需要整理,将相似的数据 ...
- PHP 计算当前时间是这一年的第几周
$week = intval(date('W',time()));
- JS中BOM操作知识点
JS BOM window对象 全局变量和全局方法都归在window上 alert-comfirm-prompt 让alert .confirm等弹出框上的提示文字实现换行:\n // confirm ...
- tensorflow张量限幅
本篇内容有clip_by_value.clip_by_norm.gradient clipping 1.tf.clip_by_value a = tf.range(10) print(a) # if ...