java - 相当于MySQL aes_encrypt()函数的AES加密方式

标签 java mysql encryption aes

我想写一个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/

相关文章:

java - 继承和创建对象

java - 通过java执行复杂的Titan查询

java - 在安卓中使用 lambdaj

java - 为什么我在 Java 中收到 NoClassDefFoundError 错误?

php - 使用 strpos 识别 UPDATE 或 INSERT 查询 : not working as expected

php - SQL 查询不起作用,store_result 使执行崩溃

java - Java AES 加密是否符合 FIPS 140-2?

.net - mysql 中的地理图层

java - 使用 AES-128 加密/解密大于 256 字节的字节数组

数据库 | AES 加密()/解密()