nodejs使用aes128ecb加密如何在c中解密

22次阅读

共计 1229 个字符,预计需要花费 4 分钟才能阅读完成。

最近需要在 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