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

How to pass unsigned bytes to SecretKeySpec()?

我需要将 Java 的 SecretKeySpec() 与大于 127 的数字数组一起使用。

如果我执行以下操作:

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

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

当然我可以用 0xFF & 它们并将它们保存在 short 数组中并保存它们的值,但是我将无法将此数组传递给SecretKeySpec(),因为它只接收一个bytes[]数组。

有什么想法吗?

这实际上只是一个渲染问题。 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));
    }
}

好像没有必要那样做。 我在 Java 中将有符号值写入 byte[] 数组,并在 C# 中将它们读取为无符号(例如 Java 的 -16 在 C# 中读取 240) .但解密仍然有效。这似乎在 Rijndael 算法中得到了处理。