2017-04-19 6 views
0

RSA 암호화로 사용자 입력을 암호화하려고합니다.암호화 중에 NaN을 반환하는 Java RSA 알고리즘

Eclipse에서 디버그 모니터를 사용하면 코드가 asciiLetter에 'e'를 입력하고 'n'을 수정하려고하면 'e'와 'n'이 너무 크고 돌아 오는 것을 볼 수 있습니다. 무한대 또는 NaN. 이것을 변경하는 방법에 대한 지침?

비트 길이를 1024에서 128로 변경했지만 아무 효과가 없습니다.

나중에 해독해야하지만 사전에이 부분을 작동 시키려고합니다. 대신 결과 개조 N을 산출하는 제 2 단계에서 후 BigInteger.pow (...)과의 사용

public class RSA { 


    static int bitlength = 128; 
    private static Random r = new Random(); 
    private static BigInteger p = BigInteger.probablePrime(bitlength, r); 
    private static BigInteger q = BigInteger.probablePrime(bitlength, r); 
    private static BigInteger n = p.multiply(q); 
    private BigInteger phi = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE)); 
    private static BigInteger e = BigInteger.probablePrime(bitlength/2, r); 
    private BigInteger d; 
    private static BigInteger encryptedMessage; { 
     while (phi.gcd(e).compareTo(BigInteger.ONE) > 0 && e.compareTo(phi) < 0) { 
     e.add(BigInteger.ONE);   
     } 
    BigInteger d = (e.modInverse(phi)); 
    } 

    public static void main(String[] args) { 

    Scanner input = new Scanner(System.in); 
     System.out.println("Please enter your message: "); 

    String clearMsg = input.nextLine().trim(); // String clearMsg = input.next(); 
     System.out.println(clearMsg); // Check message trimmed 

char userInputArray[] = clearMsg.toCharArray(); 
ArrayList<BigInteger> cipherTextArray = new ArrayList<BigInteger>(); 

for (int i = 0; i < userInputArray.length; i++) { 

    int letter = userInputArray[i]; 
    BigInteger bigLetter = new BigInteger(String.valueOf(letter)); 
    BigInteger asciiLetter = (BigInteger) bigLetter; 
    BigInteger encryptedMessage = pow(asciiLetter, e); 
    BigInteger encryptM = encryptedMessage; 
    BigInteger encryptedMessageMod = encryptM.mod(n); 
    cipherTextArray.add(encryptedMessageMod); 
} 

     System.out.println(cipherTextArray); 
} 


private static BigInteger pow(BigInteger asciiLetter, BigInteger e) { 
    // TODO Auto-generated method stub 
    return null; 
+1

그래서 BigInteger encryptedMessage = pow (asciiLetter, e);가 작동하지 않는 이유는 무엇입니까? ... pow (...)를 구현하지 않았습니다. – DarkSquirrel42

+0

코드와 관련이 있습니까? private static BigInteger pow (BigInteger asciiLetter, BigInteger e) { // TODO 자동 생성 메소드 스텁 return null; 내가 무슨 일을하는지 잘 모르겠으니, 이클립스에 추가하고 싶다. 코딩에 익숙하지 않고 약간 갇혀있다. ( – user7888294

+0

대신 BigInteger encryptedMessage = asciiLetter.pow (e);를 사용 하시겠습니까? – dejvuth

답변

0

는 BigInteger.modPow 살펴 (...)

는 모두 단계를 수행 하나, 당신의 기억보다 큰 메모리에 결과를 가져올 필요가 없습니다 ...