Я искал решение, но не могу найти функциональное решение.
Мне нужно передать строку (AESkey) из приложения C # на сервер PHP.
Клиент (в C #) загружает файл key.public.pem (открытый ключ) и шифрует проход, а затем отправляет его на сервер.
Сервер принимает файл key.pem (закрытый ключ).
Сервер в PHP:
function RSADecryption($text) {
//re() reads a document an return it as string
openssl_private_decrypt(base64_decode($text), $decrypted,re("key.pem"));
return $decrypted;
}
Клиент в C #:
using System;
using System.Text;
using System.Security.Cryptography;namespace myApp
{
class MyRSA
{
public static MyRSA getMyRSA()
{
if (_Instance == null)
{
_Instance = new MyRSA();
}
return _Instance;
}
public Boolean setPubKey(string url)
{
System.Net.WebClient wc = new System.Net.WebClient();
try
{
publicKey = wc.DownloadString(url);
}
catch(Exception e)
{
return false;
}
return true;
}
public string crypt(string text)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
RSAParameters rsaParam = rsa.ExportParameters(false);
rsaParam.Modulus = Convert.FromBase64String(publicKey.Replace("-----BEGIN PUBLIC KEY-----", "").Replace("-----END PUBLIC KEY-----", ""));
rsa.ImportParameters(rsaParam);
byte[] encValue = rsa.Encrypt(Encoding.UTF8.GetBytes(text), false);
return Convert.ToBase64String(encValue);
}private static MyRSA _Instance;
private static string publicKey;
private MyRSA() {}
}
}
А потом я делаю что-то подобное из основного:
MyRSA rsa = MyRSA.getMyRSA();
rsa.setPubKey(site+"key.public.pem");
sendData(rsa.crypt(user));
Я думаю, что проблема в дешифраторе (функция PHP), потому что ничего не возвращает.
Я не знаю, но, возможно, проблема в том, что вы не можете зашифровать с помощью RSACryptoServiceProvider и расшифровать с помощью openssl?
Потому что они используют разные параметры или другие подобные вещи?
Например, я сгенерировал этот ключ AES:
сА? мкВт = kImEYGsgu
Я использую этот открытый ключ
——НАЧАТЬ ПУБЛИЧНЫЙ КЛЮЧ ——
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApxjhdfvCuafPZmE // CoM
OVxBZvMXjwlcyaCfnTuVdbewQ5ITu6hlJ3vX / oTMbik7DprsWoc2tGk3Rx7RdAPd
n3VnPm62QjaKtETWJ8 / 5Nzf + MxlVD0t5tzqzhniZ5BKZTtvCI6STbrFYnKcJwTyI
eaEDNtre5EaqEBbrYhlGTRxNmz2SdRi9Im9iCSw9pjDVDDJdzmhENhASmFQMeo7N
IS8AY3zJSjOQPKFymZrSa8hxWp88K1 / igxs12IhhpqNjMiUi29gH2T + QLPTDzwEq
EHTY1K6B0zlNuyp8HR5pNOqYymdnoSpCV3z0deTobAF7KiFYp2pXvoNo8Pc19Yl0
mQIDAQAB
—— КОНЕЦ ОБЩЕСТВЕННОГО КЛЮЧА ——
И зашифрованный пароль был:
CgG33ytbS3CuK + rOpJRamQ6e8xCj7Q35m6YxWXc44r / D03VubXZO1f5 / zF7Zsc42UOOwqbYahApXBXL6o3J5MVu0cDkjstVoUnFJiPRHWmwq9AA0uvLC55gou + VzvmvRzFO38LMZ2BpsQLOjfv16LGWx7MLfKSVFGC8YVHgv6QlEbDFdd / HJDbqAKOoyQWlKXfVeMKmd8ORnq3 + B3Tmk57O3BHDVOlmezSgf + YN828u4ChZ08JzjgBo7MP2xCl6pLEeZxiFGjRwrTgRfLXQ7aMB / RyeMMHwInJiTS3 / M2Mez8C3 / + Za / DIfrLDA9LVdRYdy2n4AxbtyrLTun4mjDO + pYS3HqZlGn2MW5Orc9VH + 1CPn2omLVj / qqa6tIoFuJOdpxn / Y9
Спасибо за вашу поддержку.
С уважением.
Если в вашем файле .PEM написано «BEGIN PUBLIC KEY», то это, вероятно, структура X.509 SubjectPublicKeyInfo. Это означает, что выглядит
30 xx // SEQUENCE (SubjectPublicKeyInfo)
30 0D // SEQUENCE (AlgorithmIdentifier)
06 09 2A 86 48 86 F7 0D 01 01 01 // OID (algorithm = rsaEncryption)
05 00 // NULL (parameters)
03 xx // BIT STRING (subjectPublicKey)
30 xx // SEQUENCE (RSAPublicKey)
02 xx [modulus value here] // INTEGER (Modulus)
02 xx [exponent value here] // INTEGER (Exponent)
Который является DER-кодированным блобом. Каждый из xx
Значения представляют длину, которая может быть больше одного байта.
Поэтому, когда вы загружаете этот ключ, вы берете все служебное / структурное содержимое, а также байты модуля И байты экспоненты и вызываете весь этот модуль. Таким образом, общий эффект заключается в том, что вы шифруете другим открытым ключом, чем вы расшифровываете.
.NET не облегчает чтение содержимого ключа PEM. Лучше всего превратить этот ключ в сертификат. Если у вас еще нет сертификата, вы можете сделать openssl req -x509 -new -key theprivatekey.pem -out selfsignedcert.cer
(и ответьте на все, что вам нравится, для предметных подсказок).
В противном случае, вы теперь уменьшены до Как загрузить открытый ключ RSA из файла в C # (и другие связанные вопросы).
Других решений пока нет …