Untitled
unknown
plain_text
2 years ago
3.4 kB
9
Indexable
import javax.crypto.*; import javax.crypto.spec.GCMParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.io.*; import java.security.*; public class RSA_KEM { public static void main(String[] args) { try { // Step 1: Generate RSA key pair KeyPair keyPair = generateRSAKeyPair(); PublicKey publicKey = keyPair.getPublic(); PrivateKey privateKey = keyPair.getPrivate(); // Step 2: Key Encapsulation Mechanism (KEM) - encapsulate key KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); keyGenerator.init(256); // AES-256 SecretKey secretKey = keyGenerator.generateKey(); // Use the encapsulated key for encryption byte[] ciphertext = encryptWithRSA(publicKey, secretKey.getEncoded()); System.out.println("Encrypted Key: " + bytesToHex(ciphertext)); // Step 3: Key Decapsulation - decapsulate key byte[] decryptedKey = decryptWithRSA(privateKey, ciphertext); // Use the decapsulated key for decryption String originalMessage = "Hello, RSA with KEM!"; byte[] encryptedMessage = encryptWithAES(decryptedKey, originalMessage.getBytes()); System.out.println("Encrypted Message: " + bytesToHex(encryptedMessage)); byte[] decryptedMessage = decryptWithAES(decryptedKey, encryptedMessage); System.out.println("Decrypted Message: " + new String(decryptedMessage)); } catch (Exception e) { e.printStackTrace(); } } private static KeyPair generateRSAKeyPair() throws NoSuchAlgorithmException { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(2048); // Adjust key size as needed return keyPairGenerator.generateKeyPair(); } private static byte[] encryptWithRSA(PublicKey publicKey, byte[] data) throws Exception { Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); return cipher.doFinal(data); } private static byte[] decryptWithRSA(PrivateKey privateKey, byte[] ciphertext) throws Exception { Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding"); cipher.init(Cipher.DECRYPT_MODE, privateKey); return cipher.doFinal(ciphertext); } private static byte[] encryptWithAES(byte[] key, byte[] data) throws Exception { SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec); return cipher.doFinal(data); } private static byte[] decryptWithAES(byte[] key, byte[] ciphertext) throws Exception { SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, secretKeySpec); return cipher.doFinal(ciphertext); } private static String bytesToHex(byte[] bytes) { StringBuilder result = new StringBuilder(); for (byte b : bytes) { result.append(String.format("%02X", b)); } return result.toString(); } }
Editor is loading...
Leave a Comment