2012-01-15 2 views
1

RSA 해독 문제RSA 암호 해독 문제 C#

C# RSA 프로그램에 문제가 있습니다. 제대로 해독하지 않습니다. d =(e^-1)%phiN을 할당하고 내 암호문에 d를 적용하면 어리석은 10 진수 응답이 표시됩니다. 전체 숫자가 나와야합니다. 제 수학에 문제가 있다고 생각합니다. 조언 있니? 자세한 내용이나 나머지 코드가 필요하면 질문하십시오. 또한이 코드를 개선하는 데 사용할 수있는 패딩 구성표가 있습니까? 현재이 코드는 주파수 분석에 취약합니다.

protected void decryptRSA(object sender, EventArgs ev) 

{ 
     double p = (double)Convert.ToInt64(P.Text);//I use 123 for testing 
     double q = (double)Convert.ToInt64(Q.Text);//127 
     double e = (double)Convert.ToInt64(E.Text);//133 
     double phiN = (p-1)*(q-1); 
     double n = p*q; 
     double d = Math.Pow(e, -1D); 
     d = d%phiN; 

     string cipherStr = outputBuffer.Text; 
     double[] cipherTextDouble = new double[100]; 
     string[]plainText = new string[cipherTextDouble.Length]; 

     cipherTextDouble = parser(cipherStr, 'D'); 
    for(int slot = 0; slot<cipherTextDouble.Length; slot++) 
     { 
    cipherTextDouble[slot] = (double)(Math.Pow((double)cipherTextDouble[slot],(double)d)%n); 
     } 
     for(int slot = 0; slot<cipherTextDouble.Length; slot++) 
     { 
      inputBuffer.Text += Convert.ToChar(cipherTextDouble[slot]) + ' ';//the spot were it dies 
//it doesn't like to convert from a decimal like 1.75 to a char. Of course I should never get a decimal like 1.75, which is the problem 
     } 
    } 
+1

두 배를 사용하지 마십시오. –

답변

2

지수를 올바르게 계산하지 않았습니다. 숫자 ded = 1 (mod phi), 즉 역도는 e (mod phi)입니다. 이는 double d = Math.Pow(e, -1D);이 계산하는 실수에서 e의 역수를 계산 한 다음 mod 작업을 수행하는 것과 동일하지 않습니다. 이것은 %이 실제로는 C#의 '나머지 연산자'이고 그렇지 않으면 정수 모듈이 아니기 때문에 십진수로 끝나는 이유입니다 (이 경우 1/133 ~ 0.007 및 1/133 15372 = 0.007) 어쨌든 두 배로 일하지 않는다)).

역도 파이를 계산하려면 Euclidean Algorithm을 사용해야합니다.

편집 : GregS는 컴퓨터 구현을 위해 Extended Euclidean Algorithm을 사용하여 단일 패스에서 모듈러 역수를 찾는 것이 좋습니다. 이것은 일반적으로 계산으로 수행됩니다. 유클리드 알고리즘으로 (보통 손으로) 할 수 있지만 시간 낭비입니다.

+1

* 확장 된 * 유클리드 알고리즘. –