2014-02-18 2 views
3

Я шифрую строку с использованием AES, но зашифрованная строка содержит \n и \r в конце.Удалите r и n из AES зашифрованной строки

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; 
    } 
} 

Выход

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

На самом деле, зашифрованная строка TUDUORnWtsZFJAhBw1fYMF9CFExb/tSsLeDx++cpupI=/r/n. Должен ли я явно заменить \r и \n из зашифрованной строки, или я сделал что-то неправильно в приведенном выше коде?

+0

Пустое пространство в строке Base64 игнорируется. Нет ничего плохого. Хотя может быть опция кодировщика Base64, чтобы предотвратить добавление символов. –

ответ

4

На самом деле, я использовал apache commons-codec-1.4.0.jar для кодирования строки. Изменение этой версии на более высокую версию решает проблему. Поведение метода encodeBase64String было изменено с многострочного chunking (commons-codec-1.4) на однострочное не-chunking (commons-codec-1.5).

Для получения более подробной информации, перейдите по ссылке. http://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/binary/Base64.html

0

Похоже, что стандарт кодирования base64 требует, что существует разрыв строки не менее 75 символов. Я предполагаю, что функция кодирования base64 добавляет это автоматически, вы ничего не сделали неправильно, и что это нормально, чтобы оставить ее или удалить. Согласно приведенной ниже ссылке, функции декодирования base64 должны игнорировать разрывы строк, поэтому независимо от того, удаляете ли вы это или нет, вам не нужно ...

См. Здесь для кого-то, кто столкнулся с этой проблемой, и цитаты из стандарта base64 : http://lists.w3.org/Archives/Public/w3c-ietf-xmldsig/2001AprJun/0183.html

+2

*** НО *** Я хотел бы подчеркнуть, что изменение значений в зашифрованной строке неизбежно вызовет проблемы в какой-то момент. – christopher

+0

Согласен! Прошивка с зашифрованными строками, вероятно, не очень хорошая идея! – user1578653

+0

Изменение пробела не должно вызывать проблемы, если декодер Base64 на другом конце не настаивает, чтобы он был там (что маловероятно). –

6

Добавление Base64.encodeBase64String(hashPassword,Base64.NO_WRAP) удаляет \ n.

По умолчанию используется Base64.DEFAULT, который добавляет новую строку.

нажмите здесь: source

нажмите здесь: Main source

-1

Просто выполнить encryptedString = encryptedString.replaceAll("(?:\\r\\n|\\n\\r|\\n|\\r)", "") на закодированной строки.

Он отлично работает при попытке декодировать его обратно в байты. Я тестировал его несколько раз со случайными сгенерированными массивами байтов. Очевидно, что процесс декодирования просто игнорирует новые строки, которые они представляют, или нет. Я тестировал эту «подтвержденную работу» с помощью com.sun.org.apache.xml.internal.security.utils.Base64 Другие кодеры не тестировались.

Смежные вопросы