資料加密標準 (DES) 金鑰及作業
索引鍵
硬體 JCE 實作 (IBMJCECCA) 延伸軟體 JCE 實作中可用的 DES 金鑰。 在軟體 JCE 實作中, DES 金鑰資料儲存在金鑰物件中。 IBMJCECCA 實作透過新增下列替代表示法來延伸此項:
先前儲存在 CCA 金鑰儲存區中的 DES 金鑰。 金鑰物件包含金鑰的 CCA 金鑰儲存區標籤。
下列範例說明為已儲存在 CCA 金鑰儲存區中且標籤為 "MY.ENCRYPT.ED.DESKEY" ,然後 (為了舉例說明) 刪除 CCA 金鑰儲存區項目。
在 z800 和 z900 機器上,包含已加密 DES 金鑰標籤的金鑰物件可用於 IBMJCECCA 提供者的 CBC 模式加密和解密。// create a key object for an existing entry // (No checking is done to verify that the entry exists, or // that the key it contains is actually a DES key.) // SecretKeyFactory desKeyFactory = SecretKeyFactory.getInstance("DES", "IBMJCECCA"); KeyLabelKeySpec spec = new KeyLabelKeySpec("MY.ENCRYPT.ED.DESKEY"); SecretKey key = desKeyFactory.generateSecret(spec); // delete the entry from the key storage area // (An exception is thrown if the key entry does not exist.) // key.deleteCKDSEntry(); // // Note that, in this example, the Java key object still // exists, but the key entry it represents has been deleted. // Any attempt to use the objectkey
will cause an exception // containing a hardware return code and reason code. //在 z890 和 z990 以及更新版本 zSeries 處理器上,包含清楚 DES 金鑰之標籤的金鑰物件可以用於 CBC 模式、CFB 模式或使用 IBMJCECCA 提供者的 ECB 模式加密和解密。 此環境也支援使用金鑰物件,該物件包含用於使用 IBMJCECCA 提供者進行 CBC 模式加密及解密之已加密 DES 金鑰的標籤。
包含已加密 DES 金鑰之標籤的金鑰物件可以傳遞至要包裝以匯出至另一個主機的 IBMJCECCA RSA 密碼物件。
由「RSA 密碼」包裝的 DES 金鑰可以傳遞至「IBMJCECCA RSA 密碼」,以解除包裝以從另一個主機匯入。 依預設,產生的 (未包裝) 金鑰物件包含清楚的 DES 金鑰。 如果建立 CCAAlgorithmParameterSpec 時未指定任何類型,或使用類型 CCAAlgorithmParameterSpec.SECURE_INTERNAL_TOKEN,且使用此 CCAAlgorithmParameterSpec來起始設定「RSA 密碼」,則產生的 (未包裝) 金鑰物件會包含 DES 硬體記號。 如果以類型 CAAlgorithmParameterSpec.CKDS建立 CCAAlgorithmParameterSpec ,且以這個 CCAAlgorithmParameterSpec來起始設定「RSA 密碼」,則產生的 (未包裝) 金鑰物件會包含系統安全金鑰儲存區 (包含 DES 硬體記號) 中項目的標籤。
如需包裝及解除包裝 DES 金鑰的相關資訊,請參閱 RSA 金鑰。
對基礎硬體的 IBMJCECCA 呼叫所產生的 DES 金鑰。 金鑰物件包含硬體記號。 此記號包含使用主機主要金鑰加密的金鑰。 此類型金鑰的金鑰資料絕不會以明確形式常駐在系統記憶體中。
下列範例說明產生包含硬體金鑰記號的 DES 金鑰物件:
包含 DES 硬體記號的金鑰物件可用於使用 IBMJCECCA 提供者進行 CBC 模式加密及解密。// create a new key token and a key object to represent it // CCAAlgorithmParameterSpec ccaAlgParmSpec = new CCAAlgorithmParameterSpec(); KeyGenerator keyGen = KeyGenerator.getInstance( "DES", "IBMJCECCA" ); keyGen.init( ccaAlgParmSpec, null ); Key desKey = keyGen.generateKey();包含 DES 硬體記號的金鑰物件可以傳遞至 IBMJCECCA RSA Cipher 物件,以包裝以匯出至另一個主機。
由「RSA 密碼」包裝的 DES 金鑰可以傳遞至「IBMJCECCA RSA 密碼」,以解除包裝以從另一個主機匯入。 依預設,產生的 (未包裝) 金鑰物件包含清楚的 DES 金鑰。 如果建立 CCAAlgorithmParameterSpec 時未指定任何類型,或使用類型 CCAAlgorithmParameterSpec.SECURE_INTERNAL_TOKEN,且使用此 CCAAlgorithmParameterSpec來起始設定「RSA 密碼」,則產生的 (未包裝) 金鑰物件會包含 DES 硬體記號。 如果以 CAAlgorithmParameterSpec.CKDS類型建立 CCAAlgorithmParameterSpec ,且以這個 CCAAlgorithmParameterSpec來起始設定「RSA 密碼」,則產生的 (未包裝) 金鑰物件會包含 CCA 金鑰儲存體項目的標籤,其中包含 DES 硬體記號。
如需包裝及解除包裝 DES 金鑰的相關資訊,請參閱 RSA 金鑰。
一種 DES 金鑰,由對基礎硬體的 IBMJCECCA 呼叫所產生,然後儲存在 CCA 金鑰儲存區中。 金鑰物件包含新 CCA 金鑰登錄的標籤。 CCA 金鑰登錄會保留一個記號,其中包含以主電腦主要金鑰加密的金鑰。 此類型金鑰的金鑰資料絕不會以明確形式常駐在系統記憶體中。
下列範例說明產生受保護的 DES 金鑰記號,將它儲存在具有自動產生標籤的新 CCA 金鑰項目中,並建立包含 CCA 金鑰項目標籤的金鑰物件。
下列範例說明產生受保護的 DES 金鑰記號,並將它儲存在標籤為ADES.TOKEN.INCKDS" ,並建立包含 CCA 金鑰登錄標籤的金鑰物件。// create a new CCA key entry and a key object to represent it // CCAAlgorithmParameterSpec ccaAlgParmSpec = new CCAAlgorithmParameterSpec(CCAAlgorithmParameterSpec.CKDS); KeyGenerator keyGen = KeyGenerator.getInstance("DES", "IBMJCECCA"); keyGen.init( ccaAlgParmSpec, null ); Key thisKey = keyGen.generateKey();
代表 DES 硬體記號的金鑰物件可用於 IBMJCECCA 提供者的 CBC 模式加密及解密。// create a new CCA key entry and a key object to represent it // CCAAlgorithmParameterSpec ccaAlgParmSpec = new CCAAlgorithmParameterSpec(CCAAlgorithmParameterSpec.CKDS, "ADES.TOKEN.INCKDS"); KeyGenerator keyGen = KeyGenerator.getInstance("DES", "IBMJCECCA"); keyGen.init(ccaAlgParmSpec,null); Key thisKey = keyGen.generateKey();代表 DES 硬體記號的金鑰物件可以傳遞至 IBMJCECCA RSA Cipher 物件,以包裝以匯出至另一個主機。
由「RSA 密碼」包裝的 DES 金鑰可以傳遞至「IBMJCECCA RSA 密碼」,以解除包裝以從另一個主機匯入。 依預設,產生的 (未包裝) 金鑰物件包含清楚的 DES 金鑰。 如果建立 CCAAlgorithmParameterSpec 時未指定任何類型,或使用類型 CCAAlgorithmParameterSpec.SECURE_INTERNAL_TOKEN,且使用此 CCAAlgorithmParameterSpec來起始設定「RSA 密碼」,則產生的 (未包裝) 金鑰物件會包含 DES 硬體記號。 如果以 CAAlgorithmParameterSpec.CKDS類型建立 CCAAlgorithmParameterSpec ,且以這個 CCAAlgorithmParameterSpec來起始設定「RSA 密碼」,則產生的 (未包裝) 金鑰物件會包含含有 DES 硬體記號之 CCA 金鑰項目的標籤。
如需包裝及解除包裝 DES 金鑰的相關資訊,請參閱 RSA 金鑰。
作業
DES 的硬體 JCE 實作 (IBMJCECCA) 不會變更軟體 JCE 實作中可用的任何 API。 因此,使用軟體 JCE 實作的 DES 功能的應用程式不需要修改即可使用 IBMJCECCA 提供者,但提供者的特定參照除外。 例如,如果 getInstance() API 的呼叫指定了 IBMJCE 提供者,您必須改為變更呼叫來指定 IBMJCECCA 提供者。
雖然所有 DES 密碼都可以在 IBMJCECCA 提供者中使用,但並非所有 DES 密碼都可以在硬體裝置中使用。 硬體加密裝置支援 DES 的「密碼區塊鏈 (CBC)」、「密碼回饋 (CFB)」、「輸出回饋 (OFB)」及「電子碼本 (ECB)」版本。 也就是說, IBMJCECCA 提供者支援所有 DES 密碼,但只有 CBC、CFB、OFB 和 ECB 模式可以使用硬體加密法。
使用硬體加密法而非軟體加密法並不總是更有效率。 DES 演算法的運算密集程度不如 RSA 之類的非對稱演算法。 對於較小的資料大小,軟體 DES 加密法可能比硬體加密法更快。 因此,具有 CBC、CFB、OFB 和 ECB 的 DES 軟體版本也在 IBMJCECCA 提供者中實作。 對於少量資料,軟體 DES (CBC、CFB、OFB 或 ECB) 有時比硬體 DES (CBC、CFB、OFB 或 ECB) 加密法更快。 發現效能交換的資料確切大小會因系統而異。 因此,會使用 剪輯層次
來指定使用硬體加密法的資料大小。 任何小於已配置的剪輯層次的資料長度都會使用軟體加密法。 剪輯層次是稱為 ibm.DES.usehdwr.size的系統內容,其預設值為 60。 因此,依預設,使用軟體加密法執行資料大小小於 60 位元組的任何 DES CBC、CFB、OFB 或 ECB 處理,使用硬體加密法執行任何大於或等於 60 位元組的資料大小。 對於 DES CBC、CFB、OFB 及 ECB 以外的密碼,此系統內容沒有功能。
您可以透過變更系統內容來調整剪輯層次。 如果您將系統內容設為 0 ,則會使用硬體加密法來執行所有 DES CBC、CFB、OFB 及 ECB 處理。 如果您將系統內容設為 -1 ,則會使用軟體加密法來執行所有 DES CBC、CFB、OFB 及 ECB 處理。 此系統內容同時適用於 DES 及三重 DES CBC、CFB、OFB 及 ECB 處理。
當第一個資料傳遞至密碼以進行加密或解密時,會執行與剪輯層次的資料大小比較。 例如,假設應用程式透過讀取每一筆記錄,然後將其傳遞至密碼,然後在應用程式讀取下一筆記錄之前,將磁帶內容解密。 在此情況下,傳遞至密碼物件的第一筆記錄是磁帶標頭。 如果磁帶標頭小於現行剪輯層次,則使用軟體來完成解密,即使後續記錄可能非常大。 在這種情況下,您可以選擇將剪輯層次設為 0 ,以便使用硬體加密法,而不管所處理的第一筆記錄大小。
下列範例顯示如何在執行名為 programName 的 Java™ 程式時設定 ibm.DES.usehdwr.size 系統內容。
java -Dibm.DES.usehdwr.size=80 programName
也可以使用 Java System.setProperty() 方法,以程式化方式來設定此值。