Как передать CspParameters другому RSACryptoServiceProvider для шифрования и расшифровать его

В настоящее время я работаю над проектом с Xamarin и WCF, в котором WCF сгенерирует CspParameter на WCF и передаст BLOB-объект Xamarin.

CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = KEY_CONTAINER_NAME;
cspParams.Flags = CspProviderFlags.UseArchivableKey | CspProviderFlags.NoPrompt | CspProviderFlags.UseMachineKeyStore;

RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(KEY_SIZE_BIT, cspParams) { PersistKeyInCsp = true };

В котором позже WCF возвращает byte[] CspBlob, используя код ниже.

rsaProvider.ExportCspBlob(false)

На стороне клиента (приложение Xamarin) я воссоздаю CspParameter и шифрую текст, используя код ниже, и отправляю обратно в функцию WCF для расшифровки.

RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();
rsaProvider.ImportCspBlob(cspBlob);

string cipherText = rsaProvider.Encrypt(Encoding.UTF8.GetBytes(message), true);

До этого момента ошибки не было. Однако во время расшифровки возникает ошибка.

CspParameters cspParams = new CspParameters() { KeyContainerName = KEY_CONTAINER_NAME };
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(cspParams);

byte[] decryptBytes = rsaProvider.Decrypt(cipherBytes, true); //Error here

Ошибка "Произошла ошибка при декодировании заполнения OAEP". Я ищу в Интернете, эта ошибка связана с неправильным сообщением при расшифровке.

Я проверил другой поток, который использует тот же CspParameter (не проходя через WCF и делая все в том же потоке) для шифрования и дешифрования, не выдается никакой ошибки. Поэтому я подозреваю, что это из-за ExportCspBlob, в котором ImportCspBlob не создается так же, как оригинальный CspParameter.

Могу ли я узнать, есть ли у кого-нибудь предложение об обходном пути? Благодарю.

1 ответ

Пожалуйста, измените с

string cipherText = rsaProvider.Encrypt(Encoding.UTF8.GetBytes(message), true);

в

byte[] cipherText = rsaProvider.Encrypt(Encoding.UTF8.GetBytes(message), true);
Другие вопросы по тегам