返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >Go 实现aes-256-gcm加解密处理过程
  • 645
分享到

Go 实现aes-256-gcm加解密处理过程

php开发语言 2023-09-04 18:09:51 645人浏览 泡泡鱼
摘要

【知识点】 包含PHP的知识点:str_pad、sha1、pack、base64_encode、base64_decode、strlen、substr、openssl_decrypt、openssl_encrypt。 包含的Go知识点: s

【知识点】

包含PHP的知识点:str_pad、sha1、pack、base64_encode、base64_decode、strlen、substr、openssl_decrypt、openssl_encrypt。

包含的Go知识点:

sha1        哈希加密,要注意下返回的是字节数组

string([]byte)        字节数组转换成字符串,注意这里转换的二进制字符串,很多乱码

hex.EncodeToString        字节数组转成16进制,示例中有用到来转换sha1得到的值

strconv.ParseUint        字符串转换为无符号int类型,对应php的pack方法

base64.StdEncoding.DecodeString        base64解码,对应php的base64_decode

base64.StdEncoding.EncodeString        base64编码,对应php的base64_encode

strings.Replace        替换字符串,用于替换base64字符串的安全字符-和_

rand        随机字符串

crypto/cipher   aes加解密模块

参考:aes-256-gcm_python3_php7_golang_mb5fe94870638be的技术博客_51CTO博客

【需求背景】

在对接美团小游戏的时候,支付成功通知,使用了【sha1】的签名还有【aes-256-GCm】的加密数据。官方只有php7.1以上的例子,但是项目使用了golang,需要转换下。

接口文档:

文档上的php-demo例子:

//PHP demo(版本使用7.1以上)function createKey($appId, $appSecret) {$aaa = base64_encode(str_pad(sha1($appId.'&'.$appSecret,true), 32,pack('V', 0)));return $aaa;}function encryptSHA1Str($secreTKEy, $encryptData) {$aaa = $encryptData.$secretKey;$sign = sha1($aaa);return $sign;}function decryptWithAESGCM256($secretKey, $encryptData) {$decodeEncrypt = urlsafe_b64decode($encryptData);$decodeSecret = base64_decode($secretKey);$data = openssl_decrypt(substr($decodeEncrypt, 16, -16), 'aes-256-gcm', $decodeSecret, 1, substr($decodeEncrypt, 0, 16), substr($decodeEncrypt, -16, 16));return $data;}function urlsafe_b64decode($string) {$data = str_replace(array('-','_'),array('+','/'),$string);$mod4 = strlen($data) % 4;if ($mod4) {$data .= substr('====', $mod4);}return base64_decode($data);}

 【GO代码示例】

package mainimport ("crypto/aes""crypto/cipher""crypto/sha1""encoding/base64""errors""fmt""io""math/rand""strconv""strings")func main(){secretKey := GenSecretKey("appid12456","appsecret123456")data :="{\"bizOrderId\":\"55001151519674220220723112146446\",\"mgcId\":\"234112419424942\",\"mgcOrderId\":\"106631144674\",\"payStatus\":\"OK\",\"price\":\"100\"}\n"encryptData,_ := SetCallbackData(secretKey,data)//得到加密后的base64字符串fmt.Println(encryptData)decryptData,_ := GetCallbackData(secretKey,encryptData)//得到解密后的json字符串fmt.Println(decryptData)}//实现php的sha1()方法,返回的是byte转换的字符串,如果需要转成16进制,可以使用hex.EncodeToStringfunc GetSha1(str string) string {h := sha1.New()io.WriteString(h, str)return string(h.Sum(nil))}//右边补全字符串实现方法,主要实现php的str_pad()方法func StrPadRight(input string, padLength int, padString string) string {output := ""inputLen := len(input)if inputLen >= padLength {return input}ll := padLength - inputLenfor i := 1; i <= ll; i = i + len(padString) {output += padString}return input + output}//生成密钥func GenSecretKey(appId string, appSecret string) (secretKey string) {key := appId + "&" + appSecretsha1_str := GetSha1(key)str10 := "0"pack64, _ := strconv.ParseUint(str10, 10, 32)//对应php的pack()方法,字符串转换为uint类型fmt.Println(pack64)pack32 := uint32(pack64)str_pad := StrPadRight(sha1_str, 32, string(pack32))secretKey = base64.StdEncoding.EncodeToString([]byte(str_pad))return secretKey}func GetCallbackData(secretKey string, encryptData string) (result_str string, err error) {decodeSecretKeyByte, _ := base64.StdEncoding.DecodeString(secretKey)decodeSecretKey := string(decodeSecretKeyByte)//$data = openssl_decrypt(substr($decodeEncrypt, 16, -16), 'aes-256-gcm', $decodeSecret, 1, substr($decodeEncrypt, 0, 16), substr($decodeEncrypt, -16, 16));orderSuccessPayInfoByte, err2 := DecodeAesGcm(encryptData, decodeSecretKey,"")result_str = string(orderSuccessPayInfoByte)if err2 != nil {return result_str, errors.New("decode error")}return result_str, err}func SetCallbackData(secretKey string, data string) (result_str string, err error) {decodeSecretKeyByte, _ := base64.StdEncoding.DecodeString(secretKey)decodeSecretKey := string(decodeSecretKeyByte)orderSuccessPayInfoByte, err2 := EncodeAesGcm(data, decodeSecretKey,"")result_str = string(orderSuccessPayInfoByte)if err2 != nil {return result_str, errors.New("encode error")}return result_str, err}//url安全模式decode字符串func UrlSafeB64decode(str string) (result []byte) {str = strings.Replace(str, "-", "+", -1)str = strings.Replace(str, "_", "/", -1)mod4 := len(str) % 4if mod4 != 0 {str = str + "===="[0:mod4]}result, _ = base64.StdEncoding.DecodeString(str)return result}//base64字符串,替换转换为安全模式func UrlSafeB64encode(str string) (result string) {str = strings.Replace(str, "+", "-", -1)str = strings.Replace(str, "/", "_", -1)return str}//使用aes-256-gcm方式解密字符串,主要针对php的openssl_decrypt()方法,注意在php7.1后增加了tag和add参数func DecodeAesGcm(encryptData string, hex_key string,hex_add string) ([]byte, error) {tagSize :=16//nonceSize,tag的长度,用于open时候生成tag,默认12key := []byte(hex_key)add := []byte(hex_add)block, err := aes.NewCipher(key) //生成加解密用的blockif err != nil {return []byte(""), err}//根据不同加密算法,也有不同tag长度的方法设定和调用,比如NewGCMWithTagSize、newGCMWithNonceAndTagSizeaesgcm, err := cipher.NewGCMWithNonceSize(block, tagSize)if err != nil {return []byte(""), err}decodeEncryptStr := UrlSafeB64decode(encryptData)ciphertext := decodeEncryptStrif len(ciphertext) <= aesgcm.NonceSize() { // 长度应该>ivreturn []byte(""), errors.New("string: too short") //解密失败}iv := ciphertext[:aesgcm.NonceSize()]        //分离出IVciphertext = ciphertext[aesgcm.NonceSize():] // 密文,tag是调用open方法时候通过密文和前面new时候传的size来进行截取的plaintext, err := aesgcm.Open(nil, iv, ciphertext, add)return plaintext, err}//使用aes-256-gcm加密数据,主要针对php的openssl_encrypt()方法,注意在php7.1后增加了tag和add参数func EncodeAesGcm(data string, hex_key string, hex_add string) (result string, error error) {tagSize :=16 //nonceSize,tag的长度,用于open时候生成tag,默认12key := []byte(hex_key)add := []byte(hex_add)block, err := aes.NewCipher(key) //生成加解密用的blockif err != nil {return result, err}//根据不同加密算法,也有不同tag长度的方法设定和调用,比如NewGCMWithTagSize、newGCMWithNonceAndTagSizeaesgcm, err := cipher.NewGCMWithNonceSize(block, tagSize)if err != nil {return result, err}plaintext := []byte(data)iv := make([]byte, tagSize)            // NonceSize=12rand.Read(iv)         //获取随机值ciphertext := aesgcm.Seal(iv, iv, plaintext, add) //加密,密文为:iv+密文+tagresult = base64.StdEncoding.EncodeToString(ciphertext)result = UrlSafeB64encode(result)return result, nil // 生成的BS64}

来源地址:https://blog.csdn.net/yjr_aaron/article/details/126015480

--结束END--

本文标题: Go 实现aes-256-gcm加解密处理过程

本文链接: https://lsjlt.com/news/394122.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Go 实现aes-256-gcm加解密处理过程
    【知识点】 包含php的知识点:str_pad、sha1、pack、base64_encode、base64_decode、strlen、substr、openssl_decrypt、openssl_encrypt。 包含的go知识点: s...
    99+
    2023-09-04
    php 开发语言
  • ASP.NETCore实现AES-GCM加密算法
    传统的加密算法中,一个主要的问题是无法确认密钥或密文的有效性,也就是说,当密钥或密文错误时,照样能解密,但不报错。还需要我们制定一个一个原文的校验算法。 为了简化这个过程,一种方式是...
    99+
    2024-04-02
  • golang实现aes-cbc-256加密解密功能
    目录我为什么吃撑了要实现go的aes-cbc-256加密解密功能?1:面临两个问题1:go秘钥长度必须是16/24/322:go根本不支持256位的aes-cbc加密解密3:想用go...
    99+
    2023-05-18
    go aes加密解密 go 256加密解密
  • go GCM gin中间件的加密解密文件流处理
    目录aes的gcm模式的加密和解密验证1.GET请求2.看看post json3验证postformaes的gcm模式的加密和解密 要给已有的系统启用加密解密,目前推荐的是aes的g...
    99+
    2024-04-02
  • Golang实现AES对称加密的过程详解
    AES加密 AES对称加密简介 AES是一个对称密码,旨在取代DES成为广泛使用的标准。是美国联邦政府采用的一种区块加密标准。 AES对称加密过程 加密解密算法的输入是一个128位分...
    99+
    2024-04-02
  • AES加密解密python实现
    1.前言         关于现代密码学算法,可以查看以下博客全面了解 CISSP考试要求里的“应用密码学”内容辅助记忆趣味串讲_晓翔仔的博客-CSDN博客         AES的细节知识,可以查阅 AES加密算法的详细介绍与实现_Tim...
    99+
    2023-09-20
    python 开发语言 密码学 非对称加密 AES
  • jquery实现aes加密解密
    随着互联网技术的发展,网络安全问题变得越来越突出。许多网站都要求用户输入敏感信息,如密码等。这些信息往往需要进行加密处理,以保证安全性。AES(Advanced Encryption Standard)是一种流行的加密算法,具有高效、安全、...
    99+
    2023-05-24
  • JAVA实现AES加密,解密
    java提供了加解密工具,可以将字节转成加密字节. 因此在加解密前需要对内容进行转换. 一般情况我们希望以字符串的形式展示加密串 可以将byte[] 转换为base64字符串 也可以转换为16进制字符串 这里提供两个工具类 加密串为base...
    99+
    2023-08-24
    java 数据库 mysql
  • Java实现加密(一)AES加解密
    目录 1.背景知识2.AES简介3.AES的加密过程(AES处理单位:字节)4.Java实现4.1 生成密钥和偏移量4.2 AESUtil.java 源码4.3 执行结果4.4 线上验证 1.背景知识 在密码学中,加...
    99+
    2023-08-18
    java
  • Rust实现AES加解密详解
    目录一、选择使用 rust-crypto二、Cargo.toml 文件三、工具类1、加密2、解密3、测试样例一、选择使用 rust-crypto rust-crypto 官方相关站点...
    99+
    2022-11-13
    Rust AES加解密 Rust 加密 Rust 解密
  • 使用Java实现加密之AES加解密
    目录1.背景知识2.AES简介3.AES的加密过程(AES处理单位:字节)4.Java实现4.1 生成密钥和偏移量4.2 AESUtil.java 源码4.3 执行结果4.4 线上验...
    99+
    2023-05-18
    Java AES AES 加解密
  • python实现AES算法及AES-CFB8加解密源码
    目录Python实现AES算法生成轮密钥加密解密完整代码如下测试测试程序Python实现AES-CFB8加解密Python实现AES算法 密码学课程老师留的作业,我觉得用python...
    99+
    2024-04-02
  • C#中实现AES算法加密解读
    目录先上效果图先添加辅助类开始实现总结先上效果图 文件和加密文件之间的转换。 先添加辅助类 public class AES_EnorDecrypt { ...
    99+
    2023-02-26
    C# AES算法加密 AES算法加密 C# AES加密
  • C#加解密之AES算法的实现
    目录实现功能开发环境实现代码实现效果从这一篇开始呢,写一下常用的一些加解密方式。一般我们来说呢,对于加密,我们分为可逆和不可逆。可逆加密又可分为对称加密(AES、DES等)和非对称加...
    99+
    2024-04-02
  • Java 实现 AES 加密和解密完整示例
    1、简介 AES,全称为 Advanced Encryption Standard,是一种分组密码算法,用于保护敏感数据的传输和存储。AES 分为 128 位和 256 位两种密钥长度,可以对数据进行...
    99+
    2023-09-09
    java aes AES 加密 解密
  • java实现AES 32位加密解密的方案
    目录1、常用加密32位原因2、解决方案3、AES工具类1、常用加密32位原因 网上很多解密加密是16位的,用32位密钥加密会报java.security.InvalidKeyExc...
    99+
    2024-04-02
  • Java AES加密解密的简单实现方法
    废话不多说,直接上代码package com.mstf.aes; import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;im...
    99+
    2023-05-31
    java rsa 加密
  • Java实现SHA-256加密算法的完全解析
    目录实现原理应用Java实现代码知识点补充SHA-256是一种散列(哈希)算法,用于将任意长度的数据映射为固定长度的散列值,以保证数据完整性。SHA-256是SHA(Secure H...
    99+
    2023-02-07
    Java实现SHA-256加密算法 Java SHA-256加密算法 Java SHA-256 Java加密算法
  • Golang实现AES加密和解密的示例代码
    目录对称加密 AES 算法加解密文件加密解密说明对称加密 AES 算法 (Advanced Encryption Standard ,AES) 优点 算法公开、计算量小、加密速度快、...
    99+
    2024-04-02
  • Golang实现AES对称加密算法实例详解
    目录前言前置知识生成随机数生成随机字符串加密和解密加密解密总结前言 安全总是相对的,对于敏感数据最好要有一定保护措施,尤其是在线数据,通过加密可转换信息为编码,从而防止非法获取。对开...
    99+
    2023-02-21
    golang 对称加密 go语言aes加密 对称加密 aes
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作