0

我有一个在 BlackBerry JE 4.6.1 上开发的应用程序,它使用 DES 算法解密来自 WebServer 的信息。如果我将加密信息发送到服务器,它会被很好地解密。但是如果服务器发送加密数据,我在解密后没有得到正确的值。密钥应该是相同的,并且加密信息以 base64 编码发送。在调试过程中我发现,在创建 DESKey 之后,它的内部数据与传递给构造函数的字节数组不同。例如,如果我以下一种方式创建 DESKey

String keyStr = "2100000A";
DESKey desKey = new DESKey(keyStr.getBytes()); // pass the byte array {'2','1','0','0','0','0','0','A'}

方法 desKey.getData() 返回与初始键不同的字节数组 {'2','1','1','1','1','1','1','@'}字节。

那么DESKey的这种行为是否有可能成为我无法从服务器解密数据的原因?

谢谢你。

4

1 回答 1

0

desKey.getData() 行为是预期的。

文档指出:

DES 在 64 位块上运行,有效密钥长度为 56 位。实际上,密钥是 64 位,但使用了 8 位奇偶校验,这意味着有效密钥长度只有 56 位。每八位用于奇偶校验,它是用于奇偶校验的最低有效位。

奇偶校验位定义

奇偶校验位或校验位是为了确保一组位中值为 1 的位数是偶数或奇数而添加的位。奇偶校验位用作检错码的最简单形式。

所以,事情就是这样发生的:

'2' => 0x32 => 00110010 => 0011001 + (parity bit 0) => 00110010 => 0x32 => '2'
'1' => 0x31 => 00110001 => 0011000 + (parity bit 1) => 00110001 => 0x31 => '1'
'0' => 0x30 => 00110000 => 0011000 + (parity bit 1) => 00110001 => 0x31 => '1'
'0' => 0x30 => 00110000 => 0011000 + (parity bit 1) => 00110001 => 0x31 => '1'
'0' => 0x30 => 00110000 => 0011000 + (parity bit 1) => 00110001 => 0x31 => '1'
'0' => 0x30 => 00110000 => 0011000 + (parity bit 1) => 00110001 => 0x31 => '1'
'0' => 0x30 => 00110000 => 0011000 + (parity bit 1) => 00110001 => 0x31 => '1'
'A' => 0x41 => 01000001 => 0100000 + (parity bit 0) => 01000000 => 0x40 => '@'
于 2010-09-12T20:46:39.080 回答