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. ...
随机推荐
- AGC011-E Increasing Numbers
题意 给定一个数\(n\),\(n≤10^{500,000}\),问\(n\)最少可以拆分成几个不降数的和.一个不降数是在十进制位下,从高位往低位看,每个数都不会比高位的数更小的数 做法 不降数可以拆 ...
- C语言再学习part3—算法
君子远庖厨,万物皆备于我.—孟子 这篇文章主要总结程序的主要要素,以及程序的构成是什么样子的.最后说说我学到的一种奇特的表示算法的方式—伪代码. 让我们开始吧! 一个程序应该包括以下两个主要要素: 1 ...
- .net core 3.0配置跨域
1.ConfigureServices services.AddCors(c => { // 配置策略 c.AddPolicy("Policy", policy => ...
- Ubuntu禁用root账号,开启Ubuntu密钥登录
新建普通用户 ## 新建普通用户 $ adduser ubuntu $ apt-get install sudo ## 将用户加入sudo组 $ usermod -a -G sudo ubuntu 为 ...
- Unbuntu--安装VMware Tools
实现虚拟机Ubuntu窗口自适应,以及与本地主机粘贴复制 一.安装VMware Tools 1.首先在虚拟机点击安装VMware tools,会在个人home目录下生成VMwareTools-10.3 ...
- 剑指offer-面试题32-之字形打印二叉树-二叉树栈
/* 题目: 分行按层自上向下呈之字形打印二叉树.第一行从左到右,第二行从右到左,第三行从左到右... */ /* 思路: 使用两个栈stack1和stack2. stack1存储从左向右打印的节点, ...
- java-标准输入
package InputDemo; public class InputDemo1 { public static void main(String[] args) { /* 1. java.uti ...
- UVA10791-Minimum Sum LCM(唯一分解定理基本应用)
原题:https://vjudge.net/problem/UVA-10791 基本思路:1.借助唯一分解定理分解数据.2.求和输出 知识点:1.筛法得素数 2.唯一分解定理模板代码 3.数论分析-唯 ...
- CF1227F2 Wrong Answer on test 233 (Hard Version)
题意 \(n\)道题,每道题有\(k\)种选项,其中第\(i\)道题正确答案是\(a_i\),但是填答案的时候填错啦,第一道题的选择填到了第二道题...第\(n\)道题的选择填到了第一道题,求在\(k ...
- 将字符串日期格式化为yyyy-mm-dd
(CONVERT(varchar(100), CONVERT(datetime,a.con_ret_time), 23))