Sample code for the DES algorithm. Question: if the encrypted text is already given, the program cannot decrypt it (BadPaddingException)

import javax.crypto.*;

import java.io.*;

import java.security.InvalidKeyException;

import java.security.NoSuchAlgorithmException;

public class DES {

    Cipher ecipher; //ОбЪект для шифрования
    Cipher dcipher; //ОбЪект для дешифрования

    /**
     * Конструктор
     *
     * @param key секретный ключ алгоритма DES. Экземпляр класса SecretKey
     * @throws NoSuchAlgorithmException
     * @throws NoSuchPaddingException
     * @throws InvalidKeyException
     */
    public DES(SecretKey key) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException {
        ecipher = Cipher.getInstance("DES"); //Создаём обЪект ecipher, параметр "DES" -  имя криптографического алгоритма шифрования
        dcipher = Cipher.getInstance("DES"); //Создаём обЪект dcipher, параметр "DES" -  имя криптографического алгоритма шифрования
        ecipher.init(Cipher.ENCRYPT_MODE, key); //инициализация экземпляра класса и указание, в каком режиме он будет работать. ENCRYPT_MODE - шифрование
        dcipher.init(Cipher.DECRYPT_MODE, key); //инициализация экземпляра класса и указание, в каком режиме он будет работать. DECRYPT_MODE - шифрование
    }

    /**
     * Функция шифровнаия
     *
     * @param str строка открытого текста
     * @return зашифрованная строка в формате Base64
     */
    private String encrypt(String str) throws UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException {
        byte[] utf8 = str.getBytes("UTF8");
        byte[] enc = ecipher.doFinal(utf8);
        return new sun.misc.BASE64Encoder().encode(enc);
    }

    /**
     * Функция расшифрования
     *
     * @param str зашифрованная строка в формате Base64
     * @return расшифрованная строка
     */
    private String decrypt(String str) throws IOException, IllegalBlockSizeException, BadPaddingException {
        byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);
        byte[] utf8 = dcipher.doFinal(dec);
        return new String(utf8, "UTF8");
    }

    /**
     * Функция для проверки правильности работы класса
     */
    public static void main(String[] args) throws IllegalBlockSizeException, BadPaddingException, IOException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException {
        SecretKey key = null;

        key = KeyGenerator.getInstance("DES").generateKey(); //создаём ключ

        DES crypter = new DES(key);

        String OStr1 = "строка для проверки"; //Строка для шифрования/дешифрования
        String SStr = crypter.encrypt(OStr1); //Зашифровать строку
        String OStr2 = crypter.decrypt(SStr); //Расшифровать строку

        System.out.println("Строка:" + OStr1 + "\nПосле шифрования: " + SStr + "\nПосле дешифрования: " + OStr2);
    }
}

If I change the main() method like this, an error occurs:

   public static void main(String[] args) throws IllegalBlockSizeException, BadPaddingException, IOException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException {
    SecretKey key = null;

    key = KeyGenerator.getInstance("DES").generateKey(); //создаём ключ

    DES crypter = new DES(key);

    String OStr1 = "PjQWKIqavcor+7nvyFz5SKK9lDAz3c8f1owTE73Ms+fKYKeOkik99g=="; //"строка для проверки"
    String OStr2 = crypter.decrypt(OStr1); //Расшифровать строку

    System.out.println(OStr2);

    /* Exception in thread "main" javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:989)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:845)
at com.sun.crypto.provider.DESCipher.engineDoFinal(DESCipher.java:314)
at javax.crypto.Cipher.doFinal(Cipher.java:2165)
at crypt.DES.decrypt(DES.java:51)
at crypt.DES.main(DES.java:66) */
}
Author: Barmaley, 2018-06-28

1 answers

DES block algorithm (block size 64 bits), which means in practice that the text must be a multiple of the block size. In general, if the original text is not a multiple of the block size , this is achieved by using alignment/padding, but this is not all. We also need an algorithm for mixing blocks/coupling mode

If you don't want to bother, write something like:

Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

Translated into a public language means:

  • encryption DES
  • PKCS5 alignment
  • CBC clutch mode
 0
Author: Barmaley, 2018-06-28 14:32:04