2015-10-15 22 views
0

我需要使用Java的SecretKeySpec()与数字阵列超过127如何将无符号字节传递给SecretKeySpec()?

更大。如果我执行以下操作:

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

的号码来获得转换为字节,他们会是负的。

我当然可以用0xFF&它们,并将它们保存在一个short阵列和保存自己的价值,但我不能给这个数组传递给SecretKeySpec(),因为它仅仅接收bytes[]阵列。

任何想法?

+1

如果SecretKeySpec需要一个字节[],则必须假定它正确处理值> 127。你真正的问题是什么? – matt

+0

写这个:'new byte [] {0xD9,0xDF,0x85}'产生一个错误。它需要像这样:'new byte [] {(byte)0xD9,(byte)0xDF,(byte)0x85}'。如果是这样的话,那么这些数字将被转换为有符号数字。所以我已经通过了一个错误的数组... –

+0

你不能有一个等于128的字节,因为没有无符号字节。所以SecretKeySpec必须相应地处理它。你为什么说它是错误的数组? – matt

回答

0

似乎没有必要这样做。 我用Java编写了byte[]数组的签名值,并且在C#中以无符号形式读取它们(例如Java的-16在C#中读取240)。但解密仍然有效。似乎这是在Rijndael算法中处理的。

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)); 
    } 
} 
+0

问题是我传递给'SecretKeySpec()'什么?从文档中:*为指定的密钥数据和算法名称创建一个新的SecretKeySpec *因此它对217号和-39号的工作方式会有所不同。我需要它在217 –

+0

上工作我看到*“这个类只对可以表示为字节数组的原始密钥有用......”*。而且我的例子中的数字不能表示为一个字节数组,所以我猜这只是不可能的。 –

+0

你*可以*表示217作为一个字节,唯一的问题是哪个字节,并且有一个自然的规范方法来做到这一点。另外,如果您试图重现从另一个源创建的'SecretKeySpec',映射只是很重要的 - 您正在尝试做什么? – hugh

相关问题