Untitled
unknown
plain_text
2 years ago
3.4 kB
12
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