首页 > 其他分享 >go实现AES加解密

go实现AES加解密

时间:2024-11-11 18:09:42浏览次数:1  
标签:AES return string err 加解密 iv key go byte

go实现是和之前我python和jsAES加解密的方式一样,可以相互解密。

文件结构

 

 

encryption.go

package encryption

import (
    "bytes"
    "crypto/aes"
    "crypto/cipher"
    "crypto/sha256"
    "encoding/base64"
    "encoding/hex"
)

// PKCS7Padding填充
func PKCS7Padding(ciphertext []byte, blockSize int) []byte {
    padding := blockSize - len(ciphertext)%blockSize
    padtext := bytes.Repeat([]byte{byte(padding)}, padding)
    return append(ciphertext, padtext...)
}

// 加密函数
func AesEncrypt(plaintext []byte, key []byte, iv []byte) (string, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return "", err
    }
    //判断加密快的大小
    blockSize := block.BlockSize()
    //填充
    encryptBytes := PKCS7Padding(plaintext, blockSize)
    //初始化加密数据接收切片
    crypted := make([]byte, len(encryptBytes))
    //使用cbc加密模式
    blockMode := cipher.NewCBCEncrypter(block, iv)
    //执行加密
    blockMode.CryptBlocks(crypted, encryptBytes)

    // Base64编码
    return base64.StdEncoding.EncodeToString(crypted), nil
}

// Sha256
func Sha256(text string) string {
    hash := sha256.Sum256([]byte(text))
    hexHash := hex.EncodeToString(hash[:])
    return hexHash
}

// PKCS7UnPadding去除填充
func PKCS7UnPadding(data []byte, blockSize int) []byte {
    length := len(data)
    unpadding := int(data[length-1])
    return data[:(length - unpadding)]
}

// 解密函数
func AesDecrypt(ciphertext string, key []byte, iv []byte) ([]byte, error) {
    data, err := base64.StdEncoding.DecodeString(ciphertext)
    if err != nil {
        return nil, err
    }

    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }

    mode := cipher.NewCBCDecrypter(block, iv)
    mode.CryptBlocks(data, data)

    // 去除PKCS7Padding
    data = PKCS7UnPadding(data, block.BlockSize())

    return data, nil
}

func GetDataAes(key string, text string) string {
    key_sha := Sha256(key)
    de_key := key_sha[10:26]
    iv := Sha256(de_key)[20:36]
    key_byte := []byte(de_key)
    iv_byte := []byte(iv)
    ret_byte, err := AesDecrypt(text, key_byte, iv_byte)
    if err != nil {
        return ""
    }
    return string(ret_byte)
}

func SetDataAes(key string, text string) string {
    key_sha := Sha256(key)
    de_key := key_sha[10:26]
    iv := Sha256(de_key)[20:36]
    key_byte := []byte(de_key)
    iv_byte := []byte(iv)
    text_byte := []byte(text)
    ret_str, err := AesEncrypt(text_byte, key_byte, iv_byte)

    if err != nil {
        return ""
    }
    return ret_str
}

 

 

main.go

package main

import (
    "encoding/json"
    "fmt"
    "test_t/encryption"
)

type Te struct {
    Name string `json:"name"`
    Sort int    `json:"sort"`
}

// 主函数
func main() {
    k := "123456"
    v := "1arUxHy1ZjRcIORnEs8d/nL+R1546eOPjJzXwYoGC0rxIONR/FQy59SVVJMM7LX0"
    ret := encryption.GetDataAes(k, v)
    fmt.Println(ret)

    k1 := "123456"
    v1 := Te{Name: "string", Sort: 2147483647}
    sv1, err := json.Marshal(v1)
    if err != nil {
        return
    }
    ret1 := encryption.SetDataAes(k1, string(sv1))
    fmt.Println(ret1)

}

 

运行结果

 拿到python和js中也是可以解密的

 

标签:AES,return,string,err,加解密,iv,key,go,byte
From: https://www.cnblogs.com/moon3496694/p/18540278

相关文章

  • Java流程控制-break,continue,goto
    breakcontinuegotobreakbreak在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句(break语句也在switch语句中使用)代码:publicstaticvoidmain(String[]args){inti=0;while(i<100){i++;......
  • AES加密原理
    文章目录一基础知识1.c语言如何储存二维数组一维数组二维数组2.异或运算二加密第一步——做好分组和异或运算算法原理C语言实现思路详细实现步骤三S盒子——对每个字节映射更安全字节代替(S盒)算法原理C代码实现思路C代码实现四行位移——逐行递增的移动方式行移......
  • Google账号和Play开发者账号的各种骚操作你都知道吗?
    让我们带着问题粗发!Google账号能不能更换登录Gmail邮箱?注销Google账号后,Gmail邮箱是否还可以使用?Google账号如何注销?注销Google账号后,GooglePlay开发者账号是否会一并注销?GooglePlay开发者账号能不能注销?如果能,如何注销?是否能退回25美元注册费用吗?开发者名......
  • 各个语言的标准输入输出(C++,Python,Go,MATLAB)
    标准输入和输出C/C++cin,cout,getline()进行输入输出#include<bits/stdc++.h>usingnamespacestd;intmain(){//输入`1231231` inta,b,c; cin>>a>>b>>c; cout<<a<<b<<c<<endl;//输出1231231并换行(endl代表换行) //输入`......
  • 第 5 章 - Go 语言 数据类型
    在Go语言中,数据类型是用来声明变量和函数的特定类型的数据。Go是一种静态类型的语言,这意味着所有变量的类型在编译时都必须已知。Go语言支持多种数据类型,可以大致分为基本数据类型和复合数据类型。基本数据类型布尔型(bool)只有两个值:true和false。整型(int,......
  • mongoDB安装
    1、执行安装包文件进行安装,选择自定义路径,安装在根目录,如果不是根目录配置服务时容易出错,导致服务起不来2、我的安装在了C盘MongoDB,安装完之后,在根目录创建data文件夹,在data文件夹里创建db、log文件夹3、以管理员身份运行CMD,输入:cdC:\MongoDB\bin4、mongod--dbpathC:\da......
  • 毕业设计:python考研院校推荐系统 混合推荐 协同过滤推荐算法 爬虫 可视化 Django框架(
    毕业设计:python考研院校推荐系统混合推荐协同过滤推荐算法爬虫可视化Django框架(源码+文档)✅1、项目介绍技术栈:Python语言MySQL数据库Django框架协同过滤推荐算法requests网络爬虫pyecharts数据可视化html页面、爬取院校信息:https://yz.chsi.com.cn/sch/(研招网......
  • 大数据项目-基于Django实现的高校图书馆智能推送系统的设计与实现
    《[含文档+PPT+源码等]精品基于Django实现的高校图书馆智能推送系统的设计与实现》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、包运行成功以及课程答疑与微信售后交流群、送查重系统不限次数免费查重等福利!数据库管理工具:phpstudy/Navicat或者phpstudy/sqlyog......
  • 《Django 5 By Example》阅读笔记:p1-p16
    《Django5ByExample》学习第1天,p1-p16总结,总计16页。一、技术总结1.Django基本操作(1)创建project&创建appdjango-adminstartprojectmysitedjango-adminstartappblog(2)定义model(3)启动项目pythonmanage.pyrunserver二、英语总结(生词:8)1.fintechabbr......
  • django违法犯罪防范科普平台系统-计算机毕业设计源码84527
    摘 要本文介绍了一个基于Django的违法犯罪防范科普平台的设计与实现。随着社会的进步和科技的发展,违法犯罪活动呈现多样化和复杂化的趋势,对公众进行违法犯罪防范的科普教育变得尤为重要。该平台利用Django框架提供的高效且可扩展的特性,实现了用户注册与登录、科普文章发布与......