Как передать 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);