返回顶部
首页 > 资讯 > 后端开发 > GO >Golang 使用 AES 加密数据
  • 338
分享到

Golang 使用 AES 加密数据

2024-04-05 00:04:42 338人浏览 独家记忆
摘要

你在学习golang相关的知识吗?本文《Golang 使用 AES 加密数据》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的

你在学习golang相关的知识吗?本文《Golang 使用 AES 加密数据》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!

问题内容

我不确定这是问这个问题的合适地方。但我没有 C# 经验,我的任务是将一段安全代码转换为 golang

我想知道我是否在这里错过了一些东西。

c# 代码使用 rijndael 类来加密一位数据。 key值和iv值在字节码中写出来是这样的

public static byte[] key = new byte[]{0xx, 0xx, 0xx, 0xx, 0xx,
                    0xx4, 0xxx, 0xxx, 0xxx, 0xxx, xxx, 0xxx,
                    0xxx, 0xxx, 0xxx, 0xxx};

public static byte[] iv = new byte[] // 保存结构如上,长度为16

然后有一些代码可以做到这一点

rijndael alg = rijndael.create();
                alg.key = key;
                alg.iv = iv;
                cryptostream cs = new cryptostream(ms,
                alg.createencryptor(), cryptostreammode.write);
                cs.write(datawithoutheader, 0, datawithoutheader.length);
                cs.close();

该函数发送 byte[] data 作为输出

我试图模仿这是 golang 像这样

func startencryption(message []byte) []byte {
    var key = []byte {// same as c# } 

    var iv = []byte{ // same as c# }

    var err error
    fmt.printf("\n length of key %+v \n, \n length of iv \n %+v \n", len(key), len(iv))
    // encrypt
    encrypted := make([]byte, len(message))
    err = encryptaescfb(encrypted, []byte(message), key, iv)
    if err != nil {
        panic(err)
    }
    return encrypted
}

加密函数

func encryptaescfb(dst, src, key, iv []byte) error {
    aesblockencrypter, err := aes.newcipher([]byte(key))
    if err != nil {
        return err
    }
    aesencrypter := cipher.newcfbencrypter(aesblockencrypter, iv)
    aesencrypter.xorkeystream(dst, src)
    return nil
}

其输出是通过 api 发送的,其输出需要解密。我在下面使用这个

func decryptMessage(message []byte)error{
    var key = []byte{ // same as C# }

    var iv = []byte{ // same as C#  }

    // Remove the head part of the response (45 bytes)
    responseBody := message[45:]

    decrypted := make([]byte, len(responseBody))

    err := DecryptAESCFB(decrypted, responseBody, key, iv)

    if err != nil {
        fmt.Printf("\n error : \n %+v \n", err)
    }
    return nil
}

func DecryptAESCFB(dst, src, key, iv []byte) error {
    aesBlockDecrypter, err := aes.NewCipher([]byte(key))
    if err != nil {
        return nil
    }
    aesDecrypter := cipher.NewCFBDecrypter(aesBlockDecrypter, iv)
    aesDecrypter.XORKeyStream(dst, src)
    return nil
}

解密器给我乱码 - 我在某个地方出错了吗?

我的问题归结为两个问题

  1. 使用 rijndael 类和 golang 函数的 c# 函数是否会产生相同的输出,或者我应该做更多/更少的事情

  2. 字节数组是否是存储密钥 iv 的正确数据 - 即复制到 go 时它与 c# 中使用的不同


解决方案


您发布的代码存在一些问题。

  1. 不要将密钥存储在字节数组中,因为这意味着您正在对其进行硬编码。相反,生成一个随机 256 位密钥,将其编码为十六进制字符串,然后将其存储在程序外部,并使用 viper 等配置库读取它。
  2. 不要对 iv 进行硬编码。您应该为每条消息生成一个新的 iv。重复使用相同的 iv 会显着削弱您的加密能力。对于您加密的每条消息,生成一个随机 iv 并将其添加到消息前面。当您尝试解密时,请读取前 n 个字节的 iv,然后解密。
  3. 您应该使用经过身份验证的加密作为针对选定密文攻击的防护措施。 GCm 模式为您提供身份验证。

这是一个例子。 Playground Link

package main

import (
    "crypto/aes"
    "crypto/cipher"
    "crypto/rand"
    "encoding/hex"
    "fmt"
    "os"
)

var (
    key       = randBytes(256 / 8)
    gcm       cipher.AEAD
    nonceSize int
)

// Initilze GCM for both encrypting and decrypting on program start.
func init() {
    block, err := aes.NewCipher(key)
    if err != nil {
        fmt.Printf("Error reading key: %s\n", err.Error())
        os.Exit(1)
    }

    fmt.Printf("Key: %s\n", hex.EncodeToString(key))

    gcm, err = cipher.NewGCM(block)
    if err != nil {
        fmt.Printf("Error initializing AEAD: %s\n", err.Error())
        os.Exit(1)
    }

    nonceSize = gcm.NonceSize()
}

func randBytes(length int) []byte {
    b := make([]byte, length)
    rand.Read(b)
    return b
}

func encrypt(plaintext []byte) (ciphertext []byte) {
    nonce := randBytes(nonceSize)
    c := gcm.Seal(nil, nonce, plaintext, nil)
    return append(nonce, c...)
}

func decrypt(ciphertext []byte) (plaintext []byte, err error) {
    if len(ciphertext) < nonceSize {
        return nil, fmt.Errorf("Ciphertext too short.")
    }
    nonce := ciphertext[0:nonceSize]
    msg := ciphertext[nonceSize:]
    return gcm.Open(nil, nonce, msg, nil)
}

func main() {
    fmt.Println("Encrypting...")
    msg := []byte("The quick brown fox jumped over the lazy dog.")
    ciphertext := encrypt(msg)
    fmt.Printf("Encrypted message: %v\n", ciphertext)

    fmt.Println("Decrypting...")
    plaintext, err := decrypt(ciphertext)
    if err != nil {
        // Don't display this message to the end-user, as it could potentially
        // give an attacker useful infORMation. Just tell them something like "Failed to decrypt."
        fmt.Printf("Error decryping message: %s\n", err.Error())
        os.Exit(1)
    }
    fmt.Printf("Decrypted message: %s\n", string(plaintext))
}

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持编程网!更多关于Golang的相关知识,也可关注编程网公众号。

您可能感兴趣的文档:

--结束END--

本文标题: Golang 使用 AES 加密数据

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

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

猜你喜欢
  • Golang 使用 AES 加密数据
    你在学习Golang相关的知识吗?本文《Golang 使用 AES 加密数据》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的...
    99+
    2024-04-05
  • Android数据加密之Aes加密
    前言: 项目中除了登陆,支付等接口采用rsa非对称加密,之外的采用aes对称加密,今天我们来认识一下aes加密。  其他几种加密方式:  •...
    99+
    2022-06-06
    加密 aes加密 aes Android
  • 使用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 加解密
  • 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加密解密
  • Golang如何实现AES对称加密
    小编给大家分享一下Golang如何实现AES对称加密,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!AES加密AES对称加密简介AES是一个对称密码,旨在取代DES...
    99+
    2023-06-15
  • Vue+php 使用AES进行加密解密
    php 代码 public function encrypt($data, $key, $iv) { return base64_encode(openssl_enc...
    99+
    2023-09-28
    1024程序员节 php vue.js aes加密解密
  • 如何使用JavaScript实现AES加密
    随着互联网的普及和数据传输的日益频繁,数据的安全问题也日渐重要。为了保障数据的安全性,加密算法被广泛采用。AES(Advanced Encryption Standard)是目前最常用的对称加密算法之一,广泛用于数据传输和存储过程中的加密保...
    99+
    2023-05-14
  • golang常用加密解密算法总结(AES、DES、RSA、Sha1、MD5)
    目录关于加密解密AESDESRSAMD5Sha1Base64在项目开发过程中,当操作一些用户的隐私信息,诸如密码、帐户密钥等数据时,往往需要加密后可以在网上传输。这时,需要一些高效地...
    99+
    2024-04-02
  • java通过AES生成公钥加密数据ECC加密公钥
    目录成功通过AES获取公钥和私钥进行ECC加密成功 本文通过java语言实现ECC+AES混合加密。 ECC加密算法具有密钥分配与管理简单,安全强度高等优点,AES的加密算法具...
    99+
    2022-12-20
    java AES生成公钥加密数据ecc java ecc加密
  • Golang实现AES加密和解密的示例代码
    目录对称加密 AES 算法加解密文件加密解密说明对称加密 AES 算法 (Advanced Encryption Standard ,AES) 优点 算法公开、计算量小、加密速度快、...
    99+
    2024-04-02
  • 通过Golang编写一个AES加密解密工具
    目录前言AES加密介绍及实现原理AES用在哪里AES加密是如何实现的AES加密模式Go实现AES加密工具scode前言 本文包含如下两个内容: AES加密介绍及实现原理 Go实现AE...
    99+
    2024-04-02
  • Golang如何实现AES对称加密算法
    本篇内容主要讲解“Golang如何实现AES对称加密算法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Golang如何实现AES对称加密算法”吧!前置知识在正式学习加密解密之前,首先看看如何生成...
    99+
    2023-07-05
  • android中AES加解密的使用方法
    今天在android项目中使用AES对数据进行加解密,遇到了很多问题,网上也找了很多资料,也不行。不过最后还是让我给搞出来了,这里把这个记录下来,不要让别人走我的弯路,因为网上...
    99+
    2022-06-06
    方法 aes Android
  • php使用Aes进行加密的方法
    这篇文章将为大家详细讲解有关php使用Aes进行加密的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。php可以查看用户的标识判断用户是否登录,但是此标识可以修改,修改之后就可以获取到修改的用户所有信息...
    99+
    2023-06-14
  • Java使用AES加密和解密的实例详解
    Java使用AES加密和解密的实例详解前言:AES的基本要求是,采用对称分组密码体制,密钥长度的最少支持为128、192、256,分组长度128位,算法应易于各种硬件和软件实现。1998年NIST开始AES第一轮分析、测试和征集,共产生了1...
    99+
    2023-05-31
    java aes 加密
  • Golang实现AES对称加密的过程详解
    AES加密 AES对称加密简介 AES是一个对称密码,旨在取代DES成为广泛使用的标准。是美国联邦政府采用的一种区块加密标准。 AES对称加密过程 加密解密算法的输入是一个128位分...
    99+
    2024-04-02
  • mysql aes加密函数的用法是什么
    在MySQL中,可以使用AES_ENCRYPT和AES_DECRYPT函数来进行AES加密和解密操作。 AES_ENCRYPT函数用...
    99+
    2024-04-09
    mysql
  • 怎么通过Golang编写一个AES加密解密工具
    本篇内容主要讲解“怎么通过Golang编写一个AES加密解密工具”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么通过Golang编写一个AES加密解密工具”吧!AES加密介绍及实现原理AES(...
    99+
    2023-06-30
  • android使用AES加密和解密文件实例代码
    前言最近公司需要对本公司的一些下载文件进行加密解密需求,也就尝试去实现下,其实需要借助第三方的jar包:bcprov-jdk15on-155.jar,下载这个可以到网上搜或者下载本人的demo即可,注意:需要加密和解密的key是一致的才可以...
    99+
    2023-05-31
    android aes 加密
  • python如何实现对AES加密的视频数据流解密
    这篇文章主要介绍“python如何实现对AES加密的视频数据流解密”,在日常操作中,相信很多人在python如何实现对AES加密的视频数据流解密问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python如何实...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作