我需要使用C#实现RSA加密/解密
我有一个包含以下参数的私钥:
mod n,exponent,p,q,dP,dQ,和(p-1mod q)
以上参数在中文余数算法中进行了解释
但是,RSA的C#.NET实现具有以下不同的参数集:
Modulus,Exponent,P, Q,DP,DQ,D,InverseQ
当我试图将数据映射CRT到时DOTNET,我得到错误Bad Data
对于 p,q,dP以及dQ映射是明显的,但有关的参数,其余的我不知道.
如果我可以获得映射这些参数的帮助,那就太棒了
我有一个长整数,但它不是以十进制形式存储,而是存储为余数.
所以,我没有这个N数字,而是一组这样的剩余部分:
r_1 = N % 2147483743
r_2 = N % 2147483713
r_3 = N % 2147483693
r_4 = N % 2147483659
r_5 = N % 2147483647
r_6 = N % 2147483629
Run Code Online (Sandbox Code Playgroud)
我知道,N小于这些素数的乘法,所以中文余数定理在这里起作用(http://en.wikipedia.org/wiki/Chinese_remainder_theorem).
N如果我有这6个余数,我怎么能以十进制恢复?精彩的将是任何程序(C/C + GMP/C++/perl/java/bc).
例如,最小N可以有这组余数:
r_1 = 1246736738 (% 2147483743)
r_2 = 748761 (% 2147483713)
r_3 = 1829651881 (% 2147483693)
r_4 = 2008266397 (% 2147483659)
r_5 = 748030137 (% 2147483647)
r_6 = 1460049539 (% 2147483629)
Run Code Online (Sandbox Code Playgroud) math gmp bignum arbitrary-precision chinese-remainder-theorem
考虑到数组中的模数值及其余值,如何在Matlab中找到最小值?例如:
A=[ 23 90 56 36] %# the modulo values
B=[ 1 3 37 21] %# the remainder values
Run Code Online (Sandbox Code Playgroud)
这导致了答案93; 这是最不可能的价值.
这是我的代码,但它似乎只显示余数数组的最后一个值作为最小值:
z = input('z=');
r = input('r=');
c = 0;
m = max(z);
[x, y] = find(z == m);
r = r(y);
f = find(z);
q = max(f);
p = z(1:q);
n = m * c + r;
if (mod(n, p) == r)
c = c + 1;
end
fprintf('The lowest value is %0.f\n', n)
Run Code Online (Sandbox Code Playgroud) 我试图找到D使用P,Q和E(Dp,Dq和可得).(p-1mod q)
根据这个答案和这个答案并更新了这个问题用下面的方法,我应该得到D.
为了测试这一点,我生成了密钥对,并尝试从现有组件中计算组件,并将结果与原件进行比较.所有结果都很好,除了D.我从上面的答案中复制了我的计算错误.如果有人能告诉我我做错了什么会很棒.
测试代码
using System;
using System.Numerics;
using System.Security.Cryptography;
using System.Text;
class Program {
static RSAParameters key = new RSAParameters() {
P = new byte[]{
0xDE, 0xA6, 0x35, 0x0B, 0x0A, 0xA5, 0xD7, 0xA0, 0x5C, 0x49, 0xEA, 0xD1, 0x3F, 0xA6, 0xF5, 0x12,
0x19, 0x06, 0x25, 0x8A, 0xD9, 0xA7, 0x07, 0xE7, 0x0D, 0x8A, 0x7C, 0xB1, …Run Code Online (Sandbox Code Playgroud) 在从元组向量(残差,模数)计算中国剩余定理时,以下代码失败:
c = ((1,5),(3,7),(11,13),(19,23))
def crt(c):
residues, moduli = zip(*c)
N = product(moduli)
complements = (N/ni for ni in moduli)
scaled_residues = (product(pair) for pair in zip(residues,complements))
inverses = (modular_inverse(*pair) for pair in zip(complements,moduli))
si = (product(u) for u in zip(scaled_residues,inverses))
result = sum(si) % N
return result
Run Code Online (Sandbox Code Playgroud)
将结果赋予0(我猜生成的iterables为空).但以下代码完美运行:
def crt(c):
residues, moduli = zip(*c)
N = product(moduli)
complements = list((N/ni for ni in moduli)) # <-- listed
scaled_residues = (product(pair) for pair in zip(residues,complements))
inverses = (modular_inverse(*pair) …Run Code Online (Sandbox Code Playgroud) 我需要在Haskell中编写一个或多个函数来解决中国剩余定理。它需要使用以下定义创建:
crt :: [(Integer, Integer)] -> (Integer, Integer)
Run Code Online (Sandbox Code Playgroud)
答案看起来像
>crt [(2,7), (0,3), (1,5)]
(51, 105)
Run Code Online (Sandbox Code Playgroud)
我想我有一个整体的想法,我只是没有写它的知识。我知道 crt 函数必须是递归的。我创建了一个辅助函数来将元组列表拆分为两个列表的元组:
crtSplit xs = (map fst xs, product(map snd xs))
Run Code Online (Sandbox Code Playgroud)
在这个例子中,它给了我:
([2,0,1],105)
Run Code Online (Sandbox Code Playgroud)
我想我需要知道的是为第一个列表中的每个元素创建一个列表。我将如何开始这样做?