Подпишите шестнадцатеричное дайджест-сообщение с помощью крипто-библиотеки js

#javascript #c# #node.js #cryptography

Вопрос:

Мне нужна твоя помощь. У меня есть пример C#, как подписать дайджест сообщения

             signatureFormatter.SetHashAlgorithm("SHA1");
            string keyText = Convert.ToBase64String(_certificate.PrivateKey);
            byte[] signature = signatureFormatter.CreateSignature(hash);
            return signature;

Later it converts it to base64:

            Convert.ToBase64String(signature)
 

Мне нужно достичь того же результата с помощью встроенной библиотеки node crypto, что я написал:

 const crypto = require('crypto');

...

const sig = crypto.createSign('RSA-SHA1');
sig.update(hashValue, 'hex');
sig.end();
const signature = sig.sign(privateKeyString, 'base64');

 

В результате я получаю разные подписи для одного и того же хэша, пожалуйста, помогите мне, как решить эту проблему

*** Обновление ***

Оригинальная функция C#

 private byte[] CreateSignature(byte[] hash)
        {
            RSAPKCS1SignatureFormatter signatureFormatter = new RSAPKCS1SignatureFormatter(_certificate.PrivateKey);
            signatureFormatter.SetHashAlgorithm("SHA1");
            byte[] signature = signatureFormatter.CreateSignature(hash);
            return signature;
        }
 

Обновление node.js функция

         const hashValue= '332a400fdab5b01efcd8407c61987495270ec1b6';
     
        const sig = crypto.createSign('RSA-SHA1');
        sig.update(Buffer.from(hashValue, 'utf-8'));
        sig.end();
        const sign = sig.sign(privateKeyString, 'base64');
 

Комментарии:

1. Вы кодируете хэш-значение шестнадцатеричным кодом, но вы не делаете этого в коде C#. Вы никогда не будете подписывать шестнадцатеричные цифры, вы подписываете сами байты . Шестнадцатеричный != байт.

2. @MaartenBodewes большое вам спасибо за ваш ответ, не могли бы вы, пожалуйста, помочь мне это исправить? Я обновил вопрос, добавил исходную функцию и как в настоящее время я пытаюсь преобразовать ее в node.js. Я взял переменную «hashValue», преобразованную в массив шестнадцатеричных байтов из примера C#

3. @MaartenBodewes попытался использовать буфер, но он все равно возвращает неправильную подпись