首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java和PHP之间的加密不匹配

Java和PHP之间的加密不匹配
EN

Stack Overflow用户
提问于 2012-05-04 22:44:48
回答 5查看 4.3K关注 0票数 2

我正在研究一种加密系统,可以将数据传递给第三方应用程序。加密是用Java完成的,解密是用PHP完成的。尽管进行了多次尝试,我还是无法获得PHP应用程序要打开的加密字符串。

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

代码语言:javascript
复制
// 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== 

代码语言:javascript
复制
// PHP - Encrypt
<?php

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

?>

RESULT: TeUZAFxoFoQy/roPm5tXyC05wta1Z5YOXcq4OtgFoSbfVi/bHAuD6B5tDthT8EcGXQir08UAx0QvcqRJ2fJmbQ==

显然,由于部分字符串匹配,所以某些操作是正确的,但显然不是所有的字符串都正确,因为其余的字符串不匹配。此外,如果我尝试在PHP中解密Java字符串,什么也不会发生:

代码语言:javascript
复制
// PHP - Decrypt
<?php
$toDecrypt = "TeUZAFxoFoQy/roPm5tXyPzJP/TLAwR1aIGn2xHbZpsbY1qrKwXfO+F/DAqmeTwB0b8e6dsSM+Yy0zrQt22E2Q==";
$decrypt = openssl_decrypt($toDecrypt,"AES256","<key-32-char-long>");
echo $decrypt;

?>

RESULT: <nothing>

有没有人知道可能会发生什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-05-04 23:32:36

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

票数 3
EN

Stack Overflow用户

发布于 2012-05-04 22:50:21

以下是一些备注:

  • 密钥大小在java程序
  • 中不明确,你有没有检查过这两个程序的分组密码操作模式是什么?CBC、ECB、OFB等。?有些程序可能需要使用IV才能通过加密数据。
  • 上一个想法: Java和PHP程序使用的填充是什么?

This document可以帮助您:您拥有密码/块密码模式/填充模式/密钥大小的所有有效组合。

票数 1
EN

Stack Overflow用户

发布于 2012-05-04 22:58:51

下面这个(在PHP中解密)怎么样:

代码语言:javascript
复制
$toDecrypt = "TeUZAFxoFoQy/roPm5tXyPzJP/TLAwR1aIGn2xHbZpsbY1qrKwXfO+F/DAqmeTwB0b8e6dsSM+Yy0zrQt22E2Q==";
$decrypt = openssl_decrypt(base64_decode($toDecrypt),"AES256","key-32-char-long");
echo $decrypt;

您应该解密base64解码的字符串,对于解密,您应该调用openssl_decrypt而不是openssl_encrypt :-)

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

https://stackoverflow.com/questions/10451068

复制
相关文章

相似问题

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