Klucze i operacje DES (Data Encryption Standard)

Klucze

Sprzętowa implementacja JCE (IBMJCECCA) rozszerza klucz DES, który jest dostępny w implementacji oprogramowania JCE. W implementacji JCE oprogramowania materiał klucza DES jest przechowywany w obiekcie klucza. Implementacja IBMJCECCA rozszerza tę wartość, dodając następujące alternatywne reprezentacje:

  • Klucz DES, który był wcześniej przechowywany w obszarze pamięci kluczy CCA. Obiekt klucza zawiera etykietę obszaru pamięci kluczy CCA dla klucza.

    W poniższym przykładzie przedstawiono tworzenie obiektu klucza DES dla klucza, który jest już zapisany w obszarze pamięci kluczy CCA z etykietą "MY.ENCRYPT.ED.DESKEY", a następnie (w celu ilustracji) usunięcie pozycji obszaru pamięci kluczy CCA.
    // 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 object key will cause an exception
    // containing a hardware return code and reason code.
    //
    W komputerach z800 i z900 obiekt klucza, który zawiera etykietę zaszyfrowanego klucza DES, może być używany do szyfrowania i deszyfrowania w trybie CBC za pomocą dostawcy IBMJCECCA.

    W przypadku procesorów z890 i z990 i nowszych zSeries obiekt klucza zawierający etykietę dla jawnego klucza DES może być używany w trybie CBC, w trybie CFB lub w trybie szyfrowania i deszyfrowania w trybie EBC za pomocą dostawcy IBMJCECCA. To środowisko obsługuje również użycie obiektu klucza, który zawiera etykietę zaszyfrowanego klucza DES dla szyfrowania i deszyfrowania w trybie CBC za pomocą dostawcy IBMJCECCA.

    Obiekt klucza, który zawiera etykietę zaszyfrowanego klucza DES, może zostać przekazany do obiektu szyfrowania IBMJCECCA RSA, który ma zostać opakowany w celu wyeksportowania do innego hosta.

    Klucz DES, który został zawinięty przez szyfr RSA, może zostać przekazany do szyfru RSA IBMJCECCA, który ma zostać rozpakowany w celu zaimportowania z innego hosta. Domyślnie wynikowy (nieopakowany) obiekt klucza zawiera jawny klucz DES. Jeśli CCAAlgorithmParameterSpec jest tworzony bez określonego typu lub z typem CCAAlgorithmParameterSpec.SECURE_INTERNAL_TOKEN, a szyfr RSA jest inicjowany za pomocą tego CCAAlgorithmParameterSpec, wynikowy (nieopakowany) obiekt klucza zawiera token sprzętowy DES. Jeśli CCAAlgorithmParameterSpec jest tworzony z typem CAAlgorithmParameterSpec.CKDS, a szyfr RSA jest inicjowany za pomocą tego CCAAlgorithmParameterSpec, wynikowy (nieopakowany) obiekt klucza zawiera etykietę dla pozycji w obszarze bezpiecznej pamięci kluczy systemu, która zawiera token sprzętowy DES.

    Więcej informacji na temat opakowywania i rozpakowywania kluczy DES można znaleźć w sekcji Klucze RSA.

  • Klucz DES, który jest generowany przez wywołanie IBMJCECCA do bazowego sprzętu. Obiekt klucza zawiera token sprzętowy. Ten znacznik zawiera klucz zaszyfrowany za pomocą klucza podstawowego hosta. Klucz dla tego typu klucza nigdy nie jest rezydentny w pamięci systemowej w postaci jawnej.

    W poniższym przykładzie przedstawiono generowanie obiektu klucza DES, który zawiera token klucza sprzętowego:
    // 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();
    Do szyfrowania i deszyfrowania w trybie CBC z dostawcą IBMJCECCA można użyć obiektu klucza, który zawiera znacznik sprzętowy DES.

    Obiekt klucza, który zawiera znacznik sprzętowy DES, może zostać przekazany do obiektu szyfrowania IBMJCECCA RSA, który ma zostać opakowany w celu wyeksportowania do innego hosta.

    Klucz DES, który został zawinięty przez szyfr RSA, może zostać przekazany do szyfru RSA IBMJCECCA, który ma zostać rozpakowany w celu zaimportowania z innego hosta. Domyślnie wynikowy (nieopakowany) obiekt klucza zawiera jawny klucz DES. Jeśli CCAAlgorithmParameterSpec jest tworzony bez określonego typu lub z typem CCAAlgorithmParameterSpec.SECURE_INTERNAL_TOKEN, a szyfr RSA jest inicjowany za pomocą tego CCAAlgorithmParameterSpec, wynikowy (nieopakowany) obiekt klucza zawiera token sprzętowy DES. Jeśli CCAAlgorithmParameterSpec jest tworzony z typem CAAlgorithmParameterSpec.CKDS, a szyfr RSA jest inicjowany za pomocą tego CCAAlgorithmParameterSpec, wynikowy (nieopakowany) obiekt klucza zawiera etykietę dla pozycji pamięci kluczy CCA, która zawiera token sprzętowy DES.

    Więcej informacji na temat opakowywania i rozpakowywania kluczy DES można znaleźć w sekcji Klucze RSA.

  • Klucz DES, który jest generowany przez wywołanie IBMJCECCA do bazowego sprzętu, a następnie zapisany w obszarze pamięci kluczy CCA. Obiekt klucza zawiera etykietę dla nowej pozycji klucza CCA. Pozycja klucza CCA zawiera znacznik, który zawiera klucz zaszyfrowany za pomocą klucza podstawowego hosta. Klucz dla tego typu klucza nigdy nie jest rezydentny w pamięci systemowej w postaci jawnej.

    W poniższym przykładzie przedstawiono wygenerowanie chronionego znacznika klucza DES, zapisanie go w nowej pozycji klucza CCA z automatycznie wygenerowaną etykietą i utworzenie obiektu klucza zawierającego etykietę dla pozycji klucza 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();
    W poniższym przykładzie przedstawiono generowanie chronionego znacznika klucza DES, przechowującego go w nowej pozycji klucza CCA z etykietą "ADES.TOKEN.INCKDS", a także utworzenie obiektu klucza zawierającego etykietę dla pozycji klucza CCA.
    // 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();
    Obiekt klucza reprezentujący znacznik sprzętowy DES może być używany do szyfrowania i deszyfrowania w trybie CBC za pomocą dostawcy IBMJCECCA.

    Obiekt klucza reprezentujący znacznik sprzętowy DES może zostać przekazany do obiektu szyfrowania IBMJCECCA RSA, który ma zostać opakowany w celu wyeksportowania do innego hosta.

    Klucz DES, który został zawinięty przez szyfr RSA, może zostać przekazany do szyfru RSA IBMJCECCA, który ma zostać rozpakowany w celu zaimportowania z innego hosta. Domyślnie wynikowy (nieopakowany) obiekt klucza zawiera jawny klucz DES. Jeśli CCAAlgorithmParameterSpec jest tworzony bez określonego typu lub z typem CCAAlgorithmParameterSpec.SECURE_INTERNAL_TOKEN, a szyfr RSA jest inicjowany za pomocą tego CCAAlgorithmParameterSpec, wynikowy (nieopakowany) obiekt klucza zawiera token sprzętowy DES. Jeśli CCAAlgorithmParameterSpec jest tworzony z typem CAAlgorithmParameterSpec.CKDS, a szyfr RSA jest inicjowany za pomocą tego CCAAlgorithmParameterSpec, wynikowy (nieopakowany) obiekt klucza zawiera etykietę dla pozycji klucza CCA, która zawiera token sprzętowy DES.

    Więcej informacji na temat opakowywania i rozpakowywania kluczy DES można znaleźć w sekcji Klucze RSA.

Operacje

Sprzętowa implementacja JCE (IBMJCECCA) DES nie zmienia żadnych interfejsów API, które są dostępne w implementacji oprogramowania JCE. Dlatego też aplikacja, która używała możliwości algorytmu szyfrowania DES w implementacji JCE oprogramowania, nie wymaga modyfikacji w celu użycia dostawcy IBMJCECCA, z wyjątkiem konkretnych odwołań do dostawcy. Na przykład, jeśli wywołanie funkcji API getInstance() zostało określone przez dostawcę IBMJCE, należy zmienić wywołanie tak, aby zamiast niego określić dostawcę IBMJCECCA.

Mimo że wszystkie szyfry DES są dostępne w dostawcy IBMJCECCA, to nie są one dostępne w urządzeniach sprzętowych. Sprzętowe urządzenia szyfrujące obsługują algorytmy szyfrowania DES (Cipher Block Chaining-CBC), Cipher feedback (CFB), Output Feedback (OFB) i Electronic Code Book (EBC). Oznacza to, że wszystkie szyfry DES są obsługiwane przez dostawcę IBMJCECCA, ale tylko tryby CBC, CFB, OFB i ECB mogą używać kryptografii sprzętowej.

Używanie kryptografii sprzętowej nie zawsze jest bardziej efektywne, a nie kryptografii programowej. Algorytm DES nie jest tak intensywny, jak algorytmy asymetryczne, takie jak RSA. W przypadku mniejszych wielkości danych szyfrowanie oprogramowania DES może być szybsze niż kryptografia sprzętowa. Tak więc w dostawcy IBMJCECCA zaimplementowano również wersje oprogramowania DES z CBC, CFB, OFB i EBC. W przypadku małych ilości danych oprogramowanie DES (CBC, CFB, OFB lub ECB) jest czasami szybsze niż kryptografia DES (CBC, CFB, OFB lub ECB). Dokładna wielkość danych, z których można znaleźć tradeoff wydajności, zależy od systemu. Z tego powodu poziom obcinania jest używany do określania wielkości danych, w której używane jest kryptografia sprzętowa. Dowolna długość danych mniejsza niż skonfigurowany poziom obcinania wykorzystuje kryptografię oprogramowania. Poziom obcinania to właściwość systemowa o nazwie ibm.DES.usehdwr.size, która ma wartość domyślną 60. Tak więc domyślnie każdy algorytm DES CBC, CFB, OFB lub ECB, w którym wielkość danych jest mniejsza niż 60 bajtów, jest wykonywana za pomocą szyfrowania oprogramowania, a każda wielkość danych o wielkości 60 bajtów lub większej jest wykonywana za pomocą kryptografii sprzętowej. W przypadku szyfrów innych niż DES CBC, CFB, OFB i EBC, ta właściwość systemowa nie ma funkcji.

Poziom obcinania można dostosować, zmieniając właściwość systemową. Jeśli właściwość systemowa zostanie ustawiona na 0, wszystkie algorytmy szyfrowania DES CBC, CFB, OFB i ECB są wykonywane przy użyciu szyfrowania sprzętowego. Jeśli właściwość systemowa zostanie ustawiona na -1, wszystkie algorytmy szyfrowania DES CBC, CFB, OFB i ECB są wykonywane przy użyciu szyfrowania oprogramowania. Ta właściwość systemowa ma zastosowanie zarówno do algorytmu DES, jak i potrójnego DES CBC, CFB, OFB i przetwarzania przez EBC.

Porównywanie wielkości danych do poziomu obcinania odbywa się, gdy pierwsze dane są przekazywane do szyfru na potrzeby szyfrowania lub deszyfrowania. Na przykład można rozważyć aplikację, która deszyfruje zawartość taśmy, odczyjając każdy rekord, a następnie przekazując go do szyfru, zanim aplikacja odczyta następny rekord. W tym przypadku pierwszym rekordem, który jest przekazywany do obiektu szyfru, jest nagłówek taśmy. Jeśli nagłówek taśmy jest mniejszy niż bieżący poziom obcinania, to deszyfrowanie odbywa się za pomocą oprogramowania, mimo że kolejne rekordy mogą być bardzo duże. Jest to przypadek, w którym można wybrać ustawienie poziomu obcinania na 0, aby kryptografia sprzętowa była używana niezależnie od wielkości przetwarzanego pierwszego rekordu.

W poniższym przykładzie przedstawiono sposób ustawienia właściwości systemowej ibm.DES.usehdwr.size , gdy uruchamiany jest program Java™ o nazwie programName .

java -Dibm.DES.usehdwr.size=80 programName

Tę wartość można także programowo ustawić za pomocą metody Java System.setProperty() .