Útmutató a titkosítási osztályhoz

1. Áttekintés

Egyszerűen fogalmazva, a titkosítás egy olyan üzenet kódolásának folyamata, amelyet csak az engedélyezett felhasználók érthetnek meg vagy érhetnek el.

Az üzenet, a továbbiakban: egyszerű szöveg, titkosítási algoritmus segítségével van titkosítva - a rejtjel - generáló rejtjelezett szöveg amelyet csak az engedélyezett felhasználók tudnak dekódolással elolvasni.

Ebben a cikkben részletesen leírjuk a mag Rejtjel osztály, amely titkosítási és visszafejtési funkciókat biztosít Java-ban.

2. Cipher osztály

A Java kriptográfiai kiterjesztés (JCE) a a Java Cryptography Architecture (JCA) része amely kriptográfiai rejtjelekkel ellátott alkalmazást biztosít az adatok titkosításához és visszafejtéséhez, valamint a magánadatok kivonatolásához.

A Rejtjel osztály - a javax.crypto csomag - a JCE keretrendszer magját alkotja, biztosítva a titkosítás és a visszafejtés funkcióit.

2.1. Cipher Instantiation

Példaként a Rejtjel tárgy, mi hívja a statikus getInstance módszer, átadva a kért transzformáció nevét. Opcionálisan a szolgáltató neve is megadható.

Írjunk egy példa osztályt, amely szemlélteti az a példányosítását Rejtjel:

public class Encryptor {public byte [] encryptMessage (byte [] üzenet, byte [] keyBytes) dobja az InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException {Cipher cipher = Cipher.getInstance ("AES / ECB / PKCS5Padding"; // ...}}

Az átalakulás AES / ECB / PKCS5Padding mondja a getInstance módszer a Rejtjel objektum AES rejtjelként, az EKB működési módjával és a PKCS5 kitöltési sémával.

Pillanatképessé is tehetjük a Rejtjel objektumot csak az algoritmus megadásával az átalakításban:

Cipher rejtjel = Cipher.getInstance ("AES");

Ebben az esetben a Java szolgáltatóspecifikus alapértelmezett értékeket fog használni a módhoz és a kitöltési sémához.

Vegye figyelembe, hogy getInstance dobni fog a NoSuchAlgorithmException ha az átalakulás az nulla, üres vagy érvénytelen formátumú, vagy ha a szolgáltató nem támogatja.

Ez dob egy NoSuchPaddingException ha az átalakítás nem támogatott kitöltési sémát tartalmaz.

2.2. Menetbiztonság

A Rejtjel osztály állapotos, a belső szinkronizálás bármilyen formája nélkül. Ami azt illeti, olyan módszerek, mint benne() vagy frissítés () megváltoztatja egy adott személy belső állapotát Rejtjel példa.

Ezért a Rejtjel osztály nem szálbiztos. Tehát létre kellene hoznunk egyet Rejtjel titkosítási / visszafejtési szükségletenként.

2.3. Kulcsok

A Kulcs interfész a kriptográfiai műveletek kulcsait jelenti. A kulcsok átlátszatlan tárolók, amelyek kódolt kulcsot, a kulcs kódolási formátumát és kriptográfiai algoritmusát tartalmazzák.

A kulcsokat általában kulcsgenerátorok, tanúsítványok vagy kulcsgyártás segítségével lehet beszerezni.

Hozzunk létre egy szimmetrikus értéket Kulcs a mellékelt kulcs bájtokból:

SecretKey secretKey = new SecretKeySpec (keyBytes, "AES");

2.4. Cipher inicializálás

Hívjuk a benne() módszer a C inicializálásáraipher tárgy val,-vel Kulcs vagy Bizonyítvány és egy opmode jelezve a rejtjel működési módját.

Opcionálisan átadhatjuk a véletlenszerűség forrását. Alapértelmezés szerint a SecureRandom a legmagasabb prioritású telepített szolgáltató megvalósítását használják. Ellenkező esetben a rendszer által biztosított forrást használja.

Opcionálisan meghatározhatunk algoritmus-specifikus paramétereket. Például átadhatunk egy IvParameterSpec nak nek adjon meg egy inicializációs vektort.

Itt vannak az elérhető rejtjelezési módok:

  • ENCRYPT_MODE: inicializálás rejtjel objektum a titkosítási mód ellen
  • DECRYPT_MODE: inicializálás rejtjel kifogásolja a visszafejtési módot
  • WRAP_MODE: inicializálás rejtjel kifogásolja a kulcscsomagolási módot
  • UNWRAP_MODE: inicializálás rejtjel tiltakozzon a kulcs kibontásának módja ellen

Inicializáljuk a Rejtjel tárgy:

Cipher rejtjel = Cipher.getInstance ("AES / ECB / PKCS5Padding"); SecretKey secretKey = new SecretKeySpec (keyBytes, "AES"); cipher.init (Cipher.ENCRYPT_MODE, secretKey); // ...

Most a benne módszer dob egy InvalidKeyException ha a mellékelt kulcs nem megfelelő a titkosítás inicializálásához, például amikor a kulcs hossza / kódolása érvénytelen.

Akkor is dobják, ha a rejtjelhez megkövetelnek bizonyos algoritmusparamétereket, amelyeket a kulcsból nem lehet meghatározni, vagy ha a kulcs kulcsmérete meghaladja a maximálisan megengedett kulcsméretet (a JCE konfigurált Joghatósági házirend-fájljai határozzák meg).

Nézzünk meg egy példát az a használatával Bizonyítvány:

public byte [] encryptMessage (byte [] üzenet, tanúsítványtanúsítvány) InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException {Cipher cipher = Cipher.getInstance ("RSA / ECB / PKCS1Padding") dob; cipher.init (Cipher.ENCRYPT_MODE, tanúsítvány); // ...}

A Rejtjel objektum megszerzi a nyilvános kulcsot az adatok titkosításához a tanúsítványból a getPublicKey módszer.

2.5. Titkosítás és visszafejtés

A. Inicializálása után Rejtjel objektumnak hívjuk doFinal () módszer a titkosítási vagy visszafejtési művelet végrehajtására. Ez a módszer egy bájt tömböt ad vissza, amely tartalmazza a titkosított vagy visszafejtett üzenetet.

A doFinal () módszer is visszaállítja a Rejtjel kifogásolja azt az állapotot, amelyben korábban volt, amikor egy hívásra kezdeményezték benne() módszer, a Rejtjel elérhető objektum további üzenetek titkosításához vagy visszafejtéséhez.

Hívjuk doFinal miénkben encryptMessage módszer:

public byte [] encryptMessage (byte [] üzenet, byte [] keyBytes) dobja az InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException {Cipher cipher = Cipher.ESPadgetst (( SecretKey secretKey = new SecretKeySpec (keyBytes, "AES"); cipher.init (Cipher.ENCRYPT_MODE, secretKey); return cipher.doFinal (üzenet); }

A visszafejtési művelet végrehajtásához megváltoztatjuk a opmode nak nek DECRYPT_MODE:

public byte [] decryptMessage (byte [] encryptedMessage, byte [] keyBytes) dobja a NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException "Cipher Címkefájl = Cipher Cipherst = Cipher Címke SecretKey secretKey = new SecretKeySpec (keyBytes, "AES"); cipher.init (Cipher.DECRYPT_MODE, secretKey); return cipher.doFinal (encryptedMessage); }

2.6. Szolgáltatók

Szolgáltató-alapú architektúra használatára tervezték A JCE lehetővé teszi minősített kriptográfiai könyvtárak, például a BouncyCastle csatlakoztatását biztonsági szolgáltatóként és új algoritmusok zökkenőmentes hozzáadását.

Most adjuk hozzá a BouncyCastle-t biztonsági szolgáltatóként. Adhatunk biztonsági szolgáltatót statikusan vagy dinamikusan.

A BouncyCastle statikus hozzáadásához módosítjuk a java.biztonság fájl található / jre / lib / security mappába.

Hozzáadjuk a sort a lista végéhez:

... security.provider.4 = com.sun.net.ssl.internal.ssl.Provider security.provider.5 = com.sun.crypto.provider.SunJCE security.provider.6 = sun.security.jgss.SunProvider security.provider.7 = org.bouncycastle.jce.provider.BouncyCastleProvider

A szolgáltató tulajdonság hozzáadásakor a tulajdonságkulcs formátumú biztonság.szolgáltató.N ahol a szám N eggyel több, mint az utolsó a listán.

Dinamikusan hozzáadhatjuk a BouncyCastle biztonsági szolgáltatót is a biztonsági fájl módosítása nélkül:

Security.addProvider (új BouncyCastleProvider ());

Most már megadhatjuk a szolgáltatót a rejtjel inicializálása során:

Cipher rejtjel = Cipher.getInstance ("AES / ECB / PKCS5Padding", "BC");

időszámításunk előtt megadja a BouncyCastle szolgáltatót. A regisztrált szolgáltatók listáját a Security.getProviders () módszer.

3. A titkosítás és a visszafejtés tesztelése

Írjunk egy példa tesztet az üzenet titkosításának és visszafejtésének szemléltetésére.

Ebben a tesztben AES titkosítási algoritmust használunk 128 bites kulccsal, és azt állítjuk, hogy a visszafejtett eredmény megegyezik az eredeti üzenet szövegével:

@Test public void whenIsEncryptedAndDecrypted_thenDecryptedEqualsOriginal () dobja a Kivételt {String encryptionKeyString = "thisisa128bitkey"; String originalMessage = "Ez egy titkos üzenet"; byte [] encryptionKeyBytes = encryptionKeyString.getBytes (); Cipher rejtjel = Cipher.getInstance ("AES / ECB / PKCS5Padding"); SecretKey secretKey = new SecretKeySpec (encryptionKeyBytes, "AES"); cipher.init (Cipher.ENCRYPT_MODE, secretKey); byte [] encryptedMessageBytes = cipher.doFinal (message.getBytes ()); cipher.init (Cipher.DECRYPT_MODE, secretKey); bájt [] decryptedMessageBytes = cipher.doFinal (encryptedMessageBytes); assertThat (originalMessage) .isEqualTo (új karakterlánc (decryptedMessageBytes)); }

4. Következtetés

Ebben a cikkben megvitattuk a Rejtjel osztály és használati példákat mutatott be. További részletek a Rejtjel osztály és a JCE keretrendszer megtalálható az osztály dokumentációjában és a Java Cryptography Architecture (JCA) referencia útmutatóban.

Mindezen példák és kódrészletek megvalósítása található át a GitHubon. Ez egy Maven-alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.