erlang中有模逆函数吗? - Erlang

问题描述 投票:0回答:3

我正在尝试将我已经用 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 的多个可能值。这是如何运作的?

erlang rsa
3个回答
3
投票

虽然可能有类似的东西隐藏在 crypto 或 public_key 模块中的某个地方,但它不是其公共 API 的一部分。

由于 Erlang 具有内置的大整数(普通整数实际上可以得到任意大小),因此很容易实现常用算法之一来计算你的值。

例如,扩展欧几里得算法使用递归函数会特别容易实现。


2
投票

以下代码完成这项工作,wolfram 页面中缺少的是您必须选择大于 2 且小于 phi 的解决方案,然后只有一个解决方案。

[编辑]添加一个测试来检测 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.

2
投票

不存在逆模这样的东西,因为从技术上讲,逆模有无穷多个解。

重新创建可用版本的唯一方法是使用模本身

int rest = number%dividor;
int quotient = (number-rest)/dividor;

int modInv = dividor*quotient+rest;
© www.soinside.com 2019 - 2024. All rights reserved.