当前位置: 首页 > 面试题库 >

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

巫马承德
2023-03-14
问题内容

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

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函数加密此数据时:

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函数成功进行解密:

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加密时遇到问题。


问题答案:

问题不在于我最初想到的IV或填充。这与您如何处理PHP代码中的密钥有关。如果您使用实际的字符串4288f0b8060ca1b682bf795f2617cfdc作为传递给您的密钥mcrypt_encryptmcrypt_decrypt那么您将不会使用与Java代码中相同的密钥。您将需要将该十六进制字符串转换为字节。您可以通过以下方式执行此操作:

$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, pack("H*", $key), base64_decode($decrypt), MCRYPT_MODE_ECB, $iv);

注意添加了pack("H*", $key)转换值。我在这里的PHP
bin2hex函数注释中发现了这一点。这将解决当前问题。由于PHP不执行PKCS5填充,因此在处理不同长度的数据时可能会遇到填充问题。见这对实现该功能缺失评论。另外,由于ECB的不适合性和数据加密的弱点,我建议使用CBC而不是ECB。



 类似资料:
  • 我只想用这3种模式测试openSSL中的AES:128192和256密钥长度,但我解密的文本与我的输入不同,我不知道为什么。此外,当我传递一个巨大的输入长度(比如1024字节)时,我的程序显示。。。我的意见总是一样的,但这并不重要,至少现在是这样。代码如下: 编辑: 当我将输出大小更改为而不是时,我得到了结果: 那么,是否有可能存在Outpus大小和IV大小的问题?它们应该有什么尺寸(AES-CB

  • 最近,我终于(在stackoverflow的用户@WhozCraig的帮助下)开始在CBC模式下使用AES。现在,我想用AES IGE做同样的事情。我看了并尝试构建自己的测试。但是,我再次遇到了输入和输出大小合适的问题。其他一切都很好,因为我从以前的代码中复制了它:AES(aes-cbc-128、aes-cbc-192、aes-cbc-256)使用openssl C进行加密/解密。 现在,当我传递

  • 我使用< code>CommonCrypto来解密从服务器获取的加密MP3文件。实际上,服务器端使用带有CBC模式和< code>PKCS5Padding的AES 128位加密。所以我想用同样的方式解密它。 我使用下面的代码进行解密。 如何在此代码中指定CBC模式和? 预先感谢

  • 我在使用java AES/CBC/PKCS7Padding加密时遇到了问题。我已经在使用提供程序之前进行搜索和跟踪。但我还是无法得到正确的加密 假设要求是: 加密类型:对称 算法:AES 块大小=128Bit(16字节) 密码模式:CBC 填充模式:PKCS7 加密密钥长度:256 Bit(32字节) 向量初始化长度(IV):128 Bit(16字节) 示例: 普通数据=ABC123 加密数据(b

  • 我最近在Java中使用了AES CBC 128算法来加密数据。现在我需要用PHP重建算法,但我不知道如何重建,因为互联网上的PHP算法返回不同的结果。也许你能帮我。 这是要加密的Java代码: 这是我的php代码: 当我从java加密加密数据时,此结果无法在Php解密上解密。 你们能帮我构建一个PHP脚本吗?它可以返回与java加密相同的结果?

  • 我正在尝试在运行FreeRTOS的微处理器上使用mbedTLS加密一些文本。我正在使用带有PKCS7填充的AES 128 CBC。如果我尝试在mbedTLS中加密,并在文本少于16个字符时在Java中解密,则可以正常工作。我可以在Java中解密它,并且文本匹配。如果它更长,那么它就不再有效。我做错了什么? mbedTLS 代码: Java代码: Java抛出javax.crypto。BadPadd