我必须在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中解密。
由于
答案 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)