Программисты JAVA общаются здесь
Anonymous
Как использовать ML-KEM/Kyber для шифрования данных с помощью PublicKey и расшифровки данных с помощью PrivateKey
Сообщение
Anonymous » 04 ноя 2025, 23:35
Я учусь использовать квантовую криптографию Post с Java. Реализация поставщика представлена BouncyCastle версии 1.78.1. Короче говоря, я использую BouncyCastlePQCProvider для получения пары ключей спецификации Kyber1024.
Код: Выделить всё
static
{
Security.addProvider(new BouncyCastleProvider());
Security.addProvider(new BouncyCastlePQCProvider());
}
public static KeyPair generateKeyPair() {
try {
KeyPairGenerator kpg=KeyPairGenerator.getInstance("Kyber","BCPQC");
kpg.initialize(KyberParameterSpec.kyber1024);
return kpg.generateKeyPair();
} catch (Throwable t) {
t.printStackTrace();
throw new RuntimeException(t.getMessage(), t);
}
}
public static byte[] encryptData(byte[] data, PublicKey publicKey)
{
Cipher cipher=null;
try
{
cipher=Cipher.getInstance("Kyber", "BCPQC");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(data);
} catch (Throwable t) {
t.printStackTrace();
throw new RuntimeException(t.getMessage(), t);
}
}
public static byte[] decryptData(byte[] encryptedData, PrivateKey privateKey)
{
Cipher cipher=null;
try
{
cipher=Cipher.getInstance("Kyber", "BCPQC");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(encryptedData);
} catch (Throwable t) {
t.printStackTrace();
throw new RuntimeException(t.getMessage(), t);
}
}
public static void main(String[] args) {
KeyPair keyPair=generateKeyPair();
byte[] publicKeyData=keyPair.getPublic().getEncoded();
byte[] privateKeyData=keyPair.getPrivate().getEncoded();
String publicKeyHex=Hex.toHexString(publicKeyData);
String privateKeyHex=Hex.toHexString(privateKeyData);
System.out.println("Public key length " + keyPair.getPublic().getEncoded().length + " format " + keyPair.getPublic().getFormat() + " algorithm " + keyPair.getPublic().getAlgorithm());
System.out.println("Public Key ");
System.out.println(publicKeyHex);
System.out.println("Private key length " + keyPair.getPrivate().getEncoded().length + " format " + keyPair.getPrivate().getFormat() + " algorithm " + keyPair.getPrivate().getAlgorithm());
System.out.println("Private Key ");
System.out.println(privateKeyHex);
String message="Hello World!";
byte[] encryptedData=encryptData(message.getBytes(), keyPair.getPublic());
String encryptedDataStr=DatatypeConverter.printBase64Binary(encryptedData);
System.out.println("encrypted:" + encryptedDataStr);
byte[] decryptedData=decryptData(encryptedData, keyPair.getPrivate());
String decrtyptedDataStr=new String(decryptedData);
System.out.println("decrypted:" + decrtyptedDataStr);
}
Однако при запуске этого кода возникают некоторые исключения во время шифрования, получается, что Cipher действителен только для исключений переноса/развертывания
Код: Выделить всё
java.security.InvalidParameterException: Cipher only valid for wrapping/unwrapping
Что я делаю не так?
Подробнее здесь:
https://stackoverflow.com/questions/789 ... pting-data
1762288520
Anonymous
Я учусь использовать квантовую криптографию Post с Java. Реализация поставщика представлена BouncyCastle версии 1.78.1. Короче говоря, я использую BouncyCastlePQCProvider для получения пары ключей спецификации Kyber1024. [code]static { Security.addProvider(new BouncyCastleProvider()); Security.addProvider(new BouncyCastlePQCProvider()); } public static KeyPair generateKeyPair() { try { KeyPairGenerator kpg=KeyPairGenerator.getInstance("Kyber","BCPQC"); kpg.initialize(KyberParameterSpec.kyber1024); return kpg.generateKeyPair(); } catch (Throwable t) { t.printStackTrace(); throw new RuntimeException(t.getMessage(), t); } } public static byte[] encryptData(byte[] data, PublicKey publicKey) { Cipher cipher=null; try { cipher=Cipher.getInstance("Kyber", "BCPQC"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); return cipher.doFinal(data); } catch (Throwable t) { t.printStackTrace(); throw new RuntimeException(t.getMessage(), t); } } public static byte[] decryptData(byte[] encryptedData, PrivateKey privateKey) { Cipher cipher=null; try { cipher=Cipher.getInstance("Kyber", "BCPQC"); cipher.init(Cipher.DECRYPT_MODE, privateKey); return cipher.doFinal(encryptedData); } catch (Throwable t) { t.printStackTrace(); throw new RuntimeException(t.getMessage(), t); } } public static void main(String[] args) { KeyPair keyPair=generateKeyPair(); byte[] publicKeyData=keyPair.getPublic().getEncoded(); byte[] privateKeyData=keyPair.getPrivate().getEncoded(); String publicKeyHex=Hex.toHexString(publicKeyData); String privateKeyHex=Hex.toHexString(privateKeyData); System.out.println("Public key length " + keyPair.getPublic().getEncoded().length + " format " + keyPair.getPublic().getFormat() + " algorithm " + keyPair.getPublic().getAlgorithm()); System.out.println("Public Key "); System.out.println(publicKeyHex); System.out.println("Private key length " + keyPair.getPrivate().getEncoded().length + " format " + keyPair.getPrivate().getFormat() + " algorithm " + keyPair.getPrivate().getAlgorithm()); System.out.println("Private Key "); System.out.println(privateKeyHex); String message="Hello World!"; byte[] encryptedData=encryptData(message.getBytes(), keyPair.getPublic()); String encryptedDataStr=DatatypeConverter.printBase64Binary(encryptedData); System.out.println("encrypted:" + encryptedDataStr); byte[] decryptedData=decryptData(encryptedData, keyPair.getPrivate()); String decrtyptedDataStr=new String(decryptedData); System.out.println("decrypted:" + decrtyptedDataStr); } [/code] Однако при запуске этого кода возникают некоторые исключения во время шифрования, получается, что Cipher действителен только для исключений переноса/развертывания [code]java.security.InvalidParameterException: Cipher only valid for wrapping/unwrapping[/code] Что я делаю не так? Подробнее здесь: [url]https://stackoverflow.com/questions/78945143/how-to-use-ml-kem-kyber-for-encrypting-data-using-publickey-and-decrypting-data[/url]