Шифрование в Java, пока известен метод расшифровки - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь сделать механизм шифрования и дешифрования в Java. Я нашел некоторый код для расшифровки, но я не знаю, как шифровать. Какой метод шифрования будет совместим с методом расшифровки следующим образом:

private byte[] padKey(byte[] key) {
        byte[] paddedKey = new byte[32];
        System.arraycopy(key, 0, paddedKey, 0, key.length);
        return paddedKey;
    }

    private byte[] unpad(byte[] data) {     
        byte[] unpaddedData = new byte[data.length - data[data.length - 1]];
        System.arraycopy(data, 0, unpaddedData, 0, unpaddedData.length);
        return unpaddedData;
    }


public String decrypt(String encodedJoinedData) throws Exception {

        // Base64-decode the joined data
        byte[] joinedData = Base64.decode(encodedJoinedData); 

        // Get IV and encrypted data
        byte[] iv = new byte[16];
        System.arraycopy(joinedData, 0, iv, 0, iv.length);
        byte[] encryptedData = new byte[joinedData.length - iv.length];
        System.arraycopy(joinedData, iv.length, encryptedData, 0, encryptedData.length);

        // Pad key
        byte[] key = padKey("SiadajerSiadajer".getBytes()); 
        Key aesKey = new SecretKeySpec(key, "AES");

        // Specify CBC-mode
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv); 
        cipher.init(Cipher.DECRYPT_MODE, aesKey, ivParameterSpec);

        // Decrypt data
        byte[] decryptedData = cipher.doFinal(encryptedData);

        // Remove custom padding
        byte[] unpaddedData = unpad(decryptedData);         

        return new String(unpaddedData);
    }

1 Ответ

0 голосов
/ 18 марта 2019

Если вы ищете аналог шифрования для вашего decrypt -метода, вам просто нужно повернуть процесс в вашем decrypt -методе. В теле encrypt -метода должно быть сделано следующее (пусть plainText будет String -параметром, содержащим простой текст):

  1. Добавить пользовательский отступ

    // Pad data (custom padding)
    byte[] paddedData = pad(plainText.getBytes(), 16);
    
  2. Зашифруйте ваш обычный текст

    // Pad key 
    byte[] key = padKey("SiadajerSiadajer".getBytes()); 
    Key aesKey = new SecretKeySpec(key, "AES");
    
    // Specify block-cipher (AES), mode (CBC) and padding (PKCS5)
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
    
    // Create random IV
    SecureRandom secureRandom = new SecureRandom();
    byte iv[] = new byte[cipher.getBlockSize()];
    secureRandom.nextBytes(iv);
    IvParameterSpec ivParameterSpec = new IvParameterSpec(iv); 
    
    // Encrypt data
    cipher.init(Cipher.ENCRYPT_MODE, aesKey, ivParameterSpec);
    byte[] encryptedData = cipher.doFinal(paddedData);
    
  3. Присоединение IV и зашифрованные данные

    // Join IV and encrypted data
    byte[] joinedData = new byte[iv.length + encryptedData.length];  
    System.arraycopy(iv, 0, joinedData, 0, iv.length);
    System.arraycopy(encryptedData, 0, joinedData, iv.length, encryptedData.length);
    
  4. База 64-кодирования соединяемых данных

    // Base64-encode data
    String encodedJoinedData = Base64.encode(joinedData, 0);
    

Наконец, encodedJoinedData должны быть возвращены.

Кроме того, вы должны реализовать пользовательский отступ. Следующий метод реализует пользовательский отступ PKCS5 и является возможным аналогом unpad -метода:

private byte[] pad(byte[] data, int size) {
    byte padLength = (byte)(size - (data.length % size));
    byte[] paddedData = new byte[data.length + padLength];
    System.arraycopy(data, 0, paddedData, 0, data.length);
    for (int i = data.length; i < paddedData.length; i++)
        paddedData[i] = (byte)padLength;
    return paddedData;
}

Кстати, есть несколько проблем с вашим decrypt -методом (и, следовательно, с encrypt -методом):

  • Вы не должны использовать жестко закодированный ключ, но, вероятно, это только для целей тестирования. Для создания безопасного ключа AES см., Например, Как создать безопасный случайный ключ AES в Java? .
  • Наиболее очевидным недостатком является то, что он не дополняется / дополняется дважды в методе decrypt / encrypt, что не имеет никакого смысла. Таким образом, удалите либо выбранный PKCS5-отступ (т. Е. Измените с AES/CBC/PKCS5Padding на AES/CBC/NoPadding), либо пользовательский заполнитель в обоих методах decrypt - и encrypt (при условии, что это возможно в рамках вашего проекта) ,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...