Algorytm TripleDes - wyjątek javax.crypto.IllegalBlockSizeException

0

Witam,

Poniżej całość kodu:

public class TrippleDes {

    private static final String KEY_FACTORY = "DESede";
    private static final String UNICODE_FORMAT = "UTF8";
    public static final String DESEDE_ENCRYPTION_SCHEME = "DESede/CBC/PKCS5Padding";
    private KeySpec ks;
    private SecretKeyFactory skf;
    private Cipher cipher;
    byte[] arrayBytes;
    final IvParameterSpec iv;
    SecretKey key;

    public TrippleDes(String myEncryptionKey, String ivString) throws Exception {
        
       arrayBytes = DatatypeConverter.parseHexBinary(myEncryptionKey);
        iv = new IvParameterSpec(DatatypeConverter.parseHexBinary(ivString));

        ks = new DESedeKeySpec(arrayBytes);
        skf = SecretKeyFactory.getInstance(KEY_FACTORY);
        cipher = Cipher.getInstance(DESEDE_ENCRYPTION_SCHEME);
        key = skf.generateSecret(ks);
    }

    public String decrypt(String encryptedStringBase64 []) throws Exception {
    	
    	String encryptedInput = null;
    	
    	for (int i = 0; i < encryptedStringBase64.length; i++) {
    		encryptedInput += encryptedStringBase64[i];
		}
    	
    	
       byte[] encryptedString = Base64.decodeBase64(encryptedInput.getBytes(UNICODE_FORMAT));
        try {
            cipher.init(Cipher.DECRYPT_MODE, key, iv);
            byte[] plainText = cipher.doFinal(encryptedString);
            return new String(plainText);
        } catch (Exception e) {
              throw new Exception(e);
        }
    }
    
    public static void main(String args []) throws Exception
    {
    	TrippleDes td = new TrippleDes("32237628374CDHSFDFSHDHFNNDSICFHDSNGFCYC74N7Y3GF7", "0123456789abcdef");

    	String decryptedString = td.decrypt(args);
    	System.out.println(decryptedString);

    }
    
}

Niestety otrzymuję wyjątek:

Exception in thread "main" java.lang.Exception: javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher
at com.ca.acl.TrippleDes.decrypt(TrippleDes.java:59)
at com.ca.acl.TrippleDes.main(TrippleDes.java:67)
Caused by: javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:750)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)
at com.sun.crypto.provider.DESedeCipher.engineDoFinal(DESedeCipher.java:294)
at javax.crypto.Cipher.doFinal(Cipher.java:2087)
at com.ca.acl.TrippleDes.decrypt(TrippleDes.java:56)
... 1 more

Z czego wynika problem?

0

DES to algorytm blokowy i pracuje na blokach rozmiaru 64 bitów. To znaczy że ten algorytm potrafi szyfrować/deszyfrować tylko dane które są wielokrotnością takiego rozmiaru. U ciebie do decrypt przesyłasz dane które nie spełniają tego wymagania.
Co więcej:

        String encryptedInput = null;

        for (int i = 0; i < encryptedStringBase64.length; i++) {
            encryptedInput += encryptedStringBase64[i];
        }

To na pewno jest źle, bo null+"xx" da ci nullxx a nie samo xx. A ty potem to dekodujesz base64 co daje ci zupełne śmieci i oczywiście stringa ktory ma zły rozmiar, bo zdekodowałeś dodatkowo tego "null" na początku stringa. Jeśli w ogóle to dałbym tam encryptedInput = "" albo poskładał to ładnie strumieniem ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1