Результат шифрования TripleDES отличается в C # и Node JS - PullRequest
0 голосов
/ 25 января 2019

Возможно, это дубликат, но я не могу его исправить. Ниже мой код в C # для tripleDES:

using System;
using System.Security.Cryptography;
using System.IO;
using System.Text;

class MainClass {
   public static void Main (string[] args) {

   String encrypt="5241110000602040";
   SymmetricAlgorithm sa= SymmetricAlgorithm.Create("TripleDES");
   sa.Key= Convert.FromBase64String("FRSF1P3b6fHiW/DXrK8ZJks5KAiyNpP0");
   sa.IV=Convert.FromBase64String("YFKA0QlomKY=");


   byte[] iba=Encoding.ASCII.GetBytes(encrypt);
   MemoryStream mS=new MemoryStream();

   ICryptoTransform trans=sa.CreateEncryptor();
   byte[] buf= new byte[2049];

   CryptoStream cs=new CryptoStream(mS,trans,CryptoStreamMode.Write);

   cs.Write(iba,0,iba.Length);
   cs.FlushFinalBlock();

   Console.WriteLine(Convert.ToBase64String(mS.ToArray()));


 }
}

Зашифрованное значение

Nj7GeyrbJB93HZLplFZwq5HRjxnvZSvU

Я хочу добиться того же с библиотекой crypto-js nodejs. Вот код nodejs того, что я пробовал:

var CryptoJS = require("crypto-js");

var text = "5241110000602040";
var key = "FRSF1P3b6fHiW/DXrK8ZJks5KAiyNpP0";

var options = {
//  mode: CryptoJS.mode.ECB, 
//  padding: CryptoJS.pad.Pkcs7,
iv: CryptoJS.enc.Hex.parse("YFKA0QlomKY=")
};

var textWordArray = CryptoJS.enc.Utf8.parse(text);
var keyHex = CryptoJS.enc.Hex.parse(key);

var encrypted = CryptoJS.TripleDES.encrypt(textWordArray, keyHex, options);

var base64String = encrypted.toString();

console.log('encrypted val: ' + base64String);

Ожидаемый результат

Nj7GeyrbJB93HZLplFZwq5HRjxnvZSvU

Фактический вывод

NXSBe9YEiGs5p6VHkzezfdcb5o08bALB

Зашифрованное значение в nodejs отличается от C #. Что я делаю не так?

1 Ответ

0 голосов
/ 25 января 2019

Вы по-разному декодируете ключ и iv.

В c # вы используете base64:

sa.Key= Convert.FromBase64String("FRSF1P3b6fHiW/DXrK8ZJks5KAiyNpP0");
sa.IV=Convert.FromBase64String("YFKA0QlomKY=");

в node.js hex:

iv: CryptoJS.enc.Hex.parse("YFKA0QlomKY=")
var key = "FRSF1P3b6fHiW/DXrK8ZJks5KAiyNpP0";
var keyHex = CryptoJS.enc.Hex.parse(key);

Попробуйте использовать base64в обоих случаях.

...