У меня проблема с шифрованием и расшифровкой C # с использованием RSA. Я разработал веб-сервис, который будет отправлять конфиденциальную финансовую информацию и транзакции. Я хотел бы иметь возможность на стороне клиента зашифровать определенные поля с помощью закрытого ключа RSA клиента. После того, как он достигнет моей службы, он расшифрует с помощью открытого ключа клиента.
В настоящее время я продолжаю получать «Данные, которые будут расшифрованы, превышают максимум для этого модуля в 128 байтов». исключение. Я не особо разбирался в криптографии C # RSA, поэтому любая помощь будет принята с благодарностью.
Это метод, который я использую для генерации ключей
private void buttonGenerate_Click(object sender, EventArgs e)
{
string secretKey = RandomString(12, true);
CspParameters param = new CspParameters();
param.Flags = CspProviderFlags.UseMachineKeyStore;
SecureString secureString = new SecureString();
byte[] stringBytes = Encoding.ASCII.GetBytes(secretKey);
for (int i = 0; i < stringBytes.Length; i++)
{
secureString.AppendChar((char)stringBytes[i]);
}
secureString.MakeReadOnly();
param.KeyPassword = secureString;
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(param);
rsaProvider = (RSACryptoServiceProvider)RSACryptoServiceProvider.Create();
rsaProvider.KeySize = 1024;
string publicKey = rsaProvider.ToXmlString(false);
string privateKey = rsaProvider.ToXmlString(true);
Repository.RSA_XML_PRIVATE_KEY = privateKey;
Repository.RSA_XML_PUBLIC_KEY = publicKey;
textBoxRsaPrivate.Text = Repository.RSA_XML_PRIVATE_KEY;
textBoxRsaPublic.Text = Repository.RSA_XML_PUBLIC_KEY;
MessageBox.Show("Please note, when generating keys you must sign on to the gateway\n" +
" to exhange keys otherwise transactions will fail", "Key Exchange", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
После того, как я сгенерировал ключи, я отправляю открытый ключ веб-службе, которая сохраняет его в виде файла XML.
Теперь я решил проверить это, так что вот мой метод для шифрования строки
public static string RsaEncrypt(string dataToEncrypt)
{
string rsaPrivate = RSA_XML_PRIVATE_KEY;
CspParameters csp = new CspParameters();
csp.Flags = CspProviderFlags.UseMachineKeyStore;
RSACryptoServiceProvider provider = new RSACryptoServiceProvider(csp);
provider.FromXmlString(rsaPrivate);
ASCIIEncoding enc = new ASCIIEncoding();
int numOfChars = enc.GetByteCount(dataToEncrypt);
byte[] tempArray = enc.GetBytes(dataToEncrypt);
byte[] result = provider.Encrypt(tempArray, true);
string resultString = Convert.ToBase64String(result);
Console.WriteLine("Encrypted : " + resultString);
return resultString;
}
Я получаю то, что кажется зашифрованным значением. В тестовом крипто-веб-методе, который я создал, я затем беру эти зашифрованные данные, пытаюсь расшифровать данные с помощью открытого ключа клиента и отправить его в открытом виде. Но это где исключение. Вот мой метод, ответственный за это.
public string DecryptRSA(string data, string merchantId)
{
string clearData = null;
try
{
CspParameters param = new CspParameters();
param.Flags = CspProviderFlags.UseMachineKeyStore;
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(param);
string merchantRsaPublic = GetXmlRsaKey(merchantId);
rsaProvider.FromXmlString(merchantRsaPublic);
byte[] asciiString = Encoding.ASCII.GetBytes(data);
byte[] decryptedData = rsaProvider.Decrypt(asciiString, false);
clearData = Convert.ToString(decryptedData);
}
catch (CryptographicException ex)
{
Log.Error("A cryptographic error occured trying to decrypt a value for " + merchantId, ex);
}
return clearData;
}
Если бы кто-нибудь мог мне помочь, это было бы замечательно, как я уже сказал, я мало что сделал с шифрованием / дешифрованием C # RSA.