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) */ }