Perl 和 .NET RSA 一起工作?从 Perl 公钥在 .NET 中加密?从 Perl 加载私钥?
Posted
技术标签:
【中文标题】Perl 和 .NET RSA 一起工作?从 Perl 公钥在 .NET 中加密?从 Perl 加载私钥?【英文标题】:Perl & .NET RSA working together? Encrypting in .NET from Perl public key? Loading private key from Perl? 【发布时间】:2010-12-14 00:10:32 【问题描述】:我有一个应用程序将从第三方获取公钥。公钥是在 Perl 中使用 Crypt::RSA::Key 生成的。使用BigInteger class,我能够加载此密钥并加密应该能够由私钥解密的值。我这样做的代码是:
设置属性以供以后使用:
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);
// ... 剪辑 ... //
在构造函数中初始化属性:
RSAParameters rsaParameters = new RSAParameters();
rsaParameters.Exponent = this.Exponent.getBytes();
rsaParameters.Modulus = this.Modulus.getBytes();
this.RsaParams = rsaParameters;
// ... 剪辑 ... //
进行加密。注意 text 是我要加密的值; 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);
大部分代码是从其他人的项目中提取的,他们声称这一切都适用于他们。不幸的是,我无法看到它们的实际输入值。
这失败了,将无效值返回给第 3 方。
第一个问题 - 你觉得上面的代码有什么问题吗?
第二次
我尝试通过与第 3 方交谈并从他们那里获取私钥来调试此问题。当我尝试加载完整的私钥时失败了。我无法弄清楚 Perl 的对象数据和 .NET RSAParameters 之间的映射。我掌握的关键数据是:
$VAR1 = bless(
'版本' => '1.91', '检查' => 0, '身份' => '给我的东西(2048)', '私人' => '_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' , '密码' => '河豚' , '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 未处理 消息="错误数据。\r\n" 来源="mscorlib" 堆栈跟踪: 在 System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 小时) 在 System.Security.Cryptography.Utils._ImportKey(SafeProvHandle hCSP,Int32 keyNumber,CspProviderFlags 标志,对象 cspObject,SafeKeyHandle & hKey) 在 System.Security.Cryptography.RSACryptoServiceProvider.ImportParameters(RSAParameters 参数) 在 C:\Doug\Development\SandboxApp2\SandboxApp2\SandboxDecrypter.cs:line 101 中的 SandboxApp2.SandboxDecrypter.DecryptText(String text) 在 C:\Doug\Development\SandboxApp2\SandboxApp2\Form1.cs:line 165 中的 SandboxApp2.Form1.btnGoDecrypter_Click(Object sender, EventArgs e) 在 System.Windows.Forms.Control.OnClick(EventArgs e) 在 System.Windows.Forms.Button.OnClick(EventArgs e) 在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs 事件) 在 System.Windows.Forms.Control.WmMouseUp(消息和 m,MouseButtons 按钮,Int32 点击) 在 System.Windows.Forms.Control.WndProc(消息和 m) 在 System.Windows.Forms.ButtonBase.WndProc(消息和 m) 在 System.Windows.Forms.Button.WndProc(消息和 m) 在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(消息& m) 在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(消息和 m) 在 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam) 在 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(味精和味精) 在 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID,Int32 原因,Int32 pvLoopData) 在 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 原因,ApplicationContext 上下文) 在 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 原因,ApplicationContext 上下文) 在 System.Windows.Forms.Application.Run(窗体 mainForm) 在 C:\Doug\Development\SandboxApp2\SandboxApp2\Program.cs:line 17 中的 SandboxApp2.Program.Main() 在 System.AppDomain._nExecuteAssembly(程序集程序集,字符串 [] 参数) 在 System.AppDomain.ExecuteAssembly(字符串 assemblyFile,证据 assemblySecurity,String [] args) 在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 在 System.Threading.ThreadHelper.ThreadStart_Context(对象状态) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态) 在 System.Threading.ThreadHelper.ThreadStart()
对这部分问题有什么想法吗?
最后,我主要是一名 VB.NET 开发人员,但在涉及 c# 时左右摇摆不定,我觉得我对它相当流利。然而,在加密方面,我是个新手。
【问题讨论】:
【参考方案1】:查看 MSDN 论坛中的 How to use RSACryptoServiceProvider.ImportParameters() 线程。它解决了您在此处询问的相同问题。 getBytes 可能正在修改您的公钥数据。 Voss 在线程中发布的其中一条消息包括对 BigInteger 类的 getBytes 问题的修复。
【讨论】:
以上是关于Perl 和 .NET RSA 一起工作?从 Perl 公钥在 .NET 中加密?从 Perl 加载私钥?的主要内容,如果未能解决你的问题,请参考以下文章
在 RSA 算法中,多个 d 是不是可以与给定的 e、p 和 q 一起工作?为啥?