2015-01-20 6 views
0

Java에서 비대칭 암호화로 키 쌍을 생성하려고하는데 invalid key exception 오류가 발생하고 No installed provider supports this key: sun.security.rsa.RSAPrivateCrtKeyImpl이 표시됩니다.자바에서 비대칭 암호화로 키 쌍을 생성하는 방법은 무엇입니까?

private static byte[] encrypt(byte[] inpBytes, PrivateKey prvk, 
     String xform) throws Exception { 
    Cipher cipher = Cipher.getInstance(xform); 
    cipher.init(Cipher.ENCRYPT_MODE, prvk); 
    return cipher.doFinal(inpBytes); 
} 

@Override 
public byte[] uploadFile(byte[] data, String name, String file, int size) 
     throws RemoteException { 
    // TODO Auto-generated method stub 
    byte[] keyss=null; 
    try { 
     OutputStream out = 
      new FileOutputStream(new File("C:\\Users\\Amaresh\\Documents\\Cloud\\" 
      + name + "\\" + file)); 
     String xform = "DES/CTR/NoPadding"; 
     KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); // Original 
     kpg.initialize(1024); // 512 is the keysize.//try 1024 biit 
     KeyPair kp = kpg.genKeyPair(); 
     PublicKey pubk = kp.getPublic(); 
     PrivateKey prvk = kp.getPrivate(); 
     keyss = pubk.getEncoded(); 
     byte[] encBytes = encrypt(data, prvk, xform); 
     System.out.println("Keypair generated"); 
     out.write(encBytes, 0, encBytes.length); 
     out.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (NoSuchAlgorithmException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (NoSuchProviderException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return keyss; 
} 

난 그냥 내가 개인 키를 사용하여 데이터를 암호화하고 해독하는 공개 키를 저장하는 곳 비대칭 암호화를 수행합니다. 나는 초보자이며 내 실수로 인해 유감입니다.

+0

잘 모르겠지만 무제한 키 강도 정책을 설치해야 할 수도 있습니다. http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html . 이 코드는 공용/개인 키 생성뿐만 아니라 한 번에 파일을 암호화한다는 점에 유의하십시오. 그런 다음 암호화 된 파일 당 개인/공개 키 쌍이 생길 것입니다. 나는 이것이 당신이 정말로 원하는 것이라고 상상할 수 없습니다. – Gimby

답변

3

키를 올바르게 생성하고 있습니다.

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
kpg.initialize(1024); 
KeyPair keys = kpg.generateKeyPair(); 

문제는 당신이다 :

byte[] encBytes = encrypt(data, prvk, xform); 

대부분의 경우 당신은 문자열 "DES/CTR/NoPadding"전달되어 있기 때문이다. RSA 키 쌍으로 DES를 사용하여 암호화 할 수 없습니다.

+0

감사합니다 .i는 그것을 고치고 내가 얼마나 바보인지 깨달았습니다. – Sam

1

DES 암호는 RSA 키를 지원하지 않습니다. DES는 RSA가 비대칭 인 반면 대칭 암호 알고리즘입니다. 대칭 암호는 암호화 및 암호 해독에 동일한 키를 사용해야하며 비대칭 암호는 공개/개인 키 쌍을 사용합니다.

  1. 당신은

  2. 당신은 당신의 암호를 변경할 수 있습니다 (어쩌면 KeyGenerator를 사용하여) 현재 대칭 암호화를 사용하여 대칭 키를 만들 수 있습니다

    당신은 암호화 작업을 얻을 수있는 두 가지 옵션이 있습니다 예를 들어 "RSA"과 같은 비대칭적인 것입니다.

    String xform = "RSA"; 
    

참고 : 암호화하지만, 암호화는 공개 키와 함께 할 것으로 서명하지 않는 당신이 할하려는
.
또한 비대칭 모드로 전체 파일을 암호화하지 말고 데이터를 대칭 적으로 암호화하고 해독하는 데 사용하는 대칭 키만 암호화하면 안됩니다. http://en.wikipedia.org/wiki/Public-key_cryptography#Computational_cost을 참조하십시오.