我想写一个AES加密方法,应该等同于mysql aes_encrypt
。
我试着写,但它不正确,因为 mysql 也没有提供正确的数据。
我应该怎么做才能使其正确?
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
byte[] encryptedTextBytes = cipher.doFinal(message .getBytes("UTF-8"));
String k = new String(encryptedTextBytes);
System.out.println("KKKKK"+k);
最佳答案
MySQL对AES的实现让很多人头疼。这主要是因为 MySQL 如何处理加密 key 。加密 key 被分成 16 字节的 block ,MySQL 会将一个 block 中的字节与前一个 block 中的字节进行异或。如果用户提供的 key 的长度恰好小于 16 个字节,则该 key 基本上用空字节填充以达到 16 个字节。 MySQL 的 aes_encrypt() 就是这样处理 key 的。
还通过使用 PKCS7 填充数据来处理要加密的值。您可以在 http://en.wikipedia.org/wiki/Padding_%28cryptography%29#PKCS7 了解有关 PKCS7 的所有信息但它所做的只是填充输入数据,使其位于 16 字节 block 中。数据填充的字节等于将添加的填充字节数。
长话短说,您需要像 MySQL 那样处理加密 key ,并使用 PKCS7 填充输入数据。
有关 Java 中的示例代码,请参阅 Michael Simmons 的以下帖子: http://info.michael-simons.eu/2011/07/18/mysql-compatible-aes-encryption-decryption-in-java/
关于java - 相当于MySQL aes_encrypt()函数的AES加密方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19518447/