2011-03-25 2 views
2

RSA 알고리즘을 직접 계산하고 싶습니다. 나는 어떤 힘에서 수의 모듈러스를 계산할 필요가있다. 것은 특정 파워에서의 숫자가 상당히 커질 수 있다는 것입니다.certan의 힘에서 숫자의 모듈러스를 계산하십시오 (그 힘의 숫자는 꽤 큽니다)

x = pow(n, p) % q 

어떻게 효율적으로 X를 확인할 수 있습니다 여기에

은 내가 원하는 무엇인가?

+0

최대 ulong보다 큽니다. – Roly

+0

필수 발언 : 이것은 연구 등에서는 좋지만 실제 무언가를 위해 자신의 암호화를 작성하지 마십시오. –

+0

나는 일종의 것이 ulong 한도를 넘어서있다. 네가 옳을 지 모르겠다. – Alex

답변

7

는 .NET 4를 사용하는 경우, 당신이

BigInteger n = ...; 
BigInteger p = ...; 
BigInteger q = ...; 
BigInteger x = BigInteger.ModPow(n, p, q); 
+0

'ModPow'에 대해 잘 모르겠다. 꽤 멋지다. –

+2

@jon_darkstar :이 질문 앞에 나도 마찬가지이다. :) –

+0

'BigInteger.ModPow()'의 소스 코드가 사용 가능합니까? Q가 소수 일 때 튜닝 된 버전인지 (또는 버전인지) 궁금합니다. –

2

topicarticle을 확인하시기 바랍니다 단 한 번의 작동 :)에서 모든 작업을 수행 할 ModPow 방법을 제공 BigInteger,보고 제안 그 자체로 수학 함수를보다 효율적으로 만드는 방법.

1
하찮게

... 같은 바이너리 지수보다는이 순진한 반복으로

x = 1 
for(i = 0; i < p; i++) 
    x = (x*n) % q 

Theres는보다 효율적인 방법을하지만, X로 오버 플로우 문제가 과거를 얻을 않는이는 n 개의 * q를

+0

질문에 구체적으로 말하자면 "상당히 크다"는 것이고 암호화와 관련이 있다고 가정하면 int에 맞지 않는다고 가정하는 것이 합리적이라고 생각합니다. 'x * n'이 음수로 오버플로되어 중간 결과가 음수가되면 어떻게됩니까? –

+0

괜찮 았으면 x와 BigInteger가 필요하다고 생각되는 항목을 모두 호출하십시오. 포인트가 얼마나 큰지 상관없이, 거대한 자연수와 모드를 찾을 수 있다면 끝 부분에 한 번만 더 많은 지수와 거대한 지수를 줄 수 있습니다. 길을 따라 개조하지 말고 –

+0

당신의 의견에 동의합니다. 이전 의견 및 귀하의 솔루션 오버플로 문제가 과거와 함께. 하지만 그만. "* 더 효율적인 방법이 있습니다"* "다른 프로그램이 분 단위로 찾을 수있는 동안 내 프로그램이 우주 끝나면 결과를 찾을 수 있습니다 (p가 충분히 큰 경우)"라고 말할 수 있습니다. –

7

이를 경계로한다 powermod function로 알려져있다 :이 지수를 적용하여보다 효율적으로 할 수

function modular_pow(base, exponent, modulus) 
    c := 1 
    for e_prime = 1 to exponent 
     c := (c * base) mod modulus 
    return c 

제곱으로 :

function modular_pow(base, exponent, modulus) 
    result := 1 
    while exponent > 0 
     if (exponent & 1) equals 1: 
      result = (result * base) mod modulus 
     exponent := exponent >> 1 
     base = (base * base) mod modulus 
    return result 
+1

+1을 알기 전까지는 더 복잡한 방법을 다루면 안된다. 나는'base = base modulus'를 함수의 시작으로'base'가'modulus'보다 훨씬 더 큰 경우를 잡습니다. –

1

BigInteger.ModPow (Fx 4+)을 참조하십시오. 여기서는 MSDN입니다.

0

당신이 Modpow()의 자신의 버전을 작성할 계획 인 경우 :


당신은 그래서 당신의 계산이 그 사실을 이용하여, q^2보다 숫자 더 큰 사용할 필요가 없습니다, 전원 모듈로 q를 필요

: 모든 곱셈 후 전원 n^p을 계산할 때

if a = b (mod q) then a*p = b*p (mod q) 

따라서, 귀하의 작업 변수에 (모듈로 Q) 작업을한다.

a^(q-1) = 1 (mod q) 
    (when a is not a multiple of q) 

p이 (많이)보다 더 큰 q

때 계산을 단축 할 수 있습니다 : q는 소수 경우


또한, 당신은한다고 페르마의 작은 정리를 사용할 수 있습니다

0

여기에 제공된 모든 대답은 정확하지만 모듈러 지수를 구현하는 "고전적인"방법 인 명백한 square-and-multiply 알고리즘은 잘못되었습니다.