尝试使用AES和RSA创建安全连接时,我发现当我尝试将密钥转换为字符串以通过网络发送时,再次转换为字节[]。值改变了。你可以看到下面涉及的代码来理解我的想法。将字节[]转换为字符串,然后返回字节时出现问题
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
}
}
我不确定这是否会导致您的问题,但使用UTF-8作为编码可能不是一个好主意,因为并非每个字节序列都是有效的UTF-8字符串。我会使用像ISO8859-1这样的单字节编码。 – 2011-03-26 14:55:27
@Philipp:使用任何*编码假设它是真正的编码文本是一个非常糟糕的主意。 – 2011-03-26 15:00:25