Java 从AES加密字符串中删除\r和\n
我正在使用AES加密字符串,但加密字符串的末尾包含Java 从AES加密字符串中删除\r和\n,java,encryption,aes,newline,carriage-return,Java,Encryption,Aes,Newline,Carriage Return,我正在使用AES加密字符串,但加密字符串的末尾包含\n和\r public class AESImpl { private static String decryptedString; private static String encryptedString; public static void main(String[] args) throws NoSuchAlgorithmException, IOException, ClassNotFoundException
\n
和\r
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
,或者我在上述代码中做了一些错误的事情?似乎base64编码标准要求至少每75个字符有一个换行符。我的猜测是base64编码函数会自动添加它,您没有做错任何事情,保留它或删除它都可以。根据下面的链接,base64解码函数应该忽略换行符,所以是否删除它取决于您
请参阅这里,了解遇到此问题的其他人,以及base64标准中的一句话:实际上,我使用apachecommons-codec-1.4.0.jar对字符串进行编码。将其更改为更高版本可以解决此问题。 encodeBase64String方法的行为已从多行分块(commons-codec-1.4)更改为单行非分块(commons-codec-1.5) 请按照链接了解更多详细信息。 添加
Base64.encodeBase64String(hashPassword,Base64.NO\u WRAP)
删除\n
默认情况下,它使用Base64。默认情况下
添加换行符
单击此处:
单击此处:只需对编码字符串执行
encryptedString=encryptedString.replaceAll((?:\\r\\n |\\n\\r |\\n |\\r)”,“”)
当您尝试将其解码回字节时,它工作正常。我用随机生成的字节数组对它进行了多次测试。显然,解码过程只是忽略了新行,不管它们是否存在。我使用com.sun.org.apache.xml.internal.security.utils.Base64其他未测试的编码器测试了此“确认工作”。这是在编码字符串末尾添加\n的代码块
keyBytes = secret_key.substring(0, 32).toByteArray(charset("UTF8"))
val skey = SecretKeySpec(keyBytes, "AES")
val input = strToEncrypt.toByteArray(charset("UTF8"))
synchronized(Cipher::class.java) {
val cipher = Cipher.getInstance("AES/ECB/PKCS5Padding")
cipher.init(Cipher.ENCRYPT_MODE, skey)
val cipherText = ByteArray(cipher.getOutputSize(input.size))
var ctLength = cipher.update(
input, 0, input.size,
cipherText, 0
)
ctLength += cipher.doFinal(cipherText, ctLength)
return String(
android.util.Base64.encode(cipherText, 1)
)
}
下面的代码工作正常
val algorithm = "AES"
val keyValue = secret_key.substring(0, 32).toByteArray(charset("UTF8"))
val key: Key = SecretKeySpec(keyValue, algorithm)
val c: Cipher = Cipher.getInstance(algorithm, "BC")
c.init(Cipher.ENCRYPT_MODE, key);
val encValue: ByteArray =
c.doFinal(
strToEncrypt.toByteArray()
)
return Base64.getEncoder().encodeToString(encValue)
但我要强调的是,更改加密字符串中的值肯定会在某个时候引起麻烦。同意!乱搞加密字符串可能不是个好主意!除非另一端的Base64解码器坚持它在那里(这不太可能),否则更改空格不会导致问题。非常感谢您的帮助..我使用的是apache commons-codec-1.4.0.jar..将其更改为更高版本解决了问题。实际上,encodeBase64String方法的行为已从多行分块(commons-codec-1.4)更改为单行非分块(commons-codec-1.5)。请遵循此链接trim(),它不会产生问题。忽略Base64字符串中的空白。没有什么不对的。尽管可能有Base64编码器选项来防止添加字符。Dheivame。。埃纳·卡帕提塔·德海瓦梅。