在JSP中加密字符串...在PHP中解密

时间:2009-04-21 18:20:38

标签: php jsp encryption

我必须在php中创建一个握手页面,该页面将采用为Java / JSP中的函数加密的查询字符串,并在应用程序中使用PHP解密它。

我发现这是一个很好的起点http://propaso.com/blog/?cat=6但它在PHP中加密并在PHP中解密,这与我需要做的相反。

任何人都知道PHP / JSP中常用的密码。从上面的链接看来,CBC似乎是一个答案,代码如下:

PHP密码/模式:

$cipher     = "rijndael-128";
$mode       = "cbc";

和JSP Cipher:

Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");

任何人都知道一个很好的链接,可以帮助我在JSP中对这个过程进行反转和加密,并在PHP中解密。

由于

2 个答案:

答案 0 :(得分:2)

您需要具有对于给定消息不可预测的IV。对IV进行硬编码使其具有可预测性。所以你需要设计一些方法来传递带有密文的IV。然而,与钥匙不同,IV不必保密。

分组密码对固定大小的明文块进行操作。如果您没有足够的明文输入,则必须以接收者可以区分填充与数据的方式填充。链接的示例完全忽略了这一点,这是一个错误。如果使用CipherOutputStream,则将从密文中静默截断部分最终块。如果直接使用Cipher对象,则部分块将导致doFinal方法引发异常。相反,使用类似PKCS5Padding的东西。

一个恰当的Java示例是这样的:

SecretKey secret = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret);
AlgorithmParameters param = cipher.getParameters();
/* In addition to ciphertext in "cos", recipient needs IV. */
byte[] iv = param.getParameterSpec(IvParameterSpec.class).getIV();
CipherOutputStream cos = new CipherOutputStream(output, cipher);
byte[] buf = new byte[2048];
while (true) {
  int n = input.read(buf, 0, buf.length);
  if (n < 0)
    break;
  cos.write(buf, 0, n);
}
cos.flush();

JSP接收明文要加密的位置在哪里?您希望JSP如何格式化其输出(包括IV)?

答案 1 :(得分:0)