2011-03-26 5 views
0

AES와 RSA를 사용하여 보안 연결을 시도하는 중 키를 문자열로 변환하여 네트워크를 통해 전송하려고하면 다시 byte []로 변환됩니다. 값이 변경되었습니다. 내 생각을 이해하기 위해 아래의 코드를 볼 수 있습니다.바이트 []을 문자열로 변환 한 다음 바이트 []로 다시 변환 할 때 문제가 발생했습니다.

public class test { 
    public static String asHex (byte buf[]) { 
     StringBuffer strbuf = new StringBuffer(buf.length * 2); 
     int i; 

     for (i = 0; i < buf.length; i++) { 
     if (((int) buf[i] & 0xff) < 0x10) 
     strbuf.append("0"); 

     strbuf.append(Long.toString((int) buf[i] & 0xff, 16)); 
     } 

     return strbuf.toString(); 
    } 

public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException { 


    KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
kgen.init(128); 

SecretKey skey = kgen.generateKey(); 
byte[] raw = skey.getEncoded(); 

String r = new String(raw,"UTF-8"); 

System.out.println(asHex(raw));// prints for example fd812245c9bfc4106294d51bf27e3796 

byte[] t = r.getBytes("UTF-8"); 

System.out.println(asHex(t)); // prints for example : efbfbd2245c9bfefbfbd1062efbfbdefbfbd1befbfbd7e37efbfbd 

    } 
} 
+0

이것이 문제의 원인인지는 모르겠지만 UTF-8을 인코딩으로 사용하는 것은 좋은 생각이 아닙니다. 모든 바이트 시퀀스가 ​​유효한 UTF-8 문자열이 아니기 때문일 수 있습니다. ISO8859-1과 같은 싱글 바이트 인코딩을 사용합니다. –

+0

@Philipp : 인코딩 된 텍스트라고 가정하는 * 인코딩을 사용하는 것은 매우 나쁜 생각입니다. –

답변

0

바이트 배열을 전송할 때는 16 진수 (또는 그 이상 - base64) 표현을 사용해야합니다.

+0

base64를 사용했지만 데이터가 더 커졌습니다. – moataz

+1

@moataz 모호함없이 인코딩되고 디코딩 될 수 있습니다. 그리고 트래픽이 문제인 경우 gzip으로 압축 할 수 있습니다. – Bozho

4

원시 바이트 배열을 UTF-8 문자열로 변환했기 때문입니다. 모든 바이트 순서가 유효한 UTF-8 문자열이 아니므로 String 생성자가 올바른 문자열 유형으로 변환하는 동안 수정할 수 있습니다.

4

String(byte[], String) 생성자를 사용하면 "여기에 일부 텍스트의 인코딩 된 버전이 있는데이 인코딩입니다."

여기가 이 아닌의 경우입니다. 인코딩 된 텍스트가 없습니다. 불투명 한 이진 데이터가 있습니다. 단순히 텍스트 데이터가 아닙니다. Base64를 사용하여이를 순수 ASCII 문자열로 안전하게 변환하십시오. 사용할 수있는 public domain Java encoder/decoder가 있습니다.

+1

인코딩 ISO8859-1이 문제를 해결할 것이라고 생각합니다. – moataz

+2

@moataz : 나중에 * 문자열을 사용하는 것에 따라 다를 수 있지만 근본적으로 * 잘못된 * 접근 방식입니다 . 텍스트의 불투명 한 바이너리 데이터를 표현하고자 할 때, 나머지 세계와 마찬가지로 Base64를 사용하면됩니다. –

관련 문제