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

Java和PHP之间的加密不匹配

訾晋
2023-03-14
问题内容

我正在使用一个加密系统,该系统会将数据传递给第三方应用程序。加密用Java完成,解密用PHP完成。尽管进行了几次尝试,但我无法获得PHP应用程序打开的加密字符串。

为了进行测试,我创建了一个PHP脚本,该脚本也对数据进行了加密,因此可以比较Java和PHP加密的字符串。结果匹配到第21个字符,然后有所不同。这就是我所拥有的:

// Java - Encrypt
private String EncryptAES(String text,String key) throws Exception
    {
      SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES");

      // Instantiate the cipher
      Cipher cipher = Cipher.getInstance("AES");

      cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
      byte[] encrypted = cipher.doFinal(text.getBytes());

      String encrypttext = new BASE64Encoder().encode(encrypted);

      return encrypttext;
    }

RESULT: TeUZAFxoFoQy/roPm5tXyPzJP/TLAwR1aIGn2xHbZpsbY1qrKwXfO+F/DAqmeTwB0b8e6dsSM+Yy0zrQt22E2Q==

// PHP - Encrypt
<?php

$encrypt =  $crypt = openssl_encrypt($toCrypt,"AES256","key-32-char-long");
echo $encrypt;

?>

RESULT: TeUZAFxoFoQy/roPm5tXyC05wta1Z5YOXcq4OtgFoSbfVi/bHAuD6B5tDthT8EcGXQir08UAx0QvcqRJ2fJmbQ==

显然,因为部分字符串匹配,所以正在正确地执行某些操作,但是显然,由于其余部分都不匹配,所以并非所有内容都是正确的。另外,如果我尝试用PHP解密Java字符串,则不会发生任何事情:

// PHP - Decrypt
<?php
$toDecrypt = "TeUZAFxoFoQy/roPm5tXyPzJP/TLAwR1aIGn2xHbZpsbY1qrKwXfO+F/DAqmeTwB0b8e6dsSM+Yy0zrQt22E2Q==";
$decrypt = openssl_decrypt($toDecrypt,"AES256","<key-32-char-long>");
echo $decrypt;

?>

RESULT: <nothing>

有谁知道会发生什么事吗?


问题答案:

由于两个加密字符串都以相同的字符开头,因此看起来您在一个中使用了ECB,在另一个中使用了CBC。



 类似资料:
  • 问题内容: 我一直在寻找在PHP服务器和Java客户端之间加密数据的方法。单独地,代码工作正常,我想在PHP服务器上坚持使用OpenSSL。 在尝试解码PHP加密字符串时遇到错误时,您是否看到了我所缺少的任何内容: PHP: PHP输出: 加密之前:Hello World !!! 在Base64之前:SGVsbG8gV29ybGQhISE = 加密镜头:44 加密的b64:U21yMVRGQTdR

  • 我已经得到了这段python代码,我需要将其翻译成nodejs。python代码使用来自加密的pycrypto。在nodejs方面,我使用的是本机加密模块。加密字符串之间似乎不匹配。 上面的python代码输出 而下面的nodejs代码 输出 为什么他们不匹配?我做错什么了吗?

  • 问题内容: 嗨,我正在尝试弄清楚如何复制在C#中但在Java中完成的文本加密。在C#中,仍然让我感到困惑并且似乎无法找到答案的那部分代码是: 基本上,Java中的这段代码等效于什么? 更新: 使用提供的PasswordDeriveBytes代码(第二个代码段),我能够完美地复制C#代码。谢谢Maarten Bodewes。 但似乎无法使其跨平台运行。基本上设置了解码代码(我在C#3.5中无法更改)

  • 问题内容: 这是我的问题: 我有一个JAVA函数来生成加密的字符串。我必须在PHP中做同样的事情。 我的Java函数: 我的PHP函数: 这两个函数的返回值不相同。我注意到的是,在编码为base 64之前,两个函数的结果相同。因此,对我而言,问题不在于密钥的生成,而在于编码。 有人能帮忙吗? 问题答案: 答案在PHP函数hash_hmac 的文档中。 设置为TRUE时,输出原始二进制数据。FALS

  • 问题内容: 更新 我已经对C#代码进行了更改,因此它使用的块大小为256。但是现在,您好世界看起来像这样http://pastebin.com/5sXhMV11,我无法弄清楚应该使用rtrim()获得什么一团糟的最后。 另外,当您说IV应该是随机的时,您的意思是不要再使用一次相同的IV,否则我编码的方式错误吗? 再次感谢! 你好 我正在尝试使用在C#中加密的PHP解密字符串。我似乎无法让PHP使用

  • 我试图用JavaScript加密一个短字符串,用Java解密它。解密失败,我认为这是因为两个平台之间的块模式和/或填充不同。我尝试在Java和JavaScript中加密相同的字符串,结果不同,这表明确实存在差异。以下是创建键的Java代码: 这是我用来测试加密的Java代码: 我将公钥发送到JavaScript进程,并将其转换为ArrayBuffer,变量名为publicKey。我已经验证了Jav