2013-11-28 3 views
0

프로젝트에 대한 간단한 인증 서버를 구축해야합니다. 서버는 클라이언트가 서로 통신 할 수 있도록 AES 키를 배포해야합니다."javax.crypto.IllegalBlockSizeException을 실행하지 않고 RSA를 사용하여 AES 키를 암호화하는 방법 : 117 바이트보다 길지 않아야합니다."

RSA를 사용하여 AES 키를 암호화 할 때 "javax.crypto.IllegalBlockSizeException : 데이터가 117 바이트보다 길지 않아야합니다."라는 오류가 발생합니다. 내 AES 키의 길이가 128 비트 = 16 바이트이기 때문에 이상하게 보입니다.

private void createAndSendAES() throws NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, IOException, InvalidKeyException, BadPaddingException { 
    KeyGenerator keyGen = KeyGenerator.getInstance("AES"); 
    keyGen.init(128); 
    this.AESBlackboardKey = keyGen.generateKey(); // My AES key 

    byte[] raw = AESBlackboardKey.getEncoded(); 
    System.out.println(raw.length); // Prints 16 

    Cipher cipher = Cipher.getInstance("RSA"); 
    cipher.init(Cipher.ENCRYPT_MODE, this.clientPubKey); 


    SealedObject encryptedAESBlackboardKey = new SealedObject(this.AESBlackboardKey, cipher); // ERROR HERE 

    ObjectOutputStream outO = new ObjectOutputStream(this.clientSocket.getOutputStream()); 
    outO.writeObject(encryptedAESBlackboardKey); //Transmitting the key over socket link 
    outO.flush(); 

    System.out.println("AS: Blackboard AES key sent."); 

} 

사람이 16 바이트 AES 키의 암호화 나 오류가 어떻게를 방지 할 수있는 이런 종류의로 실행하게하는 방법을 알고 있나요 : 여기

코드는 오류를 생성하는?

미리 감사드립니다.

+0

내가 언급 한 것을 잊어 버린 중요한 세부 사항은 Encode하려고하는 객체 AESBlackboardKey가 속한 클래스입니다 : SecretKey. – user3045293

+0

암호화하려는 것은 키가 아니며 키를 포함하는 직렬화 된 클래스입니다. 그것은 훨씬 더 커질 것입니다. –

+0

고마워, 근본적으로 나는 128 비트 + 객체가 128 비트 키를 가지고있다. 동일한 정보를 더 작은 객체에 저장할 수 있는지 알고 있습니까? – user3045293

답변

3

오류가 발생하는 이유는 키를 구성하는 16 바이트뿐 아니라 전체 개체가 저장된다는 것입니다. 그래서 예. 거기에 전체 클래스 이름을 가지고, 클래스의 일련 번호 등등.

SealedObject을 계속 사용하려면 새로운 임의의 AES 키와 "AES/CBC/PKCS5Padding"으로 암호화를 제안하십시오. Cipher.doFinal()을 사용하여 RSA 알고리즘을 사용하여 해당 키를 암호화 할 수 있습니다 (예 : "RSA/NONE/OAEPPadding" 또는 "RSA/NONE/PKCS1Padding").

이렇게 생성 된 데이터를 직접 암호화 할 수도 있습니다.

또 다른 방법은 단순히 RSA 키 크기를 늘리는 것입니다. 1024의 RSA 키 크기가 점차 위협 받고 있으며 최소 2048의 키 크기를 사용하십시오 (256 - 11 = 245 바이트의 저장 공간 허용).

key.getEncoded()을 사용하여 이전에 생성 한 AES 키에서 16 바이트를 검색 할 수 있습니다.

+0

귀하의 조언에 대해 감사드립니다 =) 마침내 을 사용하여 키를 보낼 수있었습니다. SealedObject encryptedAESServiceKey = new SealedObject (this.AESServiceKey.getEncoded(), cipher); (.getEncoded()) byte [] SessionKey = new byte [32]를 사용하여 수신기에서 다시 디코딩하십시오. \t \t SessionKey = (byte []) EncryptedSessionKey.getObject (cipher); \t \t this.ASAESKey = 새 SecretKeySpec (SessionKey, 0, 32, "AES"); – user3045293

+0

도움이 될 수있어서 기쁩니다. 내 대답이 옳다고 생각하면 받아 들일 수 있습니다 (왼쪽의 V 표시). 더 나은 해결책이 있다고 생각되면 직접 답변을 게시하고 수락 할 수 있습니다. –

관련 문제