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, the error will crash:

  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) */ } 
  • everything works fine - Roman C

1 answer 1

DES block algorithm (block size 64 bits), which means in practice that the text should be a multiple of the block size. In general, if the original text is not a multiple of the size of the blocks, this is achieved by applying alignment / padding , but that’s not all. Need more algorithm for mixing blocks / mod coupling

If you do not want to bother write something like:

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

Translated into a public language means:

  • DES encryption
  • PKCS5 alignment
  • CBC clutch mod