2016-06-14 2 views
0

RSA를 사용하여 텍스트를 암호화하고 암호를 해독하는 프로그램을 작성 중입니다. P, Q 및 E의 값은 사용자가 제공하고 이들이 소수인지 확인합니다. 프로그램에서 N과 D를 찾습니다. 암호화 및 암호 해독이 제대로 작동하지 않습니다. 여기서 몇 가지 질문을 살펴 보았고 대부분이 라이브러리를 사용합니다.이 라이브러리는이 사용을 위해 사용하지 않을 것입니다. 암호화 코드 :자바에서 RSA 암호 해독, RSA 라이브러리 사용 안함

JMenuItem mntmEncrypt = new JMenuItem("Encrypt"); 
mntmEncrypt.addActionListener(new ActionListener() { 
    @SuppressWarnings("null") 
    public void actionPerformed(ActionEvent ev) { 

     textArea_1.setText(""); 
     String blah = textArea.getText(); 
     int something; 

     for(int i=0; i<blah.length();i++){ 
      something =(int)(blah.charAt(i)); 

      enc = BigInteger.valueOf((long) (Math.pow(something, e)%n)); 

      textArea_1.append(blah.valueOf(enc) + " "); 
     } 

그리고 고장 해독 :

JMenuItem mntmDecrypt = new JMenuItem("Decrypt"); 
mntmDecrypt.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent em) { 
     textArea_1.setText(""); 
     String blah2 = textArea.getText(); 
     String[] somethingElse = blah2.split(" "); 
     char character; 
     for(int i=0;i<somethingElse.length;i++){ 
      int cipher = Integer.parseInt(somethingElse[i]);      

      dec = BigInteger.valueOf((long)Math.pow(cipher, d)%n); 

      System.out.println("Cipher: "+cipher); //print check 

      System.out.println("d: "+d); //print check 

      System.out.println("n: "+n); //print check 

      System.out.println("dec: "+dec); //print check 

      BigInteger x = BigInteger.valueOf(dec); 
      int x2 = x.intValue(); 
      char c = (char) x2; 

      System.out.println(cipher + " " + dec); 
      String textBack = new String(dec.toByteArray()); 

      textArea_1.append(String.valueOf(dec)); 
     } 
    } 
}); 

나는 this calculator를 사용 12월의 가치를 확인하고 그것은 완전히 잘못된 그러나 나는 이유를 볼 수 없습니다. 어떤 도움을 주시면 감사하겠습니다. 나는 enc와 dec을 제외하고 BigInteger를 만들 수 없다.

답변

1

대답은 간단하다 : 당신은 Math.pow이 double 값에서 작동 Math.pow

를 사용하는 - 따라서 그것은 부동 소수점 숫자를 사용합니다. 부동 소수점 숫자는 절대 정확하지 않으므로 결과는 이미 그 시점에서 엉망입니다.

정말로 RSA를 손으로 계산하려면 BigInteger.modPow(..)을 사용할 수 있습니다.

그러나 프로젝트가 학습 프로젝트가 아닙니다. Java 암호화 확장을 사용하는 것이 좋습니다. 따라서 BigInteger 값을 사용하고 RSAPrivateKeySpec/RSAPublicKeySpec을 만들고 Cipher 클래스와 함께 사용하십시오.

예를 들어이 질문을 참조하십시오 : Generating RSA keys for given modulus and exponent

+0

좋아,하지만 인수는 모든 BigInteger를 바로 시작 할 것을 요구 BigInteger.modPow()로 전환? 캐스팅 할 수없는 = 그들은 BigIntegers가되어야합니다. 이로 인해 n = (p-1) (q-1)을 비롯한 많은 문제가 발생합니다. BigIntegers에서 하나를 뺀 것은 고통입니다. 이 일을 어떻게 하죠? 암호 확장을 사용하는 것이 좋지만 손으로 ​​해결하는 것이 좋습니다. – Goblinette

+1

숫자가 'long'에 맞지 않으면 모든 계산을 BigInteger로 처리해야합니다. 당신은 쉽게 빼낼 수 있습니다 :'value = value.subtract (BigInteger.ONE)' – Robert

+0

나는 그것을 만들기 위해 노력하고 있습니다 그러나 내가 가지고있는 숫자가 소수인지 아닌지를 검사하기 위해 루프를 사용하고 있기 때문에 더 많은 문제가 있습니다. 지금 해결 = (BigInteger는 probablePrime 메서드를 가지고 있지만 CheckIfPrime 메서드는 가지고 있지 않습니다.) – Goblinette