Perl и .NET RSA работают вместе? Шифрование в .NET из открытого ключа Perl? Загрузка закрытого ключа из Perl? - PullRequest
3 голосов
/ 14 декабря 2010

У меня есть приложение, которое собирается получить открытый ключ от третьей стороны.Открытый ключ генерируется в 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 #, я чувствую, что довольно свободно в этом разбираюсь.Однако я неофит, когда дело доходит до шифрования.

1 Ответ

0 голосов
/ 07 января 2012

Ознакомьтесь с Как использовать ветку RSACryptoServiceProvider.ImportParameters () на форумах MSDN.Он решает ту же проблему, о которой вы спрашиваете здесь.Вполне возможно, что getBytes использует ваши данные открытого ключа.В одном из сообщений, опубликованных Voss в теме, содержится исправление класса BigInteger для проблемы с getBytes.

...