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

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