nodejs使用aes-128-ecb加密如何在c#中解密

最近需要在nodejs上加密jwt,C#端解密jwt得到用户信息

class JwtService extends Service {
  encrypt(content) {
    const secretkey = this.app.config.jwt.key // 唯一(公共)秘钥
    const cipher = crypto.createCipher('aes-128-ecb', secretkey) // 使用aes128加密
    let enc = cipher.update(content, 'utf8', 'hex') // 编码方式从utf-8转为hex;
    enc += cipher.final('hex')// 编码方式转为hex;
    return enc
  }
}

却发现C#端怎么也解密不了,一直报错,改了一整天,后来终于发现,nodejs端加密用的key其实在使用之前已经使用md5加密了一次,而这个操作是默认的,暂时没发现有配置可以默认去掉,服务端如果需要使用这个key解密,则需要也同样使用MD5加密

public static string AesDecrypt(string content, string key)
        {
            // nodejs aes加密默认的key使用了md5加密,所以C#解密的key也要默认使用md5
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] output = Encoding.UTF8.GetBytes(key);
            byte[] keyArray = md5.ComputeHash(output);

            byte[] toEncryptArray = HexStringToBinary(content);

            RijndaelManaged des = new RijndaelManaged();
            des.Key = keyArray;
            des.Mode = CipherMode.ECB;
            des.Padding = PaddingMode.PKCS7;

            ICryptoTransform cTransform = des.CreateDecryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

            return Encoding.UTF8.GetString(resultArray);
        }

代码使用了一个函数把16进制转成字节数组

public static byte[] HexStringToBinary(string hexstring)
        {

            var inputByteArray = new byte[hexstring.Length / 2];
            for (var x = 0; x < inputByteArray.Length; x++)
            {
                var i = Convert.ToInt32(hexstring.Substring(x * 2, 2), 16);
                inputByteArray[x] = (byte)i;
            }
          
            return inputByteArray;
        }

解决问题,却花费一天时间

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C语言入门到精通

“他根本不需要什么编程规范,他的代码就是编程规范。”

个人名望:程序技术问答网站 Stack Overflow 总排名第一的大神,每月的问答量保持在 425 个左右。

18360
来自专栏机器人课程与技术

ros2之turtlesim命令

版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)

15140
来自专栏DotNet Core圈圈

C# 8.0 中的模式匹配

多年来,我们在 C# 中实现了许多功能,不仅改善了代码的性能,更重要的是还提高了代码的可读性。鉴于软件行业的快速发展,语言当然需要与其用户群同步发展。广泛用于 ...

13610
来自专栏DotNet程序园

C#并发实战Parallel.ForEach使用

前言:最近给客户开发一个伙食费计算系统,大概需要计算2000个人的伙食。需求是按照员工的预定报餐计划对消费记录进行检查,如有未报餐有刷卡或者有报餐没刷卡的...

10520
来自专栏DotNet Core圈圈

分层 Blazor 组件

作为加入单页应用程序 (SPA) 队伍的最新框架,Blazor 有机会在其他框架(如 Angular 和 React)的最佳特性基础之上构建而成。尽管 Blaz...

25910
来自专栏DotNet Core圈圈

结合使用 C# 和 Blazor 进行全栈开发

Blazor 是将 C# 引入浏览器的 Microsoft 试验框架,正好可以填补欠缺的 C# 一环。如今,C# 程序员可以编写桌面、服务器端 Web、云、电话...

15640
来自专栏申龙斌的程序人生

通过欧拉计划学习Rust编程(第13~16题)

最近想学习Libra数字货币的MOVE语言,发现它是用Rust编写的,所以先补一下Rust的基础知识。学习了一段时间,发现Rust的学习曲线非常陡峭,不过仍有快...

11710
来自专栏编程入门之C语言

Android native进程间通信实例-binder篇之——HAL层访问JAVA层的服务

有一天在群里聊天的时候,有人提出一个问题,怎样才能做到HAL层访问JAVA层的接口?刚好我不会,所以做了一点研究。

24740
来自专栏编程入门之C语言

Android native进程间通信实例-binder篇之——解决实际问题inputreader内建类清楚缓存

我在实际开发中,遇到一个问题,在电容屏驱动中没有发送input_sync 给上层,导致电容屏有的数据缓存在inputreader 中,会导致系统一系列奇怪问题发...

6820
来自专栏不止dotNET

dotNET Core WebAPI 统一处理(返回值、参数验证、异常)

现在 Web 开发比较流行前后端分离,我们的产品也是一样,前端使用Vue,后端使用 dotNet Core WebAPI ,在写 API 的过程中有很多地方需要...

1.8K30

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励