5

我在 .Net 中创建了一个加密的 cookie,我正在尝试在 nodejs 中解密它的内容。但是nodejs不断抛出异常“TypeError:DecipherFinal失败”

在 .Net 中,我使用带有密钥的 AES 加密方法

932D86BB1448EEAA423F38495A2290746D81C27E55D1DC264279537006D6F4CC.

我的 web.config 文件有以下行

<machineKey validationKey="A5326FFC9D3B74527AECE124D0B7BE5D85D58AFB12AAB3D76319B27EE57608A5A7BCAB5E34C7F1305ECE5AC78DB1FFEC0A9435C316884AB4C83D2008B533CFD9" 
decryptionKey="932D86BB1448EEAA423F38495A2290746D81C27E55D1DC264279537006D6F4CC" 
validation="SHA1" decryption="AES"  />

在 .Net 中生成我的 cookie 的代码如下所示:

var ticket = new FormsAuthenticationTicket(0, "test", DateTime.Now, DateTime.Now.AddYears(1), true, "test");
var encryptedTicket = FormsAuthentication.Encrypt(ticket);
Response.Cookies.Add(new HttpCookie(cookieName, encryptedTicket));

解密cookie的nodejs代码是

var crypto = require('crypto');
var logger = require('winston');
var deckey = "932D86BB1448EEAA423F38495A2290746D81C27E55D1DC264279537006D6F4CC";

function hex2a(hex) {
  var str = '';
  for (var i = 0; i < hex.length; i += 2)
    str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
  return str;
}

function decrypt(cookie) {          
  var ivc = cookie, iv, cipherText, ivSize = 16, res;

  ivc = new Buffer(ivc, 'hex');
  iv = new Buffer(ivSize);

  cipherText = new Buffer(ivc.length - ivSize);
  ivc.copy(iv, 0, 0, ivSize);
  ivc.copy(cipherText, 0, ivSize);

  iv = new Buffer(Array(16));
  c = crypto.createDecipheriv('aes-256-cbc', hex2a(deckey), iv.toString());
  res = c.update(cipherText, 'binary');
  res += c.final('binary'); //<-- throws TypeError: DecipherFinal fail
  return res;
 }

我有点迷茫,我会很感激关于可能是什么问题的提示或想法。

4

3 回答 3

1

您可以在此处查看 Encryp 和 Decrypt 的源代码以及所有不同的可能性(Framework20SP1、Framework20SP2 等)

https://github.com/Microsoft/referencesource/blob/master/System.Web/Security/FormsAuthentication.cs

我花了几个小时才读完这段代码,但一旦你得到它,就可以为你的特定加密设置编写一个简单的代码。

于 2016-01-27T17:48:39.660 回答
0

键不是字符串,看一下方法fromCharCode()

fromCharCode()方法将 Unicode 值转换为字符。

这意味着任何十六进制都将转换为文本字符,而createDecipheriv()方法指定:

key 和 iv 必须是“二进制”编码的字符串或缓冲区。

请注意,这只是可能存在的问题之一,我还没有时间运行代码(还)。

于 2012-12-16T16:15:25.453 回答
0

您的问题可能是默认打开的自动填充失败。您想通过添加以下内容来关闭它:

c.setAutoPadding(false);
于 2014-11-12T11:01:07.793 回答