шифрование с использованием AES / ECB / NoPadding против PKCS5Padding - PullRequest
0 голосов
/ 23 октября 2018

У меня нет проблем с неработающим кодом, но это сбивает с толку, и я не знаю, почему, хотя я использую строку длиной 16 байтов (поэтому заполнение не требуется), у меня получился странный короткий вывод cG + etVq + 7l +RfJS27jCtwg == (без заполнения, но до записи он был длиной 16 байт)

против

cG + etVq + 7l + RfJS27jCtwskFauqkVxpbMJGODZoZe5c = (с PKCS5Padding, но тем не менее?

public class AES {

private static SecretKeySpec secretKey;
private static byte[] key;

public static void setKey(String myKey)
{

        key = myKey.getBytes("UTF-8");
        secretKey = new SecretKeySpec(key, "AES");


}

public static String encrypt(String strToEncrypt, String secret)
{
    try
    {
        setKey(secret);
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes("UTF-8")));
    }
    catch (Exception e)
    {
        System.out.println("Error while encrypting: " + e.toString());
    }
    return null;
}

public static String decrypt(String strToDecrypt, String secret)
{
    try
    {
        setKey(secret);
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        return new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt)));
    }
    catch (Exception e)
    {
        System.out.println("Error while decrypting: " + e.toString());
    }
    return null;
}

public static SecretKeySpec getSecretKey() {
    return secretKey;
}

public static void setSecretKey(SecretKeySpec secretKey) {
    AES.secretKey = secretKey;
}

public static byte[] getKey() {
    return key;
}

public static void setKey(byte[] key) {
    AES.key = key;
}

}

1 Ответ

0 голосов
/ 23 октября 2018

С PKCS5Padding, затем всегда добавляется заполнение.Там нет строки, где заполнение не требуется.Строка из 16 байтов будет выводить 32 байта (следующий кратный 16).

См. Заполнение в Википедии, например:

Если исходные данныеявляется целым числом, кратным N байтов, затем добавляется дополнительный блок байтов со значением NЭто необходимо, чтобы алгоритм дешифрования мог с уверенностью определить, является ли последний байт последнего блока байтом заполнения, указывающим количество добавленных байтов заполнения или часть открытого текста.

Рассмотрим сообщение открытого текста, которое являетсяцелое число, кратное N байтов, причем последний байт открытого текста равен 01. Без дополнительной информации алгоритм дешифрования не сможет определить, является ли последний байт байтом открытого текста или байтом заполнения.Однако, добавляя N байтов, каждое из которых имеет значение N после байта открытого текста 01, алгоритм дешифрования всегда может обработать последний байт как байт заполнения и удалить соответствующее количество байтов заполнения с конца зашифрованного текста;указанное количество байтов, которые будут удалены на основе значения последнего байта.

...