【发布时间】:2012-11-18 15:11:25
【问题描述】:
我需要能够在服务器上使用 C# 解密字符串,但该字符串是使用公钥加密和客户端上的 cryptico.js 加密的。详情见文末。
Cryptico 给了我一个这样的私有 RSA 密钥(注意 - 'like' this - 我为这个问题创建了一个新密钥):
Array ( [n] => 8029845567507477803775928519657066509146751167600087041355508603090505634905205233922950527978886894355290423984597739819216469551137046641801207199138209 [e] => 3 [d] => 5353230378338318535850619013104711006097834111733391360903672402060337089936682996269976597251251223844095913209399106464214877696419418951728015128013411 [p] => 102067954277225510613941189336789903269738979633396754230261162567549753196947 [q] => 78671563708406591396117399809764267229341143260756252277657051641634753921147 [dmp1] => 68045302851483673742627459557859935513159319755597836153507441711699835464631 [dmq1] => 52447709138937727597411599873176178152894095507170834851771367761089835947431 [coeff] => 26458340158787140383846156526777567128582042036682248240414722856369310516021
...加上一堆方法。
我正在尝试解密它:
RSAParameters parameters = new RSAParameters();
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
parameters.Exponent = encoding.GetBytes("3");
//dmp1
parameters.DP =
encoding.GetBytes("68045302851483673742627459557859935513159319755597836153507441711699835464631");
//dmq1
parameters.DQ =
encoding.GetBytes("52447709138937727597411599873176178152894095507170834851771367761089835947431");
//d
parameters.D =
encoding.GetBytes(
"5353230378338318535850619013104711006097834111733391360903672402060337089936682996269976597251251223844095913209399106464214877696419418951728015128013411");
//p
parameters.P =
encoding.GetBytes("102067954277225510613941189336789903269738979633396754230261162567549753196947");
//q
parameters.Q =
encoding.GetBytes("78671563708406591396117399809764267229341143260756252277657051641634753921147");
//n
parameters.InverseQ =
encoding.GetBytes(
"8029845567507477803775928519657066509146751167600087041355508603090505634905205233922950527978886894355290423984597739819216469551137046641801207199138209");
//coeff
parameters.Modulus =
encoding.GetBytes("26458340158787140383846156526777567128582042036682248240414722856369310516021");
RSA rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(parameters);
var decryptThis = encoding.GetBytes(ciphertext);
var result = rsa.DecryptValue(decryptThis);
resultString = encoding.GetString(result);
但这会丢弃异常“错误数据”。
有没有更熟悉 C# 的人知道我哪里出错了?
谢谢,
G
上下文详细信息:我正在尝试在应用程序的客户端和服务器端实现密码强度检查功能,但仅在服务器端使用代码。为了在客户端实现这一点,我想将假定的密码发送到服务器,判断它的强度,然后返回一个显示在客户端上的分数。这意味着我只需要在服务器上维护密码强度检查代码。作为一项额外的安全措施,我使用 cryptico.js 库对假定的密码进行加密,然后将其发送到服务器进行判断。
【问题讨论】:
-
我希望您没有向我们展示真正的私钥。
-
哈哈,没有。请放心,这是专门为此问题生成的测试密钥。它的密码是“特殊的天使巨齿鲨孵化器”,顺便说一下,它是 512 位。这些值也会因生产系统而改变。
-
我不知道您是如何生成这些字符串的,例如
264583401587871403838461.....,但 encoding.GetBytes 在我看来并不正确。我会尝试BigInteger.Parse("..").ToByteArray() -
数字字符串取自 cryptico 创建的 RSA 私钥对象的转储 - 他们的方法在他们的 github 页面上描述。我试过 BigInteger.Parse("..").ToByteArray();正如建议的那样,但不幸的是没有快乐。感谢您的建议。
-
我认为你已经交换了 InverseQ 和 Modulus。
标签: c# javascript public-key-encryption cryptico