2016-07-22 4 views
0

코드를 게시하기 전에 먼저 몇 가지 레이아웃을 레이아웃하는 것이 가장 좋습니다.자바에서 RSA 암호화를 위해 큰 숫자 저장하기

목표 :

작은 숫자의 몇 아주 기본적인 RSA 암호화를 수행합니다. RSA 암호화에 익숙한 사용자의 경우 아래 알고리즘에 사용되는 값을 게시했습니다.

현재 RSA 번호/값 :

P = 29

Q = 31

N = P * Q

피 = ((P-1) * (Q -1))

E = 11

내 문제 :

내 코드를 해독하려고 할 때 문제가 발생합니다. 암호화는 설계된대로 작동합니다.

코드 :

long[] mesg = new long[]{8, 7, 26, 28}; 
long[] encrypted_mesg = new long[mesg.length]; 

for(int i=0; i<mesg.length; i++){ 
    encrypted_mesg[i]=(long)((Math.pow(mesg[i],E))%N); 
    System.out.print(encrypted_mesg[i] + " "); 
} 
System.out.println(); 

//Decrpyt (not functioning-long to small, Big Integer not working) 
for(int j=0; j<encryp_mesg.length; j++){ 
    BigInteger decrypt = new BigInteger(Math.pow(encryp_mesg[j],D) + ""); 
    System.out.print(decrypt.toString() + " "); 
} 

초기 문제는 지수로 적용 할 때 D (비공개 지수)가, 오랫동안 큰하는 방법 있다는 사실이었다. 나는 빠른 Google 검색을 수행하고 BigInteger를 구현하려고했습니다. 나는이 프로그램을 실행하면이 오류를 던졌습니다 :

내가 문제를 해결하기 위해 노력했다 무엇
Exception in thread "main" java.lang.NumberFormatException: For input string: "Infinity" 

at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
at java.lang.Integer.parseInt(Integer.java:580) 

at java.math.BigInteger.<init>(BigInteger.java:461) 
at java.math.BigInteger.<init>(BigInteger.java:597) 
at RSA_Riddles.main(RSA_Riddles.java:23)** 

: 나는 대답하지 않는 것을 알고 있기 때문에

정직하기를, 나는 정말 아무것도 시도하지 않은 무한대로 계산하지만 BigInteger는 생각합니다. 130^611과 같은 번호를 저장할 수 있습니까? 그렇다면 어떻게?

큰 질문 :

어떻게 암호 해독을 수행하는 데 필요한 값을 저장할 수 있습니까?

저를 도우려는 사람에게 미리 감사드립니다!

+0

만약 당신의 암호화 계산이 29에서 대부분의 값에 대해 잘못된 결과를 산출 할 때 당신은 28까지의 값만 테스트 할 수 있을지 모르겠습니다. 또한 암호 해독은 유사하게 mod n : m = c^d mod n입니다. . 또한 exponentiate와 modulo를 별도로 수행하는 것은 장난감 크기에 거의 도움이되지 않지만 안전한 크기를 위해 일하는 것은 평생 (또는 컴퓨터)보다 오래 걸릴 것이므로 실제 구현은 Wikipedia에서 설명한대로 끼워 넣습니다. 그런 다음 장난감을 위해 너는 bignums을 전혀 필요로하지 않는 크기. –

답변

2

원시 데이터 형식으로 계산을 수행 한 다음 BigInteger에 해당 프리미티브를 저장하기 때문에 문제가 발생합니다. 이것은 BigInteger를 사용하는 목적을 무효화합니다. 이제 문제가되는 라인을 살펴 보자 : 자바이 줄을 평가

BigInteger decrypt = new BigInteger(Math.pow(encryp_mesg[j],D) + ""); 

, 처음이 표현

Math.pow(encryp_mesg[j],D) + "" 

을 그리고 그것을 평가합니다. 그런 다음이 평가 결과를 BigInteger의 생성자에 전달합니다. 그러나이 시점에서 이미 작업중인 데이터 유형의 범위를 초과했습니다.이제 당신 만의 BigInteger를 사용하여 계산을하고있는

BigInteger e = new BigInteger(Integer.toString(encryp_mesg[j])); 
BigInteger decrypt = e.pow(D); 

을, 단지 당신이 이미 기본 데이터 형에 저장 한 기본 데이터 형의 값을 저장하는 대신,이 같은 BigInteger를 함께 수학을 수행해야합니다.

+0

감사합니다. 구현을 즉시 변경하겠습니다. BigInteger에는 제한이 있습니까? 그렇다면 무엇입니까? – jpgamer31

+0

기꺼이 도와 드리겠습니다! 그것이 효과가 있다면 SO 에티켓을 따라 답을 받아 들일 수 있다면 좋을 것입니다. BigIntegers는 '임의 정밀도'입니다. 즉, 귀하의 머신에 리소스가있는만큼 큰 숫자를 지원합니다 (가능성이 낮음). 그 한계에 맞서 뛰어 올라라) – James

+0

나는 그토록 멍청하다. 이것은 나의 첫 번째 질문이었다. 어떻게 대답을 수락합니까? – jpgamer31

관련 문제