Некоторое время я читал статью в CodeProject, в которой объясняется, как шифровать и расшифровывать с помощью поставщика RSA:
Шифрование закрытого ключа RSA
В то время как старая версия 2009 года содержала ошибки, новая версия 2012 года (с поддержкой System.Numerics.BigInteger) кажется более надежной. Однако в этой версии отсутствует способ шифрования с помощью открытого ключа и дешифрования с помощью закрытого ключа.
Итак, я пробовал сам, но при расшифровке получаю мусор. Я не знаком с провайдером RSA, поэтому я здесь в неведении. Трудно найти дополнительную информацию о том, как это должно работать.
Кто-нибудь видит, что с этим не так? Следующее - Шифрование с ПУБЛИЧНЫМ ключом:
// Add 4 byte padding to the data, and convert to BigInteger struct
BigInteger numData = GetBig( AddPadding( data ) );
RSAParameters rsaParams = rsa.ExportParameters( false );
//BigInteger D = GetBig( rsaParams.D ); //only for private key
BigInteger Exponent = GetBig( rsaParams.Exponent );
BigInteger Modulus = GetBig( rsaParams.Modulus );
BigInteger encData = BigInteger.ModPow( numData, Exponent, Modulus );
return encData.ToByteArray();
Я использую большую букву D от провайдера, когда это делаю? Вероятно, нет, поскольку это открытый ключ, у которого нет буквы «D».
Затем аналог (расшифровка с использованием ЧАСТНОГО ключа):
BigInteger numEncData = new BigInteger( cipherData );
RSAParameters rsaParams = rsa.ExportParameters( true );
BigInteger D = GetBig( rsaParams.D );
//BigInteger Exponent = GetBig( rsaParams.Exponent );
BigInteger Modulus = GetBig( rsaParams.Modulus );
BigInteger decData = BigInteger.ModPow( numEncData, D, Modulus );
byte[] data = decData.ToByteArray();
byte[] result = new byte[ data.Length - 1 ];
Array.Copy( data, result, result.Length );
result = RemovePadding( result );
Array.Reverse( result );
return result;
Нужна ли мне здесь "D" или экспонента?
Очевидно, мне нужно, чтобы криптовалюта работала в обоих направлениях: частное-государственное-государственное-частное. Любая помощь приветствуется!