Как проверить ключи RSA на наличие ошибок в шифровании - PullRequest
2 голосов
/ 10 июля 2019

Недавно я прочитал статью Серьезно, прекратите использовать 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);
    }
...