Шифрование лога Android с использованием AES и RSA - PullRequest
0 голосов
/ 15 октября 2019

Я хочу отправить зашифрованный файл журнала из моего приложения. Поскольку журналы могут быть больше, я зашифровал данные с помощью AES и зашифровал ключ с помощью RSA. Поскольку ключ AES требуется для расшифровки журнала, я отправляю зашифрованный ключ и журналы в том же файле.

Вопрос 1: Правильный ли это подход? Если нет, то какой подход лучше использовать в этом сценарии? Ниже приведен код того же самого.

 public static String encrypt(String data) {
    StringBuilder encryptedData = new StringBuilder();
    try {
        // Generate AES key.
        KeyGenerator generator = KeyGenerator.getInstance("AES");
        // The AES key size in number of bits.
        generator.init(256);
        SecretKey secKey = generator.generateKey();

        // Initialize AES Cipher, IV and encrypt string.
        Cipher aesCipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
        aesCipher.init(Cipher.ENCRYPT_MODE, secKey, new IvParameterSpec(new byte[16]));
        byte[] byteCipherText = aesCipher.doFinal(data.getBytes());
        String encryptedText = Base64.encodeToString(byteCipherText, Base64.DEFAULT);

        // Initialize RSA Cipher and generate public key.
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        X509EncodedKeySpec publicSpec = new X509EncodedKeySpec(Base64.decode(PUBLIC_KEY, Base64.DEFAULT));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey puKey = keyFactory.generatePublic(publicSpec);
        cipher.init(Cipher.PUBLIC_KEY, puKey);

        // Encrypt key and text.
        byte[] encryptedKey = cipher.doFinal(secKey.getEncoded());
        String aesKey = Base64.encodeToString(encryptedKey, Base64.DEFAULT);
        encryptedData.append(aesKey);
        encryptedData.append(encryptedText);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return encryptedData.toString();
}

1 Ответ

2 голосов
/ 15 октября 2019

Поскольку для расшифровки журнала требуется ключ AES, я отправляю зашифрованный ключ и журналы в одном и том же файле.

Вопрос 1. Правильный ли это подход? Если нет, то какой подход лучше использовать в этом сценарии. Ниже приведен код того же самого.

Подход правильный, но мне не хватает аутентификации (HMAC, GCM, ... ).

Есть несколько стандартов, как связывать зашифрованный ключ, контент и аутентификацию (например, CMS , PKCS7, OpenPGP, ..), однако, если это для вашего собственного приложения, вы можете сделать этоваш путь (не беспокойтесь о стандартах).

Если вы хотите использовать RSA, используйте RSA-KEM

Что ж, используя RSA KEM, вы можете сэкономить немногопроизводительность пропускает отступы, но я бы попробовал, если это возможно для вас. Также существует проблема при шифровании одного и того же ключевого материала с разными открытыми ключами.

Я бы оставил это простым - просто используйте должным образом дополненное шифрование RSA.

Я бы предложил использовать заполнение OAEP RSA/ECB/OAEPWithSHA-256AndMGF1Padding вместо PKCS1Padding (OAEP считается более новым / более безопасным)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...