Почему расшифровка RSA завершается ошибкой в node.js при шифровании на C #?

#c# #node.js #security #encryption #cryptography

#c# #node.js #Безопасность #шифрование #криптография

Вопрос:

Я создаю приложение на C #, которое проверяет подлинность с помощью node.js сервер. Для этой цели я использую RSA. Я сгенерировал открытый и закрытый ключи для сервера, используя криптографию. Каждый раз, когда клиент подключается к серверу, он генерирует для себя пару ключей. Клиент получает открытый ключ сервера от конечной точки. Я использовал строки XML, а также строки PEM, но ни один из них не работал. (с использованием RSACryptoServiceProvider) Когда сервер попытался расшифровать его, он выдал ошибку декодирования OAEP. Я пытаюсь расшифровать сообщение с помощью парного закрытого ключа.

Я просматривал другие потоки, но они были не очень полезны.

Вот код для сервера. Он шифрует / расшифровывает с помощью встроенного модуля шифрования. (Я проверил это с помощью node.js клиент и node.js сервер, и это работает.)

 
var encrypt = function(input, publicKey) {
    var buffer = Buffer.from(input);
    var encrypted = crypto.publicEncrypt(publicKey, buffer);
    return encrypted.toString("base64");
};

var decrypt = function(input, privateKey) {
    var buffer = Buffer.from(input, "base64");
    var decrypted = crypto.privateDecrypt(privateKey, buffer);
    return decrypted.toString("utf8");
};

module.exports = {
    encrypt,
    decrypt
}
 

Редактировать: я создал тестовое консольное приложение C #, которое принимает входную строку и шифрует ее с помощью моего node.js открытый ключ сервера.

         public const string pubKey = "<RSAKeyValue>public key etc etc</RSAKeyValue>";
        private static void Main(string[] args)
        {
            string enc = encrypt(pubKey, args[0]);
            Console.WriteLine(enc);
        }

        public static string encrypt(string publicKey, string decrypted)
        {
            RSACryptoServiceProvider csp = new RSACryptoServiceProvider();
            csp.FromXmlString(publicKey);
            byte[] bytesPlainTextData = Encoding.UTF8.GetBytes(decrypted);
            byte[] bytesCipherText = csp.Encrypt(bytesPlainTextData, false);
            string cipherText = Convert.ToBase64String(bytesCipherText);
            return cipherText;
        }
 

Это дало мне результат VnzRc4yhIa9XcSDvHyDkwCNHFG6Ps2dddyCD4RHE4jIqvMl56DhmIJWprLRZle9EpZ/3Zq4fDkkplHUGBidoH 9VkPV/2 sV6P C 4u6yisV5zTarZfjcvsShwBp/9z4YfOE7kQZVRENhvflrRw6GutxtDz0lO4KhvdvQztm0u7JmUB9ynM7XFYXOKT391InBs2eqRh JRfJzTfhFqn3Bt8K/kKNE1xkvQV0GK7U1qSpWOWfB 0hdwNkUEQpT26jU93bAcex1SVwfbj4PJQMH6Wxzx2s6u4fcOzf9ELEgel/Fuj5b0UKHHE48B/zBmnoDsS3twt/8TJb9jbCU8S3ES/hKwndkS809bSoJl6TkBXErlOLCDpay3AO23 NjPGwSl1JvnFUVgTqAABd/yAcsokjIgxkbRqAvhC/js5Oh3y9wJwc9Z7V1ImPGcifIWsEBuH/8lerJdYw7ABB/eUZosC tQkzvjr4H9urupM0mk6Zd 92sJaG/COrwOAPkiiM6lJK9ealRrlPMEKv39aWVr brlQzN8zyoT a0oGsYSPt9B/P3CJhbkbHqw9e1u9TZ7q9Ba7x/oqeRBmpRfFrcjegGFQkYViYkd1bswNF3KumqhBCsw4VeTkYmRNCKrLZdZyJ5BLSfvc PTPOzDPVgOZb1InacmIWOqkapRbeELc=

Затем я выполнил простой console.log(decrypt(stringAbove, privateKey));

Он по-прежнему выдает мне следующую ошибку: Error: error:04099079:rsa routines:RSA_padding_check_PKCS1_OAEP_mgf1:oaep decoding error

Ответ №1:

Существует несколько типов заполнения, и, по-видимому, шифрование пытается использовать PKCS1 (я полагаю), а для дешифрования по умолчанию используется значение OAEP.

В crypto.privateDecrypt вы можете установить заполнение, например. padding: crypto.constants.RSA_PKCS1_PADDING и это должно сработать.

Вы должны использовать OAEP на обоих концах, если это возможно (и это должно быть), и в этом случае ваш код узла уже в порядке, поскольку по умолчанию используется OAEP, и для C # также должно быть установлено значение OAEP.

Редактировать: сначала я все перепутал, но дело в том, что вы можете установить тип заполнения на любом конце, и они должны совпадать. 🙂

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

1. Спасибо. Я изменил его на OAEP, и теперь код работает нормально. 🙂

2. Это общее правило при выполнении криптографии в разных системах. Вы не можете полагаться на значения по умолчанию, потому что разные системы имеют разные значения по умолчанию. Вам нужно установить все явно, чтобы вы знали, что оно одинаково с обеих сторон.