RSA 암호화 시스템의 암호 해독 기능을 작성 하려는데 숫자가 매우 작음 수가 적지 만 출력이 정확하지 않을 수 있습니다. 부동 소수점 에러 또는 어떤 종류의 스택 오버 플로우).모듈화 지수를 단순화하십시오. C++
문제를 일으키는 프로세스는 (11^23) mod 187로 단순화 될 수 있지만 누군가가보고 싶어 할 경우 전체 코드가 포함됩니다. Simon Singh 박사 ("Wolfram Alpha"사용 확인)의 "The Code Book"부록 J에 사용 된 예제이므로 대답은 88이어야합니다. 그러나, 나는 149의 결과를 얻는다. 그러나, 숫자가 작을수록 Wolfram Alpha와 일치한다.
내 생각 I이 기술을 사용하여 멱승 잉여를 단순화해야한다는 것을 :
^B = A^C *는^D [여기서 C + D = B]그러나
, I 이 문제가 100 % 확실하지 않다면, 이것은 처음으로 스택 오버플로입니까? (나는 아직도 그 의미가 100 % 확실하지 않다). 누군가가 나에게 가려고하기 전에 어떤 숙제도 아니며이 질문이 사소한 것으로 여겨지면 미안합니다. 모든 사람들이 이렇게하기가 어려울 것이라고 생각한다면 gmp.h를 사용하고 있습니다.하지만 전적으로 정직하다면 오히려하지 않을 것입니다. 내 코드는 아래에 있습니다 (전반부는 개인 키를 계산하는 것입니다. 개인 키는 내가 갖고있는 문제와 관련이 없지만 잘못 입력 한 경우를 대비해 포함 시켰습니다.) 정말 도움이 될 수 있기를 바랍니다. 감사합니다. 너는 대단히 사전에.
#include <iostream>
#include <math.h>
using namespace std;
unsigned int modinv(unsigned int u, unsigned int v)
{
unsigned int inv, u1, u3, v1, v3, t1, t3, q;
int iter;
u1 = 1;
u3 = u;
v1 = 0;
v3 = v;
iter = 1;
while (v3 != 0)
{
q = u3/v3;
t3 = u3 % v3;
t1 = u1 + q * v1;
u1 = v1; v1 = t1; u3 = v3; v3 = t3;
iter = -iter;
}
if (u3 != 1)
return 0;
if (iter < 0)
inv = v - u1;
else
inv = u1;
return inv;
}
int main()
{ long unsigned int p = 17;
long unsigned int q = 11;
long unsigned int phi = (p-1)*(q-1);
long unsigned int e = 7;
long unsigned int c = 11;
long unsigned int n = p*q;
long unsigned int d = modinv (e,phi);
{
cout << fmod (pow (c, d), n);
}
return 0;
}
아마도 11^n mod 187은 11이 주 요소 (187 = 11 x 17) 중 하나이기 때문에 나쁜 사례일까요? 따라서 n> = 1 인 경우 11^n mod 187의 경우 16 개의 값만 반복되는 패턴으로 나타납니다. 11 121 22 55 44 110 88 33 176 66 165 132 143 77 99 154 || 11 121 .... 그래서 11^n mod 187 = 11^(1 + ((n-1) mod 16)) mod 187. – rcgldr
나는 그것을 정렬했다 :)'pow' 함수는 자연수가 아닌 부동 소수점을 사용한다. 어쨌든 덕분에 멋지게 일한 내 자신의 모듈러 지수를 쓸 수 – Michael