返回顶部
首页 > 资讯 > 精选 >使用 AES-GSM 方法解密在 GO 中编码的 C# 字符串
  • 430
分享到

使用 AES-GSM 方法解密在 GO 中编码的 C# 字符串

go语言安全传输 2024-02-10 09:02:07 430人浏览 薄情痞子
摘要

PHP小编西瓜为您介绍一种在Go语言中解密C#字符串的方法——AES-GSM。AES-GSM是一种高级加密标准,它结合了AES(高级加密标准)和GSM(全球系统移动通信)的优势。通过使

PHP小编西瓜为您介绍一种在Go语言中解密C#字符串的方法——AES-GSM。AES-GSM是一种高级加密标准,它结合了AES(高级加密标准)和GSM(全球系统移动通信)的优势。通过使用AES-GSM方法,我们可以有效地解密在GO中编码的C#字符串,从而实现数据的安全传输和保护。本文将详细介绍AES-GSM的原理和使用步骤,帮助读者轻松掌握这一加密解密技术。

问题内容

我有一个在 go 中经过 aes-GCm 加密的字符串及其密码短语,并尝试在 c# 中对其进行解密。但是,我无法找到正确的方法来在 c# 中对其进行解密。 我收到的错误提到 iv 的大小,块的长度不适合 c# 解密算法。以下是 go 中的值:


aes encr/decr passphrase:  this-is-a-test-passphrase

input string:  text to encrypt hello world 123

encrypted string:  94b681ef29d9a6d7-e6fa36c4c00977de1745fc63-a1ad0481bdbeeaa02c013a2dce82520DDD762355e18f1e2f20c0ea9d001ece24e9b8216ed4b9c6a06e1ef34c953f80

go代码:https://go.dev/play/p/jn8ie61ntzw

这是go中的解密代码

func appdecryptimpl(passphrase, ciphertext string) string {
arr := strings.split(ciphertext, "-")
salt, _ := hex.decodestring(arr[0])
iv, _ := hex.decodestring(arr[1])
data, _ := hex.decodestring(arr[2])
key, _ := appderivekey(passphrase, salt)
b, _ := aes.newcipher(key)
aesgcm, _ := cipher.newgcm(b)
data, _ = aesgcm.open(nil, iv, data, nil)
return string(data)
}

func appderivekey(passphrase string, salt []byte) ([]byte, []byte) {
if salt == nil {
    salt = make([]byte, 8)
    rand.read(salt)
}
return pbkdf2.key([]byte(passphrase), salt, 1000, 32, sha256.new), salt
}

这是go中的加密代码

func AppEncryptImpl(passphrase string, plaintext string) string {
key, salt := appDeriveKey(passphrase, nil)
iv := make([]byte, 12)
rand.Read(iv)
b, _ := aes.NewCipher(key)
aesgcm, _ := cipher.NewGCM(b)
data := aesgcm.Seal(nil, iv, []byte(plaintext), nil)
return hex.EncodeToString(salt) + "-" + hex.EncodeToString(iv) + "-" + hex.EncodeToString(data)
}

我正在尝试在 c# 中复制相同的解密登录,因此它将能够解密并生成最终的字符串。

我在 c# 中尝试了几种解密逻辑,它们可以在这里找到:

  • Https://dotnetfiddle.net/32sb5m 此函数使用 system.security.cryptography 命名空间,但会导致 iv 大小错误。

  • https://dotnetfiddle.net/wxkuyr 上述针对 .net 5 的修改版本会产生相同的结果

  • https://dotnetfiddle.net/6iftps 使用充气城堡库会导致“gcm 中的 Mac 检查失败”错误

  • https://dotnetfiddle.net/8mjs3g 使用 rfc2898derivebytes 方法的另一种方法会产生错误,提示“计算的身份验证标记与输入身份验证标记不匹配”

当前使用的方法是否正确,或者是否有其他方法可以在 c# 中解密 aes-gcm?当涉及到 c# 时,可以采取什么措施来绕过这些错误?

解决方法

您已经接近最后一个代码了。 go 将身份验证标签附加到生成的密文的末尾。您在这里正确提取它:

// extract the tag from the encrypted byte array
byte[] tag = new byte[16];
array.copy(encrypteddata, encrypteddata.length - 16, tag, 0, 16);

但是,您继续将具有实际加密文本+身份验证标记的数组视为仅包含加密文本。要修复,请将其也提取出来:

public static void Main() {
    // This is the encrypted string that you provided
    string encryptedString = "a6c0952b78967559-2953e738b9b005028bf4f6c0-7b8464d1ed75bc38b4503f6c8d25d6bfc22a19cc1a8a92bc6faa1ed6cd837b97072bc8e16fd95b6cfca67fccbad8fc";

    // This is the passphrase that you provided
    string passphrase = "this-is-a-test-passphrase";

    string[] splitStrs = encryptedString.Split('-');

    byte[] salt = Convert.FromHexString(splitStrs[0]);
    byte[] iv = Convert.FromHexString(splitStrs[1]);
    // this is encrypted data + tag
    byte[] encryptedDataWithTag = Convert.FromHexString(splitStrs[2]);
    // Extract the tag from the encrypted byte array
    byte[] tag = new byte[16];
    // But also extract actual encrypted data
    byte[] encryptedData = new byte[encryptedDataWithTag.Length - 16];
    Array.Copy(encryptedDataWithTag, 0, encryptedData, 0, encryptedData.Length);
    Array.Copy(encryptedDataWithTag, encryptedDataWithTag.Length - 16, tag, 0, 16);
    byte[] key = new Rfc2898DeriveBytes(passphrase, salt, 1000, HashAlgorithmName.SHA256).GetBytes(32);
    // Create an AesGcm object
    AesGcm aesGcm = new AesGcm(key);
    int textLength = encryptedData.Length;
    // Decrypt the ciphertext
    byte[] plaintext = new byte[textLength];
    aesGcm.Decrypt(iv, encryptedData, tag, plaintext);
    // Convert the plaintext to a string and print it
    string decryptedString = Encoding.UTF8.GetString(plaintext);
    Console.WriteLine(decryptedString);
}

以上就是使用 AES-GSM 方法解密在 GO 中编码的 C# 字符串的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 使用 AES-GSM 方法解密在 GO 中编码的 C# 字符串

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

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

猜你喜欢
  • 使用 AES-GSM 方法解密在 GO 中编码的 C# 字符串
    php小编西瓜为您介绍一种在GO语言中解密C#字符串的方法——AES-GSM。AES-GSM是一种高级加密标准,它结合了AES(高级加密标准)和GSM(全球系统移动通信)的优势。通过使...
    99+
    2024-02-10
    go语言 安全传输
  • C++中的字符串编码处理方法
    目录字符串字面量怎么被编码成字节的窄字符和宽字符 ,怎么个宽法关于UTF-8关于VC++项目属性里的设置字符集今天由于在项目中用到一些与C++混合开发的东西 ,需要通过socket与...
    99+
    2023-05-20
    C++字符串编码 C++编码
  • 深度解密Go语言中字符串的使用
    目录Go 字符串实现原理字符串的截取字符串和切片的转换字符串和切片共享底层数组什么是万能指针字符串和其它数据结构的转化整数和字符串相互转换Parse 系列函数Format 系列函数小...
    99+
    2024-04-02
  • android中AES加解密的使用方法
    今天在android项目中使用AES对数据进行加解密,遇到了很多问题,网上也找了很多资料,也不行。不过最后还是让我给搞出来了,这里把这个记录下来,不要让别人走我的弯路,因为网上...
    99+
    2022-06-06
    方法 aes Android
  • 怎么使用C#字符串的方法
    本篇内容介绍了“怎么使用C#字符串的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!不管创建什么类型的应用程序,你都需要使用C#字符串。无...
    99+
    2023-06-18
  • C/C++中比较字符串的方法详解
    目录一、strcmp函数适用对象函数介绍用法举例二、compare()函数适用对象用法举例三、==适用对象用法举例四、strstr函数适用对象函数介绍用法举例总结一、strcmp函数...
    99+
    2023-02-05
    C比较字符串 C++比较字符串 C字符串 C++字符串
  • 如何在Python中使用字符串方法
    本篇文章给大家分享的是有关如何在Python中使用字符串方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、find方法可以在一个较长的字符串中查找子串,他返回子串所在位置的...
    99+
    2023-06-15
  • 在mysql5.5中查询字符编码的方法
    在mysql5.5中查询字符编码的方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!在mysql5.5中,可以通过“SHO...
    99+
    2024-04-02
  • php中使用substr截取字符串乱码的解决方法
    这篇文章主要介绍php中使用substr截取字符串乱码的解决方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php substr截取字符串乱码的解决办法:1、使用mbstring扩展库的“mb_substr...
    99+
    2023-06-14
  • python判断字符串编码的简单实现方法(使用chardet)
    本文实例讲述了python判断字符串编码的方法。分享给大家供大家参考,具体如下: 安装chardet模块 chardet文件夹放在/usr/lib/python2.4/site-packages目录下 ...
    99+
    2022-06-04
    字符串 简单 方法
  • C++中字符串处理问题的解决方法
    C++中字符串处理问题的解决方法概述:在C++编程中,字符串的处理是一个常见的问题,涉及到字符串的截取、拼接、查找、替换等操作。本文将介绍几种常用的解决方法,并提供具体的代码示例。一、字符串截取字符串截取是指从一个字符串中获取一部分子串。在...
    99+
    2023-10-22
    C++ 解决方法 字符串处理
  • Python字符串编码转换encode()和decode()方法怎么使用
    这篇文章主要讲解了“Python字符串编码转换encode()和decode()方法怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python字符串编码转换encode()和deco...
    99+
    2023-06-25
  • 怎么在python中使用format()方法操作字符串
    怎么在python中使用format()方法操作字符串?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python主要用来做什么Python主要应用于:1、Web...
    99+
    2023-06-14
  • 怎么在python中使用zfill方法设置字符串
    这篇文章将为大家详细讲解有关怎么在python中使用zfill方法设置字符串,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python的五大特点是什么python的五大特点:1.简单易学,开...
    99+
    2023-06-14
  • 怎么在python中使用f.read()方法返回字符串
    这篇文章将为大家详细讲解有关怎么在python中使用f.read()方法返回字符串,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python可以做什么Python是一种编程语言,内置了许多有...
    99+
    2023-06-14
  • 字符串在Java项目中有哪些使用方法
    这期内容当中小编将会给大家带来有关字符串在Java项目中有哪些使用方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。public class StudyString { public static ...
    99+
    2023-05-31
    java 字符串 中有
  • shell编程中变量,字符串,数组,函数的使用方法
    这篇文章主要介绍“shell编程中变量,字符串,数组,函数的使用方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“shell编程中变量,字符串,数组,函数的使用方法”文章能帮助大家解决问题。一. 变...
    99+
    2023-06-29
  • 怎么在python中使用f方法格式化字符串
    怎么在python中使用f方法格式化字符串?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对...
    99+
    2023-06-14
  • 如何在Centos系统中使用shadow命令生成用户密码字符串
    这期内容当中小编将会给大家带来有关如何在Centos系统中使用shadow命令生成用户密码字符串,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。perl -e 'print crypt("...
    99+
    2023-06-07
  • C# 从 UTF-8 流中读取字符串的正确方法及代码详解
     我们下面的代码是从一个流 stream 中读取 UTF-8 编码的字符串。我们可以先考虑一下其中存在的潜在问题。 string ReadString(Stream stream...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作