Я мигрирую на RSACng для выпуска новой версии от RSACryptoServiceProvider.Однако, поскольку RSACryptoserviceProvider, который является CAPI, использует архитектуру Little Endian, а RSACng, то есть API CNG, использует архитектуру Big Endian, вопрос заключается в том, как я могу расшифровать данные с использованием API-интерфейса CNG, который ранее был зашифрован с использованием поставщика RSACryptoService (CAPI)?
Я уже пробовал Array.reverse (cypherText) и пытался расшифровать, используя CNG Api, но выдает ошибку «Параметр неверен».
Я также попробовал подход расшифровки половины зашифрованного текста, потому что CNG API использует заполнение RSAEncryptionPadding.OaepSHA512, тогда как CAPI использует заполнение OAEP.
Мой класс RSACryptoServiceProvider выглядит следующим образом: -
public static void EncryptWithSystemKeyRSACryptoService(byte[]
plainBytes, bool representsUnicodeString, out string cypherText)
{
CspParameters cp = new CspParameters();
cp.KeyContainerName = regValue.ToString();
cp.Flags = CspProviderFlags.UseMachineKeyStore;
cp.KeyNumber = (int)KeyNumber.Exchange;
byte[] encBlockData=null;
using (RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider(cp))
{
res = CryptResult.GeneralError;
int keysize = rsaCSP.KeySize;
//This encrypts data and uses FOAEP padding
encBlockData = rsaCSP.Encrypt(plainBytes, true);
}
//Should i have to reverse the Byte order?
// I am doing Array.reverse for encrypted data as it follows little endian architecture and CNG Api follows Big Endian architecture
Array.Reverse(encBlockData);
cypherText = BitConverter.ToString(encBlockData );
cypherText = cypherText.Replace("-", "");
cypherText = cypherText.ToLower();
}
Вот как я шифрую данные с помощью провайдера RSACryptoservice (CAPI) Мой класс RSACng выглядит следующим образом: -
//I am calling this to use RSACng API to get private keys
private static byte[] SetPrivateAndPublicKeysAndDecrypt(byte[] cyphertext)
{
cp.KeyContainerName = regValue.ToString();
cp.Flags = CspProviderFlags.UseMachineKeyStore;
cp.KeyNumber = (int)KeyNumber.Exchange;
using (RSACryptoServiceProvider rsaCSP = new
RSACryptoServiceProvider(cp))
{
res = CryptResult.GeneralError;
keysize = rsaCSP.KeySize;
q = rsaCSP.ExportCspBlob(false);
RSAp = rsaCSP.ExportParameters(true);
}
//created cngKey
cngKey = CngKey.Import(q, CngKeyBlobFormat.GenericPublicBlob);
//created RSACng instance
RSACng rsacng = new RSACng(cngKey)
{
KeySize = keysize
};
rsacng.ImportParameters(RSAp);
//Decrypt using RSACng API using OAEPSHA512 padding
var plainText= crypto.Decrypt(cyphertext, RSAEncryptionPadding.OaepSHA512);
return plainText;
}
Ожидаемый результат должен быть -> обычный текст успешно расшифрован
Фактический результат-> Обнаружено исключение-> 'Параметр неверен'.