2010-07-13 35 views
0

我有一個在BlackBerry JE 4.6.1上開發的應用程序,它使用DES algorythm解密來自WebServer的信息。 如果我將加密信息發送到服務器,它會很好地解密。但是,如果服務器發送加密數據, 解密後我沒有得到正確的值。 密鑰應該是相同的,密碼信息以base64編碼發送。 在調試過程中我發現,在創建DESKey後,它的內部數據與傳遞給構造函數的字節數組不同。 例如,如果我創建DESKey下一方式我的DESKey(BlackBerry API)有什麼問題?

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的這種行爲有可能成爲我無法解密服務器數據的原因嗎?

謝謝。

回答

0

desKey.getData()行爲是預期的。

doc狀態:

DES操作在64個的塊,並且具有 的56位的有效密鑰長度。在 的現實中,密鑰是64位,但是 是8位的奇偶校驗,這意味着 有效密鑰長度只有 56位。每個第八位用於奇偶校驗,並且它是用於奇偶校驗的最不重要的 位。

校驗位definition

一個奇偶校驗位,或者檢查位,是一個比特被添加,以保證在一組比特的值的一個比特的數目是偶數還是奇數。奇偶校驗位被用作錯誤檢測代碼的最簡單形式。

所以,這是怎麼回事了:

'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 => '@'