我试图重新创建一个我用Java制作的RSA加密程序到Erlang中。我无法弄清楚如何生成私钥。 我的原始java代码:
privateKey = publicKey.modInverse(phi);
我找不到任何通用算法来在线查找“d”或私钥。大多数都是小型简单方程,无法在较大的问题中实现,或者教程只是简单地给出私钥而不解释过程。有人能指出我的方向,所以我可以学习生成私钥吗?或者,如果Erlang中存在模块化反函数,请指出它是什么。
提前谢谢
编辑:要解决的实际等式是[e * d mod(phi)= 1],其中e是公钥,d是私钥,phi = [p-1] [q-1] 。当所有其他变量都已知时,我非常想解决d
EDIT2:Wolframalpha.com为d返回多个可能的值。这有什么作用?
答案 0 :(得分:2)
虽然在crypto或public_key模块中隐藏的地方可能是这样的,但它不是公共API的一部分。
由于Erlang内置了大整数(正常整数可以达到几乎任意大小),因此很容易实现one of the usual algorithms来计算你的值。
例如,Extended Euclidean Algorithm使用递归函数特别容易实现。
答案 1 :(得分:1)
没有逆模数这样的东西,因为技术上有一个无穷无尽的逆模数解。
您可以重新创建可用版本的唯一方法是使用模数本身
int rest = number%dividor;
int quotient = (number-rest)/dividor;
int modInv = dividor*quotient+rest;
答案 2 :(得分:1)
以下代码完成了这项工作,wolfram页面中缺少的是你必须选择大于2且小于phi的解决方案,然后才有一个解决方案。
[edit] 添加测试以检测M和C何时不是相对质数,然后返回比先前报告的算术错误更明确的错误元组
-module (decod).
-export ([private/2]).
% In the key generation you start by choosing P and Q 2 big primes
% N = P*Q
% M = (P-1)*(Q-1)
% C a number smaller than M such as gcd(M,C) = 1
% the public key is made of {N,C}
% then lets find U and V such as C*U + M*V = 1 and 2 < U < M
% the private key is {U,N}
private(M,C) when is_integer(M), is_integer(C), M > C->
P = private1({M,0},{C,1}),
adjust(P,M).
private1(_,{1,P}) -> P;
private1(_,{0,_}) -> {error,gcd_not_1};
private1({R1,U1},{R2,U2}=A2) ->
F = R1 div R2,
private1(A2,{R1-R2*F,U1-U2*F}).
adjust(R,_) when is_tuple(R) ->
R;
adjust(P1,M) when P1 =< 2 ->
K = (2 - P1) div M + 1,
P1 + K * M;
adjust(P1,M) when P1 >= M ->
K = (P1 - M) div M + 1,
P1 - K * M;
adjust(P1,_) -> P1.