如何将无符号字节传递给SecretKeySpec()?

时间:2015-10-15 06:42:02

标签: java byte unsigned

我需要使用Java的SecretKeySpec(),其数字大于127。

如果我执行以下操作:

new byte[] { (byte)0xD9, (byte)0xDF, (byte)0x85 }

数字转换为字节,它们将为负数。

当然我可以&使用0xFF将它们保存在short数组中并保存它们的值,但之后我将无法将此数组传递给{{ 1}},因为它只接收SecretKeySpec()数组。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

这实际上只是一个渲染问题。 SecretKeySpec使用字节数组,构造字节数组没有问题。唯一的问题是如何将大(> 127)个整数表示为java字节,或者等效地将'217'表示为字节。

您可以使用您想要的任何映射,但Java有一个非常自然的选择 - 将整数转换为字节,使用强制转换,(byte)i,然后转换回来,使用Byte.toUnsignedInt(b)。如您所见,这会恢复原始值:

public static void main( String[] args )
{
    for (int count = 0; count<256; count++){
        System.out.println(count+" : "+(byte)count+" => "+Byte.toUnsignedInt((byte)count));
    }
}

答案 1 :(得分:0)

似乎没有必要这样做。 我在Java中将签名值写入byte[]数组,并在C#中将它们作为无符号读取(例如,Java#{1}}在C#中读取-16。但解密仍然有效。这似乎是在Rijndael算法中处理的。