2012-01-12 7 views
1

Base64 인코딩을 사용하여 RSA 암호화를 구현하려고합니다. 순서는 다음과 같습니다 모든 Base64로 텍스트 후너무 많은 바이트를 인코딩하는 RSA 및 Base64

String -> RSA encrypt -> Base64 encoder -> network -> Base64 decoder* -> RSA decrypt > String 

내가 바로, 네트워크를 통해 함께 문자열을 base64 인코딩을 보내고 반대편에 문자열로 읽을 수있어?

일부 이유 Base64를 디코딩 할 때 원래 보낸 것보다 많은 바이트가 출력됩니다.

발신자 측에서 내 RSA 문자열은 512 바이트입니다. Base64 인코딩 이후 1248 년 (이 때마다 다릅니다). 수신 측에서 Base64로 인코딩 된 문자열은 여전히 ​​1248이지만, 디코딩하면 갑자기 936 바이트가됩니다. 그렇다면 ciper.doFinal 메서드가 중단되어 RSA로 해독 할 수 없습니다.

나는 이것이 바이트 코드로 유니 코드 문자열 변환을하는 것으로 가정하고 있지만 어떤 단계에서 이것이 일어나고 어떻게 해결할 수 있는지 알 수 없다.

송신원 번호 :

cipher = Cipher.getInstance("RSA/NONE/OAEPWithSHA256AndMGF1Padding"); 
cipher.init(Cipher.ENCRYPT_MODE, getPublicKey()); 
byte[] base64byes = loginMessage.getBytes(); 
byte[] cipherData = cipher.doFinal(base64byes); 
System.out.println("RSA: " + cipherData.length); //is 512 long 
//4. Send to scheduler 
Base64PrintWriter base64encoder = new Base64PrintWriter(out); 
base64encoder.writeln(new String(cipherData)); //send string is 1248 long 
base64encoder.flush(); 

수신기 측 번호 :

System.out.println("Base 64: " + encodedChallenge.length()); //1248 long 
byte[] base64Message = encodedChallenge.getBytes(); 
byte[] rsaEncodedMessage = Base64.decode(base64Message); 
System.out.println("RSA: " + rsaEncodedMessage.length); //936 long 
cipher = Cipher.getInstance("RSA/NONE/OAEPWithSHA256AndMGF1Padding"); 
cipher.init(Cipher.DECRYPT_MODE, privateKey); 
cipherData = cipher.doFinal(rsaEncodedMessage); //hangs up 
System.out.println("Ciper: " + new String(cipherData)); 

P.S. Base64PrintWriter는 필기 전에 모든 출력을 base64로 변환하도록 꾸며 놓은 PrintWriter입니다.

답변

3

인코딩에 문제가 있습니다. 베이스 (256) 대신에베이스 (64)를 사용한다는 것은 요구되는 8 비트/6 비트의 증가 또는 1/3의 유사한 디코딩 결과가 1/4의 드롭으로 발생한다는 것을 의미한다. 1248 * 6/8 = 936

문제는 인코딩하기 전에 8 비트 데이터를 16 비트 문자열로 변환하는 것 같습니다. 여기에는 512 * 16/6 바이트 = ~ 1365가 필요합니다.

chars/String 대신 바이트를 사용하는 Base64 스트림이 필요합니다.

아마도 Base64.encode()를 사용하면 무엇이 필요합니까?

+1

당신은 내 영웅입니다. 정말로 그것을 해결했습니다. Base64PrintWriter를 writeln (byte [] b) 메서드로 변경했습니다. 이제 작동합니다. – lanoxx

+1

Base64OutputStream으로 변경하고 Writer를 부모로 설정합니다. 반대로 Base64InputStream을 만들고 Reader를 사용하게하십시오. Base64는 표준 정의가 바이트를 바이트로 말하는 경우에도 바이트로 문자를 인코딩합니다. 왜냐하면 그들은 * 8 비트 인코딩을 asumed * 때문입니다. 재미있는 스트리밍 바이트가 UTF-16으로 인코딩 된 XML로 상상할 수 있습니다. –

+0

@owlstead : 답장을 보내 주셔서 감사합니다. 다른 질문을 열고 Base64OutputStream에 대한 현재 솔루션을 게시했습니다. 이것이 제대로 수행되었는지 또는 여전히 개선 될 수 있는지에 대한 귀하의 의견에 감사드립니다. http://stackoverflow.com/questions/8896237/java-base64-how-to-write-a-base64outputstream-class-using-decorator-pattern – lanoxx

관련 문제