Java中的非對稱加密


密碼學是對不同技術的研究和實踐,用於保護通訊免受第三方入侵。它用於網路安全。我們嘗試開發保護敏感資料的方法和實踐。密碼學的唯一目標是保護資料免受攻擊者侵害。非對稱加密也稱為公鑰/私鑰加密。私鑰顧名思義是私有的,而公鑰可以分發。加密是兩個金鑰之間的數學關聯,一個用於加密,另一個用於解密。例如,如果有兩個金鑰“A1”和“A2”,那麼如果金鑰“A1”用於加密,“A2”用於解密,反之亦然。

我們使用RSA演算法進行非對稱加密,首先我們將生成一對金鑰(公鑰,私鑰)。

Java中的非對稱加密

要生成非對稱金鑰,可以按照以下步驟操作:

  • 首先,我們使用SecureRandom類生成公鑰和私鑰。它用於生成隨機數。

  • 使用RSA演算法生成金鑰。此類將提供getInstance()方法,該方法用於傳遞一個字串變數,該變量表示金鑰生成演算法,並返回金鑰生成器物件。

  • 使用2048位金鑰大小初始化金鑰生成器物件,並傳遞隨機數。

  • 現在,金鑰已生成,如果我們想檢視金鑰,可以使用DatatypeConvertor將其轉換為十六進位制格式。

現在實施上述方法:

語法

// Java program to create a
// asymmetric key

package java_cryptography;
import java.security.KeyPair;
import java.security
	.KeyPairGenerator;
import java.security
	.SecureRandom;
import javax.xml.bind
	.DatatypeConverter;

// Class to create an asymmetric key
public class Asymmetric {

	private static final String RSA
		= "RSA";

	// Generating public and private keys
	// using RSA algorithm.
	public static KeyPair generateRSAKkeyPair()
		throws Exception
	{
		SecureRandom secureRandom
			= new SecureRandom();

		KeyPairGenerator keyPairGenerator
			= KeyPairGenerator.getInstance(RSA);

		keyPairGenerator.initialize(
			2048, secureRandom);

		return keyPairGenerator
			.generateKeyPair();
	}

	// Driver code
	public static void main(String args[])
		throws Exception
	{
		KeyPair keypair
			= generateRSAKkeyPair();

		System.out.println(
			"Public Key is: "
			+ DatatypeConverter.printHexBinary(
				keypair.getPublic().getEncoded()));

		System.out.println(
			"Private Key is: "
			+ DatatypeConverter.printHexBinary(
				keypair.getPrivate().getEncoded()));
	}
}

輸出

現在可以採取以下步驟來建立程式程式碼:

  • 我們使用Cipher類建立兩種不同的模式加密和解密。加密金鑰是私鑰,解密金鑰是公鑰。

  • doFinal()方法在Cipher上呼叫,該方法在單部分操作中加密/解密資料,或完成多部分操作並返回位元組陣列。

  • 最後,我們在加密時使用ENCRYPT_MODE獲得密文。

程式程式碼

// Java program to perform the
// encryption and decryption
// using asymmetric key

package java_cryptography;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.util.Scanner;

import javax.crypto.Cipher;
import javax.xml.bind
	.DatatypeConverter;

public class Asymmetric {

	private static final String RSA
		= "RSA";
	private static Scanner sc;

	// Generating public & private keys
	// using RSA algorithm.
	public static KeyPair generateRSAKkeyPair()
		throws Exception
	{
		SecureRandom secureRandom = new SecureRandom();
		KeyPairGenerator keyPairGenerator
			= KeyPairGenerator.getInstance(RSA);

		keyPairGenerator.initialize(
			2048, secureRandom);
		return keyPairGenerator
			.generateKeyPair();
	}

	// Encryption function which converts
	// the plainText into a cipherText
	// using private Key.
	public static byte[] do_RSAEncryption(
		String plainText,
		PrivateKey privateKey)
		throws Exception
	{
		Cipher cipher = Cipher.getInstance(RSA);
		cipher.init(Cipher.ENCRYPT_MODE, privateKey);
		return cipher.doFinal(
			plainText.getBytes());
	}

	// Decryption function which converts
	// the ciphertext back to the
	// original plaintext.
	public static String do_RSADecryption(
		byte[] cipherText,
		PublicKey publicKey)
		throws Exception
	{
		Cipher cipher
			= Cipher.getInstance(RSA);

		cipher.init(Cipher.DECRYPT_MODE,
					publicKey);
		byte[] result
			= cipher.doFinal(cipherText);

		return new String(result);
	}

	// Driver code
	public static void main(String args[])
		throws Exception
	{
		KeyPair keypair
			= generateRSAKkeyPair();

		String plainText = "This is the PlainText "+ "I want to Encrypt using RSA.";

		byte[] cipherText
			= do_RSAEncryption(
				plainText,
				keypair.getPrivate());

		System.out.println(
			"The Public Key is: "
			+ DatatypeConverter.printHexBinary(
				keypair.getPublic().getEncoded()));

		System.out.println(
			"The Private Key is: "
			+ DatatypeConverter.printHexBinary(
				keypair.getPrivate().getEncoded()));

		System.out.print("The Encrypted Text is: ");

		System.out.println(
			DatatypeConverter.printHexBinary(
				cipherText));

		String decryptedText
			= do_RSADecryption(
				cipherText,
				keypair.getPublic());

		System.out.println(
			"The decrypted text is: "
			+ decryptedText);
	}
}

輸出

結論

因此,使用RSA演算法,我們在本文中建立了加密文字“This is the PlainText I want to Encrpyt using RSA”。

更新於:2023年7月18日

瀏覽量1K+

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告