Недавно я прочитал статью Серьезно, прекратите использовать RSA
и мне было интересно, как лучше всего протестировать мою реализацию генерации набора ключей RSA. Я не эксперт по безопасности, но я работаю в Java и Software Dev. в течение достаточно долгого времени Однако я не уверен, как бы я проверил силу ключа (недостатки в процессе реализации).
Реализация, которую я сделал для моего ключа RSA, следующая:
private KeyPairGenerator keyGen;
private PrivateKey privateKey;
private PublicKey publicKey;
private SecureRandom srandom;
public SecreteKeyGenerator() throws NoSuchAlgorithmException {
this.keyGen = KeyPairGenerator.getInstance("RSA");
this.keyGen.initialize(Encryptable.RSA_LENGTH);
this.srandom = new SecureRandom();
}
public void createRSAKeys() {
KeyPair pair = this.keyGen.generateKeyPair();
this.privateKey = pair.getPrivate();
this.publicKey = pair.getPublic();
}
Я использую эту реализацию в сочетании с ключом AES. Я использую ключ AES для шифрования данных, а затем шифрую ключ с использованием RSA.
Это рекомендуемый метод в Java при работе с большими файлами.
Переменная Encryptable.RSA_LENGTH
имеет значение 2048, которое является длиной ключа.
После генерации ключей они записываются в файлы, хранящиеся на клиентском компьютере.
Шифрование работает должным образом, как и процесс цифровой подписи. Тем не менее, я хочу быть уверен, что я все правильно реализовал.
Это код, который обрабатывает процесс шифрования файла:
public void execute() {
OperationsLogger.getLogger().log(Level.INFO, "Encryption of file started");
AESEncryption aesEncryption = new AESEncryption();
aesEncryption.createAESKey();
aesEncryption.encryptFile(this.targetFilePath, this.publicKeyPath);
OperationsLogger.getLogger().log(Level.INFO, "File encrypted successfully.");
}
//AES Encryption
public void encryptFile(String inputFile, String publicKeyLocation) throws IOException, GeneralSecurityException {
try (FileOutputStream out = new FileOutputStream(inputFile + ".enc")) {
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, new RSAEncryption().getPublic(publicKeyLocation));
byte[] b = cipher.doFinal(secretKey.getEncoded());
out.write(b);
out.write(gen.getIv());
Cipher ci = Cipher.getInstance("AES/CBC/PKCS5Padding");
ci.init(Cipher.ENCRYPT_MODE, secretKey, gen.getIvspec());
try (FileInputStream in = new FileInputStream(inputFile)) {
processFile(ci, in, out);
}
}
}
public PublicKey getPublic(String filename) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {
byte[] keyBytes = Files.readAllBytes(new File(filename).toPath());
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
return kf.generatePublic(spec);
}