5

暗号化された Cookie を .Net で作成しました。そのコンテンツを nodejs で復号化しようとしています。しかし、nodejsは例外「TypeError: DecipherFinal fail」をスローし続けます

.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 値を文字に変換します。

これは、すべての 16 進数がテキスト文字に変換されることを意味しますが、createDecipheriv()メソッドは次のように指定します。

key と iv は、「バイナリ」でエンコードされた文字列またはバッファでなければなりません。

これは存在する可能性のある問題の 1 つにすぎないことに注意してください。コードを実行する時間がありませんでした (まだ)。

于 2012-12-16T16:15:25.453 に答える
0

あなたの問題はおそらく、デフォルトでオンになっている自動パディングの失敗です。以下を追加して、これをオフにします。

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