ML-KEM using encapsulation/decapsulation instead of encrypt/decrypt. (refer https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.203.pdf)
and I used bouncycastle v1.79
static {
Security.addProvider(new BouncyCastleProvider());
}
@Test
public void MLKEM_PKCS_Test(){
try{
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("ML-KEM-512", "BC");
KeyPair keyPair = keyGen.generateKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
System.out.println("Private Key: " + DatatypeConverter.printHexBinary(privateKey.getEncoded()));
MLKEMPrivateKeyParameters priKey = (MLKEMPrivateKeyParameters) PrivateKeyFactory.createKey(privateKey.getEncoded());
System.out.println("dk: " + DatatypeConverter.printHexBinary(priKey.getEncoded()));
PublicKey publicKey = keyPair.getPublic();
System.out.println("Public Key: " + DatatypeConverter.printHexBinary(publicKey.getEncoded()));
MLKEMPublicKeyParameters pubKey = (MLKEMPublicKeyParameters)PublicKeyFactory.createKey(publicKey.getEncoded());
System.out.println("ek: " + DatatypeConverter.printHexBinary(pubKey.getEncoded()));
MLKEMGenerator mlkemGenerator = new MLKEMGenerator(new SecureRandom());
SecretWithEncapsulation encaps = mlkemGenerator.generateEncapsulated(pubKey);
System.out.println("Cipher: "+DatatypeConverter.printHexBinary(encaps.getEncapsulation()));
System.out.println("secret(encap): " + DatatypeConverter.printHexBinary(encaps.getSecret()));
MLKEMExtractor mlkemExtractor = new MLKEMExtractor(priKey);
byte[] secret = mlkemExtractor.extractSecret(encaps.getEncapsulation());
System.out.println("secret(decap): " + DatatypeConverter.printHexBinary(secret));
} catch (Exception e) {
e.printStackTrace();
}
}