Java Şifreleme - Hızlı Kılavuz

Kriptografi, bilgi güvenliği sağlayabilen bir şifreleme sistemi yapma sanatı ve bilimidir.

Kriptografi, dijital verilerin gerçek güvenliği ile ilgilenir. Temel bilgi güvenliği hizmetleri sağlayan matematiksel algoritmalara dayalı mekanizmaların tasarımını ifade eder. Kriptografiyi, güvenlik uygulamalarında farklı teknikleri içeren büyük bir araç setinin kurulması olarak düşünebilirsiniz.

Kriptanaliz nedir?

Şifreleme metnini kırma sanatı ve bilimi kriptanaliz olarak bilinir.

Kriptanaliz, kriptografinin kardeş dalıdır ve ikisi de bir arada bulunur. Kriptografik süreç, iletim veya depolama için şifre metniyle sonuçlanır. Onları kırmak amacıyla kriptografik mekanizmanın incelenmesini içerir. Kriptanaliz, yeni kriptografik tekniklerin tasarımı sırasında güvenlik güçlerini test etmek için de kullanılır.

Şifreleme İlkelleri

Kriptografi ilkelleri, bir dizi istenen güvenlik hizmetini sağlamak için seçilerek kullanılabilen Kriptografi araç ve tekniklerinden başka bir şey değildir -

  • Encryption
  • Hash fonksiyonları
  • Mesaj Doğrulama kodları (MAC)
  • Dijital imzalar

Java'da Kriptografi

Java Kriptografi Mimarisi (JCA), dijital imzalar, mesaj özetleri, sertifikalar, şifreleme, anahtar üretimi ve yönetimi ve güvenli rastgele sayı üretimi gibi modern şifreleme kavramlarını uygulamak için bir dizi API'dir.

JCA geliştiricileri kullanarak, içlerinde güvenliği entegre eden uygulamalarını oluşturabilirler.

Güvenliği karmaşık güvenlik algoritmalarına bağlı olmak yerine uygulamalarınıza entegre etmek için, gerekli hizmetler için JCA'da sağlanan ilgili API'leri kolayca arayabilirsiniz.

Karma işlevler son derece kullanışlıdır ve neredeyse tüm bilgi güvenliği uygulamalarında görünür.

Karma işlevi, sayısal bir giriş değerini başka bir sıkıştırılmış sayısal değere dönüştüren matematiksel bir işlevdir. Hash fonksiyonunun girdisi keyfi uzunluktadır ancak çıktı her zaman sabit uzunluktadır.

Karma işlevi tarafından döndürülen değerler çağrılır message digest ya da sadece hash values. Aşağıdaki resim hash fonksiyonunu göstermektedir.

Java adlı bir sınıf sağlar MessageDigestjava.security paketine aittir. Bu sınıf, rasgele uzunluktaki bir mesajı bir mesaj özetine dönüştürmek için SHA-1, SHA 256, MD5 algoritmaları gibi algoritmaları destekler.

Verilen bir mesajı bir mesaj özetine dönüştürmek için, aşağıda verilen adımları izleyin -

Adım 1: Bir MessageDigest nesnesi oluşturun

MessageDigest sınıfı, getInstance(). Bu yöntem, kullanılacak algoritmanın adını belirten bir String değişkenini kabul eder ve belirtilen algoritmayı uygulayan bir MessageDigest nesnesi döndürür.

Kullanarak MessageDigest nesnesi oluşturun getInstance() yöntemi aşağıda gösterildiği gibi.

MessageDigest md = MessageDigest.getInstance("SHA-256");

Adım 2: Verileri oluşturulan MessageDigest nesnesine aktarın

Mesaj özeti nesnesini oluşturduktan sonra, mesajı / verileri ona iletmeniz gerekir. Bunu kullanarak yapabilirsinizupdate() yöntemi MessageDigest sınıfında, bu yöntem mesajı temsil eden bir bayt dizisini kabul eder ve bunu yukarıda oluşturulan MessageDigest nesnesine ekler / iletir.

md.update(msg.getBytes());

3. Adım: Mesaj özetini oluşturun

Mesaj özetini kullanarak digest() yöntem MessageDigest sınıfı bu yöntem, geçerli nesne üzerindeki karma işlevini hesaplar ve ileti özetini bayt dizisi biçiminde döndürür.

Özet yöntemini kullanarak mesaj özetini oluşturun.

byte[] digest = md.digest();

Misal

Aşağıda, bir dosyadan verileri okuyan ve bir mesaj özeti oluşturan ve yazdıran bir örnek verilmiştir.

import java.security.MessageDigest;
import java.util.Scanner;

public class MessageDigestExample {
   public static void main(String args[]) throws Exception{
      //Reading data from user
      Scanner sc = new Scanner(System.in);
      System.out.println("Enter the message");
      String message = sc.nextLine();
	  
      //Creating the MessageDigest object  
      MessageDigest md = MessageDigest.getInstance("SHA-256");

      //Passing data to the created MessageDigest Object
      md.update(message.getBytes());
      
      //Compute the message digest
      byte[] digest = md.digest();      
      System.out.println(digest);  
     
      //Converting the byte array in to HexString format
      StringBuffer hexString = new StringBuffer();
      
      for (int i = 0;i<digest.length;i++) {
         hexString.append(Integer.toHexString(0xFF & digest[i]));
      }
      System.out.println("Hex format : " + hexString.toString());     
   }
}

Çıktı

Yukarıdaki program aşağıdaki çıktıyı üretir -

Enter the message
Hello how are you
[B@55f96302
Hex format: 2953d33828c395aebe8225236ba4e23fa75e6f13bd881b9056a3295cbd64d3

MAC (Mesaj Akimlik doğrulama Code) algoritması, mesaj kimlik doğrulamasını sağlamak için simetrik bir anahtar şifreleme tekniğidir. MAC sürecini oluşturmak için, gönderen ve alıcı simetrik bir K anahtarını paylaşır.

Esasen, bir MAC, mesaj kimlik doğrulamasını sağlamak için bir mesajla birlikte gönderilen temel mesaj üzerinde oluşturulan şifreli bir sağlama toplamıdır.

Kimlik doğrulama için MAC kullanma süreci aşağıdaki şekilde gösterilmektedir -

Java'da Mac sınıfı javax.cryptopaketi, mesaj kimlik doğrulama kodunun işlevselliğini sağlar. Bu sınıfı kullanarak ileti doğrulama kodu oluşturmak için aşağıda verilen adımları izleyin.

Adım 1: Bir KeyGenerator nesnesi oluşturun

KeyGenerator sınıf sağlar getInstance() gerekli anahtar oluşturma algoritmasını temsil eden bir String değişkenini kabul eden ve bir KeyGenerator gizli anahtarlar oluşturan nesne.

Oluşturmak KeyGenerator kullanarak nesne getInstance() yöntemi aşağıda gösterildiği gibi.

//Creating a KeyGenerator object
KeyGenerator keyGen = KeyGenerator.getInstance("DES");

Adım 2: SecureRandom nesnesi oluşturun

SecureRandom sınıfı java.Securitypaketi, Java'da rasgele sayılar üretmek için kullanılan güçlü bir rasgele sayı üreteci sağlar. Bu sınıfı aşağıda gösterildiği gibi örnekleyin.

//Creating a SecureRandom object
SecureRandom secRandom = new SecureRandom();

3. Adım: KeyGenerator'ü başlatın

KeyGenerator sınıf adlı bir yöntem sağlar init() bu yöntem kabul eder SecureRandom nesneyi ve akımı başlatır KeyGenerator.

Bu yöntemi kullanarak önceki adımda oluşturulan KeyGenerator nesnesini başlatın.

//Initializing the KeyGenerator
keyGen.init(secRandom);

4. Adım: Anahtar oluşturun

Kullanarak anahtar oluştur generateKey() yöntemi KeyGenerator aşağıda gösterildiği gibi sınıf.

//Creating/Generating a key
Key key = keyGen.generateKey();

Adım 5: Mac nesnesini başlatın

init() Mac sınıfının yöntemi bir Key nesnesini kabul eder ve verilen anahtarı kullanarak geçerli Mac nesnesini başlatır.

//Initializing the Mac object
mac.init(key);

6. Adım: Mac işlemini tamamlayın

doFinal()Mac sınıfının yöntemi, Mac işlemini bitirmek için kullanılır. Gerekli verileri bayt dizisi şeklinde bu yönteme iletin ve aşağıda gösterildiği gibi işlemi tamamlayın.

//Computing the Mac
String msg = new String("Hi how are you");
byte[] bytes = msg.getBytes();
byte[] macResult = mac.doFinal(bytes);

Misal

Aşağıdaki örnek, JCA kullanılarak İleti Kimlik Doğrulama Kodunun (MAC) oluşturulmasını gösterir. Burada, basit bir "Merhaba nasılsın" mesajı alıyoruz ve bu mesaj için bir Mac oluşturuyoruz.

import java.security.Key;
import java.security.SecureRandom;

import javax.crypto.KeyGenerator;
import javax.crypto.Mac;

public class MacSample {
   public static void main(String args[]) throws Exception{
      //Creating a KeyGenerator object
      KeyGenerator keyGen = KeyGenerator.getInstance("DES");

      //Creating a SecureRandom object
      SecureRandom secRandom = new SecureRandom();

      //Initializing the KeyGenerator
      keyGen.init(secRandom);

      //Creating/Generating a key
      Key key = keyGen.generateKey();	 

      //Creating a Mac object
      Mac mac = Mac.getInstance("HmacSHA256");

      //Initializing the Mac object
      mac.init(key);

      //Computing the Mac
      String msg = new String("Hi how are you");
      byte[] bytes = msg.getBytes();      
      byte[] macResult = mac.doFinal(bytes);

      System.out.println("Mac result:");
      System.out.println(new String(macResult));     
   }
}

Çıktı

Yukarıdaki program aşağıdaki çıktıyı üretecektir -

Mac result:
HÖ„^ǃÎ_Utbh…?š_üzØSSÜh_ž_œa0ŽV?

Bir şifreleme sistemi, bilgi güvenliği hizmetleri sağlamak için şifreleme tekniklerinin ve bunlara eşlik eden altyapının bir uygulamasıdır. Bir şifreleme sistemine aynı zamandacipher system.

Temel bir şifreleme sisteminin çeşitli bileşenleri şunlardır: Plaintext, Encryption Algorithm, Ciphertext, Decryption Algorithm, Şifreleme Anahtarı ve Şifre Çözme Anahtarı.

Nerede,

  • Encryption Keygönderen tarafından bilinen bir değerdir. Gönderen, şifreleme metnini hesaplamak için şifreleme anahtarını şifreleme algoritmasına düz metinle birlikte girer.

  • Decryption Keyalıcı tarafından bilinen bir değerdir. Şifre çözme anahtarı, şifreleme anahtarıyla ilgilidir, ancak her zaman onunla aynı değildir. Alıcı, düz metni hesaplamak için şifre çözme anahtarını şifre metni ile birlikte şifre çözme algoritmasına girer.

Temel olarak, şifreleme-şifre çözme algoritmalarının türüne bağlı olarak iki tür anahtar / şifreleme sistemi vardır.

Simetrik Anahtar Şifreleme

Şifreleme işlemi nerede same keys are used for encrypting and decrypting bilgiler Simetrik Anahtar Şifreleme olarak bilinir.

Simetrik şifreleme sistemlerinin çalışmasına şu şekilde atıfta bulunulur: symmetric cryptography. Simetrik şifreleme sistemleri bazen şu şekilde anılır:secret key cryptosystems.

Aşağıda, simetrik anahtar şifrelemenin birkaç yaygın örneği verilmiştir -

  • Dijital Şifreleme Standardı (DES)
  • Üçlü DES (3DES)
  • IDEA
  • BLOWFISH

Asimetrik Anahtar Şifreleme

Şifreleme işlemi nerede different keys are used for encrypting and decrypting the informationAsimetrik Anahtar Şifreleme olarak bilinir. Anahtarlar farklı olsalar da matematiksel olarak ilişkilidirler ve bu nedenle şifreli metnin şifresini çözerek düz metne ulaşmak mümkündür.

Kullanılan / üretilen anahtarlar ve sertifikalar, anahtar deposu adı verilen bir veri tabanında saklanır. Varsayılan olarak bu veritabanı, adında bir dosyada saklanır..keystore.

Bu veritabanının içeriğine, KeyStore sınıfı java.securitypaketi. Bu, PrivateKeyEntry, SecretKeyEntry, TrustedCertificateEntry olmak üzere üç farklı girişi yönetir.

  • PrivateKeyEntry
  • SecretKeyEntry
  • TrustedCertificateEntry

Anahtar deposunda bir Anahtar saklama

Bu bölümde, bir anahtar deposunda bir anahtarın nasıl saklanacağını öğreneceğiz. Anahtar deposunda bir anahtar saklamak için aşağıda verilen adımları izleyin.

1. Adım: Bir KeyStore nesnesi oluşturun

getInstance() yöntemi KeyStore sınıfı java.security paket, anahtar deposu türünü temsil eden bir dize değerini kabul eder ve bir KeyStore nesnesi döndürür.

Kullanarak KeyStore sınıfının bir nesnesini oluşturun. getInstance() yöntemi aşağıda gösterildiği gibi.

//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");

2. Adım: KeyStore nesnesini yükleyin

load() KeyStore sınıfının yöntemi, anahtar deposu dosyasını temsil eden bir FileInputStream nesnesini ve KeyStore şifresini belirten bir String parametresini kabul eder.

Genel olarak, Anahtar Deposu adlı dosyada saklanır cacerts, konumda C:/Program Files/Java/jre1.8.0_101/lib/security/ ve varsayılan şifresi changeit, kullanarak yükleyin load() yöntemi aşağıda gösterildiği gibi.

//Loading the KeyStore object
char[] password = "changeit".toCharArray();
String path = "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts";
java.io.FileInputStream fis = new FileInputStream(path);
keyStore.load(fis, password);

3. Adım: KeyStore.ProtectionParameter nesnesini oluşturun

KeyStore.ProtectionParameter öğesini aşağıda gösterildiği gibi örnekleyin.

//Creating the KeyStore.ProtectionParameter object
KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);

Adım 4: Bir SecretKey nesnesi oluşturun

Oluştur SecretKey (arabirim) nesnesi, Sub sınıfını başlatarak SecretKeySpec. Örnek oluştururken, aşağıda gösterildiği gibi yapıcısına parametre olarak şifre ve algoritma geçirmeniz gerekir.

//Creating SecretKey object
SecretKey mySecretKey = new SecretKeySpec(new String(keyPassword).getBytes(), "DSA");

Adım 5: Bir SecretKeyEntry nesnesi oluşturun

Bir nesneyi oluşturun SecretKeyEntry sınıfı geçerek SecretKey yukarıdaki adımda oluşturulan nesne aşağıda gösterildiği gibi.

//Creating SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);

6. Adım: KeyStore'a bir giriş ayarlayın

setEntry() yöntemi KeyStore sınıfı, anahtar deposu giriş diğer adını temsil eden bir String parametresi kabul eder, bir SecretKeyEntry nesne, bir ProtectionParameter nesnesi ve girişi verilen diğer ad altında depolar.

Girişi kullanarak anahtar deposu için ayarlayın. setEntry() yöntemi aşağıda gösterildiği gibi.

//Set the entry to the keystore
keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);

Example

Aşağıdaki örnek, anahtarları "cacerts" dosyasında (Windows 10 işletim sistemi) bulunan anahtar deposunda saklar.

import java.io.FileInputStream;
import java.security.KeyStore;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class StoringIntoKeyStore{
   public static void main(String args[]) throws Exception {
      //Creating the KeyStore object
      KeyStore keyStore = KeyStore.getInstance("JCEKS");

      //Loading the KeyStore object
      char[] password = "changeit".toCharArray();
      String path = "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts";
      java.io.FileInputStream fis = new FileInputStream(path);
      keyStore.load(fis, password);
      
      //Creating the KeyStore.ProtectionParameter object
      KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);

      //Creating SecretKey object
      SecretKey mySecretKey = new SecretKeySpec("myPassword".getBytes(), "DSA");
      
      //Creating SecretKeyEntry object
      KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);
      keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);

      //Storing the KeyStore object
      java.io.FileOutputStream fos = null;
      fos = new java.io.FileOutputStream("newKeyStoreName");
      keyStore.store(fos, password);
      System.out.println("data stored");
   }
}

Output

Yukarıdaki program aşağıdaki çıktıyı üretir -

System.out.println("data stored");

Bu bölümde, Java Cryptography kullanarak anahtar deposundan bir anahtarın nasıl alınacağını öğreneceğiz.

Anahtar deposundan bir anahtar almak için aşağıda verilen adımları izleyin.

1. Adım: Bir KeyStore nesnesi oluşturun

getInstance() yöntemi KeyStore sınıfı java.security paket, anahtar deposu türünü temsil eden bir dize değerini kabul eder ve bir KeyStore nesnesi döndürür.

Aşağıda gösterildiği gibi bu yöntemi kullanarak KeyStore sınıfının bir nesnesini oluşturun.

//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");

2. Adım: KeyStore nesnesini yükleyin

load() KeyStore sınıfının yöntemi bir FileInputStream anahtar deposu dosyasını temsil eden nesne ve KeyStore şifresini belirten bir String parametresi.

Genel olarak, Anahtar Deposu adlı dosyada saklanır cacerts, konumda C:/Program Files/Java/jre1.8.0_101/lib/security/ ve varsayılan şifresi changeit, kullanarak yükleyin load() yöntemi aşağıda gösterildiği gibi.

//Loading the KeyStore object
char[] password = "changeit".toCharArray();
String path = "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts";
java.io.FileInputStream fis = new FileInputStream(path);
keyStore.load(fis, password);

3. Adım: KeyStore.ProtectionParameter nesnesini oluşturun

KeyStore.ProtectionParameter öğesini aşağıda gösterildiği gibi örnekleyin.

//Creating the KeyStore.ProtectionParameter object
KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);

Adım 4: Bir SecretKey nesnesi oluşturun

Oluştur SecretKey (arabirim) nesnesi, Sub sınıfını başlatarak SecretKeySpec. Örnek oluştururken, aşağıda gösterildiği gibi yapıcısına parametre olarak şifre ve algoritma geçirmeniz gerekir.

//Creating SecretKey object
SecretKey mySecretKey = new SecretKeySpec(new String(keyPassword).getBytes(), "DSA");

Adım 5: Bir SecretKeyEntry nesnesi oluşturun

Bir nesneyi oluşturun SecretKeyEntry sınıfı geçerek SecretKey yukarıdaki adımda oluşturulan nesne aşağıda gösterildiği gibi.

//Creating SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);

6.Adım: KeyStore'a bir giriş ayarlayın

setEntry() yöntemi KeyStore sınıfı, anahtar deposu giriş diğer adını temsil eden bir String parametresi kabul eder, bir SecretKeyEntry nesne, bir ProtectionParameter nesnesi ve girişi verilen diğer ad altında depolar.

Girişi kullanarak anahtar deposu için ayarlayın. setEntry() yöntemi aşağıda gösterildiği gibi.

//Set the entry to the keystore
keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);

Adım 7: KeyStore.SecretKeyEntry nesnesini oluşturun

getEntry() KeyStore sınıfının yöntemi, bir diğer adı (String parametresi) ve ProtectionParameter sınıfının bir nesnesini parametre olarak kabul eder ve bir KeyStoreEntry nesne, sonra bunu içine atabilirsiniz KeyStore.SecretKeyEntry nesne.

Gerekli anahtar ve önceki adımlarda oluşturulan koruma parametresi nesnesi için takma adı ileterek KeyStore.SecretKeyEntry sınıfının bir nesnesini oluşturun. getEntry() yöntemi aşağıda gösterildiği gibi.

//Creating the KeyStore.SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEnt = (KeyStore.SecretKeyEntry)keyStore.getEntry("secretKeyAlias", protectionParam);

Adım 8: Alınan girişin anahtar nesnesini oluşturun

getSecretKey() yöntemi SecretKeyEntryclass bir SecretKey nesnesi döndürür. Bu yöntemi kullanarak aşağıda gösterildiği gibi bir SecretKey nesnesi oluşturun.

//Creating SecretKey object
SecretKey mysecretKey = secretKeyEnt.getSecretKey();      
System.out.println(mysecretKey);

Misal

Aşağıdaki örnek, bir anahtar deposundan anahtarların nasıl alınacağını gösterir. Burada, "cacerts" dosyasında (Windows 10 işletim sistemi) bulunan bir anahtar deposunda bir anahtar saklıyoruz, onu alıyor ve anahtarı oluşturmak için kullanılan algoritma ve formatı gibi bazı özelliklerini görüntülüyoruz. alınan anahtar.

import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.KeyStore.ProtectionParameter;
import java.security.KeyStore.SecretKeyEntry;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class RetrievingFromKeyStore{
   public static void main(String args[]) throws Exception{
      //Creating the KeyStore object
      KeyStore keyStore = KeyStore.getInstance("JCEKS");

      //Loading the the KeyStore object
      char[] password = "changeit".toCharArray();
      java.io.FileInputStream fis = new FileInputStream(
         "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts");
      
      keyStore.load(fis, password);
      
      //Creating the KeyStore.ProtectionParameter object
      ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);

      //Creating SecretKey object
      SecretKey mySecretKey = new SecretKeySpec("myPassword".getBytes(), "DSA");
      
      //Creating SecretKeyEntry object
      SecretKeyEntry secretKeyEntry = new SecretKeyEntry(mySecretKey);
      keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);

      //Storing the KeyStore object
      java.io.FileOutputStream fos = null;
      fos = new java.io.FileOutputStream("newKeyStoreName");
      keyStore.store(fos, password);
      
      //Creating the KeyStore.SecretKeyEntry object
      SecretKeyEntry secretKeyEnt = (SecretKeyEntry)keyStore.getEntry("secretKeyAlias", protectionParam);

      //Creating SecretKey object
      SecretKey mysecretKey = secretKeyEnt.getSecretKey();      
      System.out.println("Algorithm used to generate key : "+mysecretKey.getAlgorithm());   
      System.out.println("Format used for the key: "+mysecretKey.getFormat());
   }
}

Çıktı

Yukarıdaki program aşağıdaki çıktıyı üretir -

Algorithm used to generate key: DSA
Format of the key: RAW

Java sağlar KeyGenerator sınıf, bu sınıf gizli anahtarlar oluşturmak için kullanılır ve bu sınıfın nesneleri yeniden kullanılabilir.

KeyGenerator sınıfını kullanarak anahtarlar oluşturmak için aşağıda verilen adımları izleyin.

Adım 1: Bir KeyGenerator nesnesi oluşturun

KeyGenerator sınıf sağlar getInstance() gerekli anahtar oluşturma algoritmasını temsil eden bir String değişkenini kabul eden ve gizli anahtarlar oluşturan bir KeyGenerator nesnesi döndüren yöntem.

Oluşturmak KeyGenerator kullanarak nesne getInstance() yöntemi aşağıda gösterildiği gibi.

//Creating a KeyGenerator object
KeyGenerator keyGen = KeyGenerator.getInstance("DES");

Adım 2: SecureRandom nesnesi oluşturun

SecureRandom sınıfı java.Securitypaketi, Java'da rasgele sayılar üretmek için kullanılan güçlü bir rasgele sayı üreteci sağlar. Bu sınıfı aşağıda gösterildiği gibi örnekleyin.

//Creating a SecureRandom object
SecureRandom secRandom = new SecureRandom();

3. Adım: KeyGenerator'ü başlatın

KeyGenerator sınıf adlı bir yöntem sağlar init() bu yöntem SecureRandom nesnesini kabul eder ve mevcut KeyGenerator.

Önceki adımda oluşturulan KeyGenerator nesnesini init() yöntem.

//Initializing the KeyGenerator
keyGen.init(secRandom);

Misal

Aşağıdaki örnek, anahtarın KeyGenerator sınıfını kullanarak gizli anahtarın anahtar üretimini gösterir. javax.crypto paketi.

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;

import java.security.Key;
import java.security.SecureRandom;

public class KeyGeneratorExample {
   public static void main(String args[]) throws Exception{
      //Creating a KeyGenerator object
      KeyGenerator keyGen = KeyGenerator.getInstance("DES");
      
      //Creating a SecureRandom object
      SecureRandom secRandom = new SecureRandom();
      
      //Initializing the KeyGenerator
      keyGen.init(secRandom);
      
      //Creating/Generating a key
      Key key = keyGen.generateKey();
      
      System.out.println(key);      
      Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");      
      cipher.init(cipher.ENCRYPT_MODE, key);      

      String msg = new String("Hi how are you");
      byte[] bytes = cipher.doFinal(msg.getBytes());      
      System.out.println(bytes);      
   }
}

Çıktı

Yukarıdaki program aşağıdaki çıktıyı üretir -

com.sun.crypto.provider.DESKey@18629
[B@2ac1fdc4

Java, KeyPairGeneratorsınıf. Bu sınıf, genel ve özel anahtar çiftleri oluşturmak için kullanılır. Kullanarak anahtarlar oluşturmak içinKeyPairGenerator sınıf, aşağıda verilen adımları izleyin.

Adım 1: Bir KeyPairGenerator nesnesi oluşturun

KeyPairGenerator sınıf sağlar getInstance() gerekli anahtar oluşturma algoritmasını temsil eden bir String değişkenini kabul eden ve anahtarları oluşturan bir KeyPairGenerator nesnesi döndüren yöntem.

Oluşturmak KeyPairGenerator kullanarak nesne getInstance() yöntemi aşağıda gösterildiği gibi.

//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");

Adım 2: KeyPairGenerator nesnesini başlatın

KeyPairGenerator sınıf adlı bir yöntem sağlar initialize()bu yöntem, anahtar çifti üretecini başlatmak için kullanılır. Bu yöntem, anahtar boyutunu temsil eden bir tamsayı değerini kabul eder.

Aşağıda gösterildiği gibi bu yöntemi kullanarak önceki adımda oluşturulan KeyPairGenerator nesnesini başlatın.

//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);

3. Adım: KeyPairGenerator'ü oluşturun

Sen üretebilirsin KeyPair kullanmak generateKeyPair() yöntemi KeyPairGeneratorsınıf. Aşağıda gösterildiği gibi bu yöntemi kullanarak anahtar çiftini oluşturun.

//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();

4. Adım: Özel anahtarı / genel anahtarı alın

Özel anahtarı, oluşturulan KeyPair nesnesinden, getPrivate() yöntemi aşağıda gösterildiği gibi.

//Getting the private key from the key pair
PrivateKey privKey = pair.getPrivate();

Ortak anahtarı, oluşturulan KeyPair nesnesinden, getPublic() yöntemi aşağıda gösterildiği gibi.

//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();

Misal

Aşağıdaki örnek, anahtarın KeyPairGenerator sınıfı kullanılarak gizli anahtarın anahtar üretimini gösterir. javax.crypto paketi.

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;

public class KeyPairGenertor {
   public static void main(String args[]) throws Exception{
      //Creating KeyPair generator object
      KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
      
      //Initializing the KeyPairGenerator
      keyPairGen.initialize(2048);
      
      //Generating the pair of keys
      KeyPair pair = keyPairGen.generateKeyPair();
      
      //Getting the private key from the key pair
      PrivateKey privKey = pair.getPrivate();   
      
      //Getting the public key from the key pair
      PublicKey publicKey = pair.getPublic(); 
      System.out.println("Keys generated");
   }
}

Çıktı

Yukarıdaki program aşağıdaki çıktıyı üretir -

Keys generated

Dijital imzalar, yazarı, imzaların tarihini ve saatini doğrulamamıza, mesaj içeriğini doğrulamamıza izin verir. Ayrıca, ek özellikler için kimlik doğrulama işlevi içerir.

Dijital imzanın avantajları

Bu bölümde dijital imza kullanımını gerektiren farklı nedenleri öğreneceğiz. İletişime dijital imzalar uygulamak için birkaç neden vardır -

Doğrulama

Dijital imzalar, mesaj kaynaklarının doğrulanmasına yardımcı olur. Örneğin, bir bankanın şubesi merkez ofise bir hesap bakiyesinde değişiklik talep eden bir mesaj gönderirse. Merkez ofis bu mesajın yetkili bir kaynaktan gönderildiğini doğrulayamazsa, bu tür bir talebin yerine getirilmesi büyük bir hata olabilir.

Bütünlük

Mesaj imzalandıktan sonra, mesajdaki herhangi bir değişiklik imzayı geçersiz kılar.

Reddetmeme

Bu özellik sayesinde, bazı bilgileri imzalayan herhangi bir kuruluş, daha sonra bu bilgileri imzaladığını reddedemez.

Dijital imzayı yaratmak

Şimdi nasıl dijital imza oluşturacağımızı öğrenelim. Aşağıda verilen adımları izleyerek Java kullanarak dijital imza oluşturabilirsiniz.

Adım 1: Bir KeyPairGenerator nesnesi oluşturun

KeyPairGenerator sınıf sağlar getInstance() gerekli anahtar oluşturma algoritmasını temsil eden bir String değişkenini kabul eden ve anahtarları oluşturan bir KeyPairGenerator nesnesi döndüren yöntem.

Oluşturmak KeyPairGenerator kullanarak nesne getInstance() yöntemi aşağıda gösterildiği gibi.

//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");

Adım 2: KeyPairGenerator nesnesini başlatın

KeyPairGenerator sınıf adlı bir yöntem sağlar initialize()bu yöntem, anahtar çifti üretecini başlatmak için kullanılır. Bu yöntem, anahtar boyutunu temsil eden bir tamsayı değerini kabul eder.

Önceki adımda oluşturulan KeyPairGenerator nesnesini initialize() yöntemi aşağıda gösterildiği gibi.

//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);

3. Adım: KeyPairGenerator'ü oluşturun

Sen üretebilirsin KeyPair kullanmak generateKeyPair()yöntem. Anahtar çiftini kullanarakgenerateKeyPair() yöntemi aşağıda gösterildiği gibi.

//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();

4. Adım: Çiftten özel anahtarı alın

Özel anahtarı, oluşturulan KeyPair nesnesinden, getPrivate() yöntem.

Özel anahtarı kullanarak getPrivate() yöntemi aşağıda gösterildiği gibi.

//Getting the private key from the key pair
PrivateKey privKey = pair.getPrivate();

Adım 5: Bir imza nesnesi oluşturun

getInstance() yöntemi Signature class, gerekli imza algoritmasını temsil eden bir dize parametresini kabul eder ve ilgili Signature nesnesini döndürür.

Signature sınıfının bir nesnesini, getInstance() yöntem.

//Creating a Signature object
Signature sign = Signature.getInstance("SHA256withDSA");

6. Adım: İmza nesnesini başlatın

initSign() Signature sınıfının yöntemi bir PrivateKey nesnesini oluşturur ve geçerli İmza nesnesini başlatır.

Önceki adımda oluşturulan İmza nesnesini initSign() yöntemi aşağıda gösterildiği gibi.

//Initialize the signature
sign.initSign(privKey);

7. Adım: Signature nesnesine veri ekleyin

update() Signature sınıfının yöntemi, imzalanacak veya doğrulanacak verileri temsil eden bir bayt dizisini kabul eder ve mevcut nesneyi verilen verilerle günceller.

İmzalanacak verileri şu adrese ileterek başlatılmış İmza nesnesini güncelleyin. update() yöntemi aşağıda gösterildiği gibi bayt dizisi biçiminde.

byte[] bytes = "Hello how are you".getBytes();      

//Adding data to the signature
sign.update(bytes);

8. Adım: İmzayı Hesaplayın

sign() yöntemi Signature class, güncellenen verilerin imza baytlarını döndürür.

İmzayı kullanarak hesaplayın. sign() yöntemi aşağıda gösterildiği gibi.

//Calculating the signature
byte[] signature = sign.sign();

Example

Aşağıdaki Java programı, kullanıcıdan gelen bir mesajı kabul eder ve verilen mesaj için dijital bir imza oluşturur.

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.Signature;
import java.util.Scanner;

public class CreatingDigitalSignature {
   public static void main(String args[]) throws Exception {
      //Accepting text from user
      Scanner sc = new Scanner(System.in);
      System.out.println("Enter some text");
      String msg = sc.nextLine();
      
      //Creating KeyPair generator object
      KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
      
      //Initializing the key pair generator
      keyPairGen.initialize(2048);
      
      //Generate the pair of keys
      KeyPair pair = keyPairGen.generateKeyPair();
      
      //Getting the private key from the key pair
      PrivateKey privKey = pair.getPrivate();
      
      //Creating a Signature object
      Signature sign = Signature.getInstance("SHA256withDSA");
      
      //Initialize the signature
      sign.initSign(privKey);
      byte[] bytes = "msg".getBytes();
      
      //Adding data to the signature
      sign.update(bytes);
      
      //Calculating the signature
      byte[] signature = sign.sign();
      
      //Printing the signature
      System.out.println("Digital signature for given text: "+new String(signature, "UTF8"));
   }
}

Output

Yukarıdaki program aşağıdaki çıktıyı üretir -

Enter some text
Hi how are you
Digital signature for given text: 0=@gRD???-?.???? /yGL?i??a!?

Java kullanarak dijital imza oluşturabilir ve aşağıda verilen adımları izleyerek doğrulayabilirsiniz.

Adım 1: Bir KeyPairGenerator nesnesi oluşturun

KeyPairGenerator sınıf sağlar getInstance() gerekli anahtar oluşturma algoritmasını temsil eden bir String değişkenini kabul eden ve anahtarları oluşturan bir KeyPairGenerator nesnesi döndüren yöntem.

Oluşturmak KeyPairGenerator kullanarak nesne getInstance() yöntemi aşağıda gösterildiği gibi.

//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");

Adım 2: KeyPairGenerator nesnesini başlatın

KeyPairGenerator sınıf adlı bir yöntem sağlar initialize()yöntem. Bu yöntem, anahtar çifti üretecini başlatmak için kullanılır. Bu yöntem, anahtar boyutunu temsil eden bir tamsayı değerini kabul eder.

Önceki adımda oluşturulan KeyPairGenerator nesnesini initialize() yöntemi aşağıda gösterildiği gibi.

//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);

3. Adım: KeyPairGenerator'ü oluşturun

Sen üretebilirsin KeyPair kullanmak generateKeyPair()yöntem. Aşağıda gösterildiği gibi bu yöntemi kullanarak anahtar çiftini oluşturun.

//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();

4. Adım: Çiftten özel anahtarı alın

Özel anahtarı, oluşturulan KeyPair nesnesinden, getPrivate() yöntem.

Özel anahtarı kullanarak getPrivate() yöntemi aşağıda gösterildiği gibi.

//Getting the private key from the key pair
PrivateKey privKey = pair.getPrivate();

Adım 5: Bir imza nesnesi oluşturun

getInstance() yöntemi Signature class, gerekli imza algoritmasını temsil eden bir dize parametresini kabul eder ve ilgili Signature nesnesini döndürür.

Signature sınıfının bir nesnesini, getInstance() yöntem.

//Creating a Signature object
Signature sign = Signature.getInstance("SHA256withDSA");

6. Adım: İmza nesnesini başlatın

initSign() Signature sınıfının yöntemi bir PrivateKey nesnesini oluşturur ve geçerli İmza nesnesini başlatır.

Önceki adımda oluşturulan İmza nesnesini initSign() yöntemi aşağıda gösterildiği gibi.

//Initialize the signature
sign.initSign(privKey);

7. Adım: Signature nesnesine veri ekleyin

update() Signature sınıfının yöntemi, imzalanacak veya doğrulanacak verileri temsil eden bir bayt dizisini kabul eder ve mevcut nesneyi verilen verilerle günceller.

İmzalanacak verileri şu adrese ileterek başlatılmış İmza nesnesini güncelleyin. update() yöntemi aşağıda gösterildiği gibi bayt dizisi biçiminde.

byte[] bytes = "Hello how are you".getBytes();      

//Adding data to the signature
sign.update(bytes);

8. Adım: İmzayı Hesaplayın

sign() yöntemi Signature class, güncellenen verilerin imza baytlarını döndürür.

Sign () yöntemini kullanarak aşağıda gösterildiği gibi İmzayı hesaplayın.

//Calculating the signature
byte[] signature = sign.sign();

Adım 9: Doğrulama için imza nesnesini başlatın

Bir İmza nesnesini doğrulamak için önce onu kullanarak başlatmanız gerekir. initVerify() yöntem BT yöntemi kabul eder PublicKey nesne.

Bu nedenle, İmza nesnesini doğrulama için initVerify() yöntemi aşağıda gösterildiği gibi.

//Initializing the signature
sign.initVerify(pair.getPublic());

10. Adım: Doğrulanacak verileri güncelleyin

Aşağıda gösterilen güncelleme yöntemini kullanarak doğrulanacak verilerle başlatılmış (doğrulama için) nesneyi güncelleyin.

//Update the data to be verified
sign.update(bytes);

11. Adım: İmzayı Doğrulayın

verify()Signature sınıfının yöntemi başka bir imza nesnesini kabul eder ve bunu mevcut olanla doğrular. Bir eşleşme olursa, doğru, aksi takdirde yanlış döndürür.

Aşağıda gösterildiği gibi bu yöntemi kullanarak imzayı doğrulayın.

//Verify the signature
boolean bool = sign.verify(signature);

Misal

Aşağıdaki Java programı, kullanıcıdan gelen bir mesajı kabul eder, verilen mesaj için dijital bir imza oluşturur ve bunu doğrular.

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.Signature;

import java.util.Scanner;

public class SignatureVerification {
   public static void main(String args[]) throws Exception{
      //Creating KeyPair generator object
      KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
	      
      //Initializing the key pair generator
      keyPairGen.initialize(2048);
	      
      //Generate the pair of keys
      KeyPair pair = keyPairGen.generateKeyPair();
      
      //Getting the privatekey from the key pair
      PrivateKey privKey = pair.getPrivate();

      //Creating a Signature object
      Signature sign = Signature.getInstance("SHA256withDSA");

      //Initializing the signature
      sign.initSign(privKey);
      byte[] bytes = "Hello how are you".getBytes();
      
      //Adding data to the signature
      sign.update(bytes);
      
      //Calculating the signature
      byte[] signature = sign.sign();      
      
      //Initializing the signature
      sign.initVerify(pair.getPublic());
      sign.update(bytes);
      
      //Verifying the signature
      boolean bool = sign.verify(signature);
      
      if(bool) {
         System.out.println("Signature verified");   
      } else {
         System.out.println("Signature failed");
      }
   }
}

Çıktı

Yukarıdaki program aşağıdaki çıktıyı üretir -

Signature verified

Verilen verileri, Cipher sınıfını kullanarak şifreleyebilirsiniz. javax.cryptopaketi. Java kullanarak verilen verileri şifrelemek için aşağıdaki adımları izleyin.

Adım 1: Bir KeyPairGenerator nesnesi oluşturun

KeyPairGenerator sınıf sağlar getInstance() gerekli anahtar oluşturma algoritmasını temsil eden bir String değişkenini kabul eden ve anahtarları oluşturan bir KeyPairGenerator nesnesi döndüren yöntem.

Oluşturmak KeyPairGenerator kullanarak nesne getInstance() yöntemi aşağıda gösterildiği gibi.

//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");

Adım 2: KeyPairGenerator nesnesini başlatın

KeyPairGenerator sınıf adlı bir yöntem sağlar initialize()bu yöntem, anahtar çifti üretecini başlatmak için kullanılır. Bu yöntem, anahtar boyutunu temsil eden bir tamsayı değerini kabul eder.

Önceki adımda oluşturulan KeyPairGenerator nesnesini initialize() yöntemi aşağıda gösterildiği gibi.

//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);

3. Adım: KeyPairGenerator'ü oluşturun

Sen üretebilirsin KeyPair kullanmak generateKeyPair() yöntemi KeyPairGeneratorsınıf. Aşağıda gösterildiği gibi bu yöntemi kullanarak anahtar çiftini oluşturun.

//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();

4. Adım: Genel anahtarı alın

Genel anahtarı oluşturulan KeyPair kullanarak nesne getPublic() yöntemi aşağıda gösterildiği gibi.

Aşağıda gösterildiği gibi bu yöntemi kullanarak genel anahtarı alın.

//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();

5. Adım: Bir Cipher nesnesi oluşturun

getInstance() yöntemi Cipher class, gerekli dönüşümü temsil eden bir String değişkenini kabul eder ve verilen dönüşümü uygulayan bir Cipher nesnesi döndürür.

Cipher nesnesini oluşturun. getInstance() yöntemi aşağıda gösterildiği gibi.

//Creating a Cipher object
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

Adım 6: Cipher nesnesini başlatın

init() yöntemi Cipher sınıfı, iki parametreyi, işlem modunu (şifreleme / şifre çözme) temsil eden bir tamsayı parametresi ve genel anahtarı temsil eden bir Anahtar nesnesi kabul eder.

Cypher nesnesini şu şekilde başlatın: init() yöntemi aşağıda gösterildiği gibi.

//Initializing a Cipher object
cipher.init(Cipher.ENCRYPT_MODE, publicKey);

7. Adım: Cipher nesnesine veri ekleyin

update() Cipher sınıfının yöntemi, şifrelenecek veriyi temsil eden bir bayt dizisini kabul eder ve mevcut nesneyi verilen verilerle günceller.

Verileri, başlatılan Cipher nesnesini update() yöntemi aşağıda gösterildiği gibi bayt dizisi biçiminde.

//Adding data to the cipher
byte[] input = "Welcome to Tutorialspoint".getBytes();	  
cipher.update(input);

8. Adım: Verileri şifreleyin

doFinal()Cipher sınıfının yöntemi şifreleme işlemini tamamlar. Bu nedenle, aşağıda gösterildiği gibi bu yöntemi kullanarak şifrelemeyi bitirin.

//Encrypting the data
byte[] cipherText = cipher.doFinal();

Misal

Aşağıdaki Java programı kullanıcıdan gelen metni kabul eder, RSA algoritmasını kullanarak şifreler ve verilen metnin şifreli formatını yazdırır.

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.Signature;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;

public class CipherSample {
   public static void main(String args[]) throws Exception{
      //Creating a Signature object
      Signature sign = Signature.getInstance("SHA256withRSA");
      
      //Creating KeyPair generator object
      KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
      
      //Initializing the key pair generator
      keyPairGen.initialize(2048);
      
      //Generating the pair of keys
      KeyPair pair = keyPairGen.generateKeyPair();      
	
      //Creating a Cipher object
      Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        
      //Initializing a Cipher object
      cipher.init(Cipher.ENCRYPT_MODE, pair.getPublic());
	  
      //Adding data to the cipher
      byte[] input = "Welcome to Tutorialspoint".getBytes();	  
      cipher.update(input);
	  
      //encrypting the data
      byte[] cipherText = cipher.doFinal();	 
      System.out.println(new String(cipherText, "UTF8"));
   }
}

Çıktı

Yukarıdaki program aşağıdaki çıktıyı üretir -

Encrypted Text: 
"???:]J_?]???;Xl??????*@??u???r??=T&???_?_??.??i?????(?$_f?zD??????ZGH??g??? g?E:_??bz^??f?~o???t?}??u=uzp\UI????Z??l[?G?3??Y?UAEfKT?f?O??N_?d__?????a_?15%?^? 'p?_?$,9"{??^??y??_?t???,?W?PCW??~??[?$??????e????f?Y-Zi__??_??w?_?&QT??`?`~?[?K_??_???

Şifrelenmiş verilerin şifresini, cihazın Cipher sınıfını kullanarak javax.cryptopaketi. Java kullanarak verilen verilerin şifresini çözmek için aşağıdaki adımları izleyin.

Adım 1: Bir KeyPairGenerator nesnesi oluşturun

KeyPairGenerator sınıf sağlar getInstance() gerekli anahtar oluşturma algoritmasını temsil eden bir String değişkenini kabul eden ve anahtarları oluşturan bir KeyPairGenerator nesnesi döndüren yöntem.

Oluşturmak KeyPairGenerator kullanarak nesne getInstance() yöntemi aşağıda gösterildiği gibi.

//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");

Adım 2: KeyPairGenerator nesnesini başlatın

KeyPairGenerator sınıf adlı bir yöntem sağlar initialize()bu yöntem, anahtar çifti üretecini başlatmak için kullanılır. Bu yöntem, anahtar boyutunu temsil eden bir tamsayı değerini kabul eder.

Önceki adımda oluşturulan KeyPairGenerator nesnesini initialize() yöntemi aşağıda gösterildiği gibi.

//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);

3. Adım: KeyPairGenerator'ü oluşturun

Sen üretebilirsin KeyPair kullanmak generateKeyPair() yöntemi KeyPairGeneratorsınıf. Aşağıda gösterildiği gibi bu yöntemi kullanarak anahtar çiftini oluşturun.

//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();

4. Adım: Genel anahtarı alın

Ortak anahtarı, oluşturulan KeyPair nesnesinden, getPublic() yöntemi aşağıda gösterildiği gibi.

//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();

5. Adım: Bir Cipher nesnesi oluşturun

getInstance() yöntemi Cipher class, gerekli dönüşümü temsil eden bir String değişkenini kabul eder ve verilen dönüşümü uygulayan bir Cipher nesnesi döndürür.

Cipher nesnesini oluşturun. getInstance() yöntemi aşağıda gösterildiği gibi.

//Creating a Cipher object
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

Adım 6: Cipher nesnesini başlatın

init() Cipher sınıfının yöntemi iki parametre kabul eder

  • İşlem modunu temsil eden bir tamsayı parametresi (şifreleme / şifre çözme)
  • Genel anahtarı temsil eden anahtar nesne

Cypher nesnesini şu şekilde başlatın: init() yöntemi aşağıda gösterildiği gibi.

//Initializing a Cipher object
cipher.init(Cipher.ENCRYPT_MODE, publicKey);

7. Adım: Cipher nesnesine veri ekleyin

update() Cipher sınıfının yöntemi, şifrelenecek veriyi temsil eden bir bayt dizisini kabul eder ve mevcut nesneyi verilen verilerle günceller.

Verileri, başlatılan Cipher nesnesini update() yöntemi aşağıda gösterildiği gibi bayt dizisi biçiminde.

//Adding data to the cipher
byte[] input = "Welcome to Tutorialspoint".getBytes();	  
cipher.update(input);

8. Adım: Verileri şifreleyin

doFinal()Cipher sınıfının yöntemi şifreleme işlemini tamamlar. Bu nedenle, aşağıda gösterildiği gibi bu yöntemi kullanarak şifrelemeyi bitirin.

//Encrypting the data
byte[] cipherText = cipher.doFinal();

Adım 9: Şifre çözme için Cipher nesnesini başlatın

Önceki adımlarda şifrelenen şifreyi çözmek için şifre çözme için onu başlatmanız gerekir.

Bu nedenle, aşağıda gösterildiği gibi Cipher.DECRYPT_MODE ve PrivateKey nesnesi parametrelerini ileterek şifre nesnesini başlatın.

//Initializing the same cipher for decryption
cipher.init(Cipher.DECRYPT_MODE, pair.getPrivate());

Adım 10: Verilerin şifresini çözün

Son olarak, şifrelenmiş metnin şifresini çözmek için doFinal() yöntemi aşağıda gösterildiği gibi.

//Decrypting the text
byte[] decipheredText = cipher.doFinal(cipherText);

Misal

Aşağıdaki Java programı kullanıcıdan gelen metni kabul eder, RSA algoritmasını kullanarak şifreler ve verilen metnin şifresini yazar, şifresini çözer ve şifresi çözülen metni tekrar yazdırır.

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.Signature;

import javax.crypto.Cipher;

public class CipherDecrypt {
   public static void main(String args[]) throws Exception{
	   //Creating a Signature object
      Signature sign = Signature.getInstance("SHA256withRSA");
      
      //Creating KeyPair generator object
      KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
      
      //Initializing the key pair generator
      keyPairGen.initialize(2048);
      
      //Generate the pair of keys
      KeyPair pair = keyPairGen.generateKeyPair();   
      
      //Getting the public key from the key pair
      PublicKey publicKey = pair.getPublic();  

      //Creating a Cipher object
      Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

      //Initializing a Cipher object
      cipher.init(Cipher.ENCRYPT_MODE, publicKey);
	  
      //Add data to the cipher
      byte[] input = "Welcome to Tutorialspoint".getBytes();	  
      cipher.update(input);
	  
      //encrypting the data
      byte[] cipherText = cipher.doFinal();	 
      System.out.println( new String(cipherText, "UTF8"));

      //Initializing the same cipher for decryption
      cipher.init(Cipher.DECRYPT_MODE, pair.getPrivate());
      
      //Decrypting the text
      byte[] decipheredText = cipher.doFinal(cipherText);
      System.out.println(new String(decipheredText));
   }
}

Çıktı

Yukarıdaki program aşağıdaki çıktıyı üretir -

Encrypted Text:
]/[?F3?D?p
v?w?!?H???^?A??????P?u??FA?
?
???_?? ???_jMH-??>??OP?'?j?_?n`
?_??'`????o??_GL??g???g_f?????f|???LT?|?Vz_TDu#??\?<b,,?$C2???Bq?#?lDB`??g,^??K?_?v???`}
?;LX?a?_5e???#???_?6?/B&B_???^?__Ap^#_?q?IEh????_?,??*??]~_?_?D?
_y???lp??a?P_U{

Decrypted Text:
Welcome to Tutorialspoint