- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
P 和 Q 的值与 .Net RSAParameters 的模数值不匹配。根据 RSA 算法和 MSDN 文档,它应该是:P * Q = Modulus
我生成了一个 512 位 RSA key 对并通过调用将其导出为 XML:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(512);
rsa.ToXmlString(true);
这给了我以下 XML:
<RSAKeyValue>
<Modulus>rcLI1XTfmXtX05zq67d1wujnUvevBu8dZ5Q5uBUi2mKndH1FZLYCKrjFaDTB/mXW1l5C74YycVLS6msY2NNJYw==</Modulus>
<Exponent>AQAB</Exponent>
<P>1dwGkK5POlcGCjQ96Se5NSPu/hCm8F5EYwyqRpLVzgk=</P>
<Q>0AAEMHBj7CP2XHfCG/RzGldw1GdsW13rTo3uEE9Dtws=</Q>
<DP>PO4jMLV4/TYuElowCW235twGC3zTE0jIUzAYk2LiZ4E=</DP>
<DQ>ELJ/o5fSHanBZCjk9zOHbezpDNQEmc0PT64LF1oVmIM=</DQ>
<InverseQ>NyCDwTra3LiUin05ZCGkdKLwReFC9L8Zf01ZfYabSfQ=</InverseQ>
<D>EWwFTPmx7aajULFcEJRNd2R4xSXWY8CX1ynSe7WK0BCH42wf/REOS9l8Oiyjf587BhGa3y8jGKhUD7fXANDxcQ==</D>
</RSAKeyValue>
现在我成功地编写了一个小测试程序来加密、解密、签名和验证数据。
最后我加了一点测试代码:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(512);
rsa.FromXmlString(key); // key = string with XML above
RSAParameters param = rsa.ExportParameters(true);
BigInteger p = new BigInteger(param.P);
BigInteger q = new BigInteger(param.Q);
BigInteger n = new BigInteger(param.Modulus);
BigInteger myN = BigInteger.Multiply(p, q);
Console.WriteLine("n = " + n.ToString());
Console.WriteLine("myN = " + myN.ToString());
这给了我们以下输出:
n = 5200154866521200075264779234483365112866265806746380532891861717388028374942014660490111623133775661411009378522295439774347383363048751390839618325234349
myN = 23508802329434377088477386089844302414021121047189424894399694701810500376591071843028984420422297770783276119852460021668188142735325512873796040092944
为什么 P 和 Q 的乘积不等于模数?
我已经检查了很多东西,比如字节序、编码、BigInteger 类,成功地加密、解密、签名、验证了上面的 XML key ,但找不到任何解释为什么 P 和 Q 相乘不等于模数...
谁能帮我解释一下为什么 P*Q 不是模数?
可读格式的所有值:
Modulus = 5200154866521200075264779234483365112866265806746380532891861717388028374942014660490111623133775661411009378522295439774347383363048751390839618325234349
Exponent = 65537
P = 4436260148159638728185416185189716006279182659244174640493183003717504785621
Q = 5299238895894527538601438806093945941831432623367272568173893997325464109264
DP = -57260184070162652127728137041376572684067529466727954512100856352006444159428
DQ = -56270397953566513533764063103154348713259844205844432469862161942601135050224
InverseQ = -5297700950752995201824767053303055736360972826004414985336436365496709603273
D = 5967761894604968266284398550464653556930604493620355473531132912985865955601309375321441883258487907574824598936524238049397825498463180877735939967118353
更新:
根据答案,我为 .Net BigInteger 类编写了一些扩展方法,以便与 RSAParameters 一起正常工作:
public static class BigIntegerExtension
{
public static BigInteger FromBase64(this BigInteger i, string base64)
{
byte[] p = Convert.FromBase64String(base64).Reverse().ToArray();
if (p[p.Length - 1] > 127)
{
Array.Resize(ref p, p.Length + 1);
p[p.Length - 1] = 0;
}
return new BigInteger(p);
}
public static BigInteger FromBigEndian(this BigInteger i, byte[] p)
{
p = p.Reverse().ToArray();
if (p[p.Length - 1] > 127)
{
Array.Resize(ref p, p.Length + 1);
p[p.Length - 1] = 0;
}
return new BigInteger(p);
}
}
使用示例:
BigInteger modulus1 = new BigInteger().FromBase64("rcLI1XTfmXtX05zq67d1wujnUvevBu8dZ5Q5uBUi2mKndH1FZLYCKrjFaDTB/mXW1l5C74YycVLS6msY2NNJYw==");
BigInteger modulus2 = new BigInteger().FromBigEndian(param.Modulus);
希望这能帮助其他遇到同样问题的人:-)
最佳答案
这是我对您提供的 XML 参数的解析:
N = 9100595563660672087698322262735024483609782000266155222822537546670463733453350686171384417480667378838400923087358115007100900745853538273602044437940579
P = 96731388413554317303099785843734797692955743043844132225634400270674214374921
Q = 94081101418218318334927154927633016498744568046568114230258529096538660255499
正如您可以验证的那样,N 确实等于 P * Q。
您不能像现在这样使用 BigInteger(byte []) 构造函数,因为它希望字节数组采用小端字节序,并且因为 Microsoft 做的事情很糟糕。相反,颠倒字节的顺序。最后,因为字节数组应该是二进制补码,并且您的数字保证为正数,所以您必须向数组的高位字节添加一个零字节如果否则高位字节会大于或等于 128。
关于c# - 为什么 RSAParameters Modulus 不等于 P 和 Q 的乘积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14073595/
我根据以下表达式理解模运算符: 7 % 5 这会返回 2,因为 5 会变成 7 一次,然后给出剩下的 2,但是当你反转这个语句来阅读时,我会感到困惑: 5 % 7 这给了我 5 的值,这让我有点困惑。
我有一个出租车应用程序,其中的乘车时间被插入到表中。每第 n 次(例如 5 次)乘坐都是免费的。我需要的是,当用户乘坐超过 50 次时,每 3 次应该免费。在下面的代码中,我设法每 5 次进行一次,但
规范:Ubuntu 13.04、Python 3.3.1 一般背景:Python 初学者; 特定问题的背景:我已经精疲力竭地试图解决这个问题,而且我知道,除了它对学习 Python 的指导值(valu
试图在 Meteor -> Modulus 上下文中了解 websockets 和 xhr。我注意到有时响应时间很长,这显然是由于 websockets 在无法连接时回落到 xhr...我正在尝试诊断
我编写了用于获取两个数字之间的 GCD(最大公约数)的代码。因为我应该在第 19 位输入数字,所以我想我需要使用 BigInteger Math 类。但是,在编译代码后,出现此错误。 Exceptio
这个问题在这里已经有了答案: What is special about numbers starting with zero? (4 个答案) 关闭 3 年前。 我正在尝试以下代码 printf(
我已经在 modulus.io 上部署了一个 Meteor 应用程序并希望使用 Let's Encrypt 设置 SSL . 根据 Let's Encrypt's documentation ,看来您
所以,我对此很着迷。 rand() % 6 将始终产生 0-5 之间的结果。 但是,当我需要介于 6 到 12 之间时。 我应该有 rand() % 6 + 6 0+6 = 6. 1+6 = 7. .
我正在开发一个项目,需要通过 RMI 网络显示一些加密解密。我为此使用 RSA 系统。解密时,我的代码出现以下错误: javax.crypto.BadPaddingException: Message
尝试让这个自定义寻呼机为 jQuery Cycle 工作。 我希望 pagerAnchorBuilder 每 5 张图像返回一个 list 项,这样稍后我可以将寻呼机变成它自己的循环。 代码如下:
来自 C++ Reference我认为 std::modulus 的定义使其行为类似于(对于 C++11) template struct modulus { T operator() (co
我正在 Modulus 上运行一个分阶段的 Meteor 应用程序,想知道是否有办法在远程 mongoDB 上执行类似于“meteor reset”的操作。 我可以通过运行 db.dropDataba
当 n、r、m 是非常大的数字时,如何在编程中计算 nCr % m(即“(n 选择 r)模数 m”)? 最佳答案 我假设你想为大数计算 nCr 类型的东西并搜索一些可能是 的库函数。优化 .在这种情况
这个问题在这里已经有了答案: Printing leading 0's in C (11 个答案) keeping leading zeros in C [duplicate] (3 个答案) 关闭
我正在尝试使用 Travis CI 将 Node.js/Express 应用程序持续部署到 Modulus。我想要实现的是,在我将代码推送到 Github 主分支后,Travis 会选择它并运行构建,
我正在将 Meteor 应用部署到 Modulus.io。在过去的几天里,我使用 modulus deploy 部署它完全没有问题,但在对我的应用程序进行了几次更改后,我现在收到以下错误: Error
我想绘制一个相敏光谱图,如本出版物中所做的那样(图 3 右栏,图 4 顶部面板):https://doi.org/10.1016/j.jmr.2014.10.004 对于那些无法访问该出版物的人:这是
我正在尝试在 modulus.io 上设置 ssl,但指南说要捆绑四个文件: http://help.modulus.io/customer/portal/articles/1701165-ssl-s
我想让 SSL 在我的子域 api.rofulus.com 上运行 我 checkout https://modulus.io/codex/projects/ssl 我创建了一个证书和 key : o
我是密码世界的新手。我需要从下面提供的数据中生成相应的 RSA 私钥。 Modulus B87BDAB530F8FDED78223D841C5D4E66A6CA86E1D690E829755F244B
我是一名优秀的程序员,十分优秀!