#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. Это общее правило при выполнении криптографии в разных системах. Вы не можете полагаться на значения по умолчанию, потому что разные системы имеют разные значения по умолчанию. Вам нужно установить все явно, чтобы вы знали, что оно одинаково с обеих сторон.