在尝试使用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 :(得分:4)
这是因为原始字节数组转换为UTF-8字符串。由于并非每个字节序列都是有效的UTF-8字符串,因此String构造函数可以在转换为有效字符串排序时对其进行修改。
答案 1 :(得分:4)
使用String(byte[], String)
构造函数时,您会说:“这是某些文本的编码版本,这是编码。”
这里的不是案例。您没有编码文本 - 您有不透明的二进制数据。它根本不是文本数据。使用Base64将其安全地转换为纯ASCII字符串。您可以使用public domain Java encoder/decoder。
答案 2 :(得分:0)
这就是为什么你应该使用十六进制(或更好的 - base64)表示来传输字节数组。