我想将String值转换为secret KEY DES:
String sb="fffe7a50" //Example of DES key
byte []b=sb.getBytes(); //string to bytes
SecretKey key2 = new SecretKeySpec(b, 0, b.length, "DES");
然而输出完全不同:
javax.crypto.spec.SecretKeySpec@183a2
我知道“@”之后的数字应该是DES密钥,但为什么结果会有所不同?我该如何解决?
答案 0 :(得分:1)
你在这里遇到了一些问题:
sb.getBytes()
不按照您的想法行事。您期望的是包含{ 0xff, 0xfe, 0x7a, 0x50 }
的字节数组。你得到的是一个包含{ 0x46, 0x46, 0x46, 0x45, 0x37, 0x61, 0x35, 0x30 }
的字节数组(假设你使用的是UTF-8)。
您在此处的选择是手动初始化字节数组,如下所示:
byte[] b = new byte[]{ (byte) 0xff, (byte) 0xfe, (byte) 0x7a, (byte) 0x50 };
或正确解析字符串。我不确定你到底怎么做,但它应该是可行的(并且可能会有一个开源库为你做这件事)。
输出javax.crypto.spec.SecretKeySpec@183a2
未写出密钥的值。您所看到的只是toString
的{{1}}输出,其格式为SecretKeySpec
(有关toString()方法的详细信息,请参阅here),因此数字你看,<fully-qualified-class-name>@<hashcode>
只是183a2
对象的哈希码,一定不能成为关键 - 这将是非常不安全的。要查看它所持有的密钥的值,您需要调用SecretKeySpec
方法。
请注意,只调用SecretKeySpec#getEncoded()
不会显示字节数组的内容 - 它只会再次显示类名和哈希码。您需要迭代遍历数组并逐个打印元素,或者使用其他工具来比较两个数组。