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”。
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP
