将字符串转换为密钥

时间:2014-03-02 23:51:25

标签: java type-conversion byte des

我想将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密钥,但为什么结果会有所不同?我该如何解决?

1 个答案:

答案 0 :(得分:1)

你在这里遇到了一些问题:

  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 };
    

    或正确解析字符串。我不确定你到底怎么做,但它应该是可行的(并且可能会有一个开源库为你做这件事)。

  2. 输出javax.crypto.spec.SecretKeySpec@183a2未写出密钥的值。您所看到的只是toString的{​​{1}}输出,其格式为SecretKeySpec(有关toString()方法的详细信息,请参阅here),因此数字你看,<fully-qualified-class-name>@<hashcode>只是183a2对象的哈希码,一定不能成为关键 - 这将是非常不安全的。要查看它所持有的密钥的值,您需要调用SecretKeySpec方法。

    请注意,只调用SecretKeySpec#getEncoded()不会显示字节数组的内容 - 它只会再次显示类名和哈希码。您需要迭代遍历数组并逐个打印元素,或者使用其他工具来比较两个数组。