首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中使用AES-128进行加密

在Java中使用AES-128进行加密
EN

Stack Overflow用户
提问于 2011-11-23 04:42:10
回答 2查看 4.8K关注 0票数 2

我在使用AES-128/ecb/PKCS5Padd+base64加密数据时遇到了问题。我使用以下代码来加密我的数据:

代码语言:javascript
复制
String input = "{\"action\":\"getQuestion\"}";
String key = "4288f0b8060ca1b682bf795f2617cfdc";
byte[] data = input.getBytes();
byte[] encrypted = null;
byte[] keyBytes = new BigInteger(key, 16).toByteArray();
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
encrypted = cipher.doFinal(data);
System.out.println(Base64.encodeBytes(encrypted));

我在加密后收到6GuKXA6FFR+yMmO8ksAEOLL5e574a5tLob7tt5IG+jk=,但我不能在服务器上使用PHP函数解密。

当我使用PHP函数加密这些数据时:

代码语言:javascript
复制
function encrypt($encrypt, $key=null) 
{
   $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_RAND);
   $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $encrypt, MCRYPT_MODE_ECB, $iv));
   return $encrypted;
}

我收到了6Wc3LPWvfJ7T86iG0igmdQaeZ8xs9qY419mAVWfNH+M=,我可以使用以下PHP函数成功解密:

代码语言:javascript
复制
function decrypt($decrypt, $key=null) 
{
   $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_RAND);
   $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($decrypt), MCRYPT_MODE_ECB, $iv);
   return $decrypted;
}

使用base64加密和解密没有问题;我只有在使用AES-128加密时才会遇到这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-23 04:50:59

问题并不是像我最初想的那样是静脉注射或软垫的问题。关键在于如何处理PHP代码中的键。如果您使用实际的字符串4288f0b8060ca1b682bf795f2617cfdc作为传递给mcrypt_encryptmcrypt_decrypt的键,那么您使用的键与Java代码中的键不同。您需要将该十六进制字符串转换为字节。您可以通过以下方式完成此操作:

代码语言:javascript
复制
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, pack("H*", $key), base64_decode($decrypt), MCRYPT_MODE_ECB, $iv);

注意添加了pack("H*", $key)来转换值。我在PHP bin2hex函数的注释中发现了here。这将解决当前的问题。当处理不同长度的数据时,你可能会遇到填充问题,因为PHP不做PKCS5填充。有关实现该缺失函数的信息,请参阅this注释。此外,我建议研究CBC而不是ECB,因为ECB不适合进行数据加密,并且存在弱点。

票数 1
EN

Stack Overflow用户

发布于 2011-11-23 06:19:18

您可以在命令行中使用openssl验证Java方法的输出。如果没有指定,Java会默认你的IV为0。

代码语言:javascript
复制
The file "enc.txt" contains "6GuKXA6FFR+yMmO8ksAEOLL5e574a5tLob7tt5IG+jk=" [corrected]

代码语言:javascript
复制
openssl aes-128-ecb -in enc.txt -a -K 4288f0b8060ca1b682bf795f2617cfdc -iv 0 -d

结果是:

代码语言:javascript
复制
{"action":"getQuestion"}

尝试使用$iv值为0的mcrypt_decrypt。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8233553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档