У меня есть приложение, которое собирается получить открытый ключ от третьей стороны.Открытый ключ генерируется в Perl с использованием Crypt :: RSA :: Key.Используя класс BigInteger , я могу загрузить этот ключ и зашифровать значения, которые можно расшифровать с помощью закрытого ключа.Мой код для этого:
Настройка свойств для последующего использования:
internal RSAParameters RsaParams
{
get { return this._rsaParams; }
set { this._rsaParams = value; }
}
public BigInteger Modulus
{
get { return new BigInteger(this._modulus, 10); }
}
public BigInteger Exponent
{
get { return new BigInteger(this._exponent, 10); }
}
// ... snip ... //
Инициализация свойств в конструкторе:
RSAParameters rsaParameters = new RSAParameters();
rsaParameters.Exponent = this.Exponent.getBytes();
rsaParameters.Modulus = this.Modulus.getBytes();
this.RsaParams = rsaParameters;
// ... snip ... //
Выполнение шифрования.Примечание текст - мое значение для шифрования; ret - это возвращаемое мной значение:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
rsa.ImportParameters(this.RsaParams);
Byte[] toEncode = encoding.GetBytes(text);
Byte[] encryptedVal = rsa.Encrypt(toEncode, true);
ret = Convert.ToBase64String(encryptedVal);
Большая часть этого кода была взята из чужого проекта, который утверждает, что все это работает для них.К сожалению, я не могу увидеть их фактические входные значения.
Это происходит с ошибкой, когда недопустимое значение возвращается третьей стороне.
FIRST QUESTION - doВы видите что-то не так в коде выше?
ВТОРОЕ
Я попытался отладить это, поговорив с третьей стороной и получив от них закрытый ключ.У меня не получается, когда я пытаюсь загрузить полный закрытый ключ.Я не могу понять соответствие между данными объекта Perl и параметрами .NET RSAParameters.Ключевые данные, которые у меня есть:
$VAR1 = bless( {
'Version' => '1.91', 'Checked' => 0, 'Identity' => 'stuff for me (2048)', 'private'=> {'_phi' => '218..snip..380', '_n' => '218..snip..113', '_q' => '148..snip..391', '_p'=>' 146..snip..343 ',' _u '=>' 127..snip..655 ',' _dp '=>' 127..snip..093 ',' _dq '=>' 119..snip..413 ',' _d '=>' 190..snip..533 ',' _e '=>' 65537 '},' Cipher '=>' Blowfish '},' Crypt :: RSA ::Key :: Private ');
Я выяснил, что сопоставление с объектами RSAParameters таково:
_phi = ???
_n = RSAParameters.Modulus
_q = RSAParameters.Q
_p = RSAParameters.P
_u = ???
_dp = RSAParameters.DP
_dq = RSAParameters.DQ
_d = RSAParameters.D
_e = RSAParameters.Exponent
??? = RSAParamaters.InverseQ
Когда я загружаю эти значения (все с использованием класса BigInteger втак же, как указано выше);Я терплю неудачу с «Плохие данные».ошибка при попытке вызвать: rsa.ImportParameters (this.RsaParams);
Трассировка стека этой ошибки:
System.Security.Cryptography.CryptographicException was unhandled
Message="Bad Data.\r\n"
Source="mscorlib"
StackTrace:
at System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 hr)
at System.Security.Cryptography.Utils._ImportKey(SafeProvHandle hCSP, Int32 keyNumber, CspProviderFlags flags, Object cspObject, SafeKeyHandle& hKey)
at System.Security.Cryptography.RSACryptoServiceProvider.ImportParameters(RSAParameters parameters)
at SandboxApp2.SandboxDecrypter.DecryptText(String text) in C:\Doug\Development\SandboxApp2\SandboxApp2\SandboxDecrypter.cs:line 101
at SandboxApp2.Form1.btnGoDecrypter_Click(Object sender, EventArgs e) in C:\Doug\Development\SandboxApp2\SandboxApp2\Form1.cs:line 165
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at SandboxApp2.Program.Main() in C:\Doug\Development\SandboxApp2\SandboxApp2\Program.cs:line 17
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
Любые идеи для этой части вопроса?
Наконец, я в первую очередь разработчик VB.NET, но в обоих случаях, когда дело доходит до C #, я чувствую, что довольно свободно в этом разбираюсь.Однако я неофит, когда дело доходит до шифрования.