Remove \r and \n from AES encrypted string

10,888

Solution 1

Actually,I was using apache commons-codec-1.4.0.jar to encode the string. Changing it to higher version solves the issue. The behaviour of encodeBase64String method has been changed from multi-line chunking (commons-codec-1.4) to single-line non-chunking (commons-codec-1.5).

Please follow the link for more details. http://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/binary/Base64.html

Solution 2

Adding Base64.encodeBase64String(hashPassword,Base64.NO_WRAP) removes the \n.

By default it uses Base64.DEFAULT which adds newline.

click here: source

click here: Main source

Solution 3

It seems like the base64 encoding standard requires that there is a line break at least every 75 characters. My guess is that the base64 encoding function is adding this automatically, you haven't done anything wrong, and that it's fine to leave it in or remove it. According to the link below, base64 decoding functions should ignore line breaks, so whether you remove it or not is up to you...

See here for someone else who's run into this problem, and a quote from the base64 standard: http://lists.w3.org/Archives/Public/w3c-ietf-xmldsig/2001AprJun/0183.html

Share:
10,888
user3244519
Author by

user3244519

Updated on June 13, 2022

Comments

  • user3244519
    user3244519 almost 2 years

    I am encrypting a string using AES but the encrypted string contains \n and \r at the end.

     public class AESImpl {
    
      private static String decryptedString;
    
      private static String encryptedString;
    
      public static void main(String[] args) throws NoSuchAlgorithmException, IOException,  ClassNotFoundException {
    
        String strToEncrypt = "This text has to be encrypted";
        SecretKey secretKey = generateSecretKey();
        String encryptStr = encrypt(strToEncrypt, secretKey);
        System.out.println("Encrypted String : " + encryptStr + "It should not come in new line");
        String decryptStr = decrypt(encryptStr, secretKey);
        System.out.println("Decrypted String : " + decryptStr);
      }
    
      private static SecretKey generateSecretKey() throws NoSuchAlgorithmException, IOException {
        KeyGenerator kg = KeyGenerator.getInstance("AES");
        kg.init(128);
        SecretKey sk = kg.generateKey();
        String secretKey = String.valueOf(Hex.encodeHex(sk.getEncoded()));
        System.out.println("Secret key is " + secretKey);
        return sk;
      }
    
      public static String encrypt(String strToEncrypt, SecretKey secretKey) {
        try {
          Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
          cipher.init(Cipher.ENCRYPT_MODE, secretKey);
          encryptedString = new String(Base64.encodeBase64String(cipher.doFinal(strToEncrypt.getBytes())));
        } catch (Exception e) {
          System.out.println("Error while encrypting: " + e.toString());
        }
    
        return encryptedString;
      }
    
      public static String decrypt(String strToDecrypt, SecretKey secretKey) {
        try {
          Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
          cipher.init(Cipher.DECRYPT_MODE, secretKey);
          decryptedString = new String(cipher.doFinal(Base64.decodeBase64(strToDecrypt)));
        } catch (Exception e) {
          System.out.println("Error while decrypting: " + e.toString());
        }
    
        return decryptedString;
      }
    }
    

    Output

    Secret key is 2df36561b09370637d35b4a310617e60
    Encrypted String : TUDUORnWtsZFJAhBw1fYMF9CFExb/tSsLeDx++cpupI=
    It should not come in new line
    Decrypted String : This text has to be encrypted
    

    Actually, the encrypted string is TUDUORnWtsZFJAhBw1fYMF9CFExb/tSsLeDx++cpupI=/r/n. Do I need to explicitly replace the \r and \n from encrypted string or I have done something wrong in the above code?