1

因此,对于一个特定的项目,我需要能够以与在另一个 PHP 应用程序中加密/解密相同的方式加密和解密字符串。我的应用程序是一个 Grails 应用程序,因此我将使用 Java 编写代码。在 PHP 端加密/解密字符串的方式是(示例代码,不一定是功能性的):

<?
$input="textToBeEncrypted";

function encrypt($data, $key)
{
$cipher_alg = MCRYPT_DES;
$mode = MCRYPT_MODE_CBC;
return @mcrypt_encrypt($cipher_alg, $key, $data, $mode);
}

function decrypt($encrypted, $key)
{
$cipher_alg = MCRYPT_DES;
$mode = MCRYPT_MODE_CBC;
return @mcrypt_decrypt($cipher_alg, $key, $encrypted, $mode);
}  

$key ="testKey";
$data=$input;
$result = decrypt($data, $key);
echo ">>" . $result . "<br>\n";
?>  

所以,我希望能够在 Java(或 Groovy)中应用相同的加密/解密。我找到了这个示例代码,https://github.com/stevenholder/PHP-Java-AES-Encrypt/blob/master/security.java我知道如果我设法在 Java 中找到算法和模式的名称,它应该工作。除非我遗漏了什么……我导航到用于加密算法的 Java 标准名称页面http://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html,但我可以'找不到与我在 PHP 代码中的完全等价的东西。有任何想法吗?你们有没有人需要做类似的事情?

谢谢,
伊拉克利斯

4

1 回答 1

0

加密要考虑的三个主要事项是算法、模式和填充。这些必须在加密和解密软件之间兼容才能正常工作。

首先,绝对推荐使用AES( )作为加密算法。不再被认为足够安全。您发布链接的 Java 代码正在使用,因此它肯定与您显示的 PHP 代码不兼容。RijndaelDESDESAES

另外,该 Java 代码ECB用于也不推荐的模式。ECB更容易,因为它不需要任何初始化向量的处理,但这也是它的失败。建议使用 PHP 代码CBC,尽管我没有看到任何明确的 IV 处理。在这种情况下,Mcrypt 将使用全零的 IV,这根本不理想。

最后,Java 代码使用PKCS5填充方法,而 PHP 代码使用零填充。那些不兼容。Oracle JDK 附带的默认提供程序不支持零填充,但Bouncy Castle支持(参见第 5.0 节)。这将需要直接使用 Bouncy Castle 的 API,或者使用该链接中详述的方法之一将其用作 JCE 提供程序。字符串"DES/CBC/ZeroByte"应该可以解决问题。

当然,如果您正在加密的数据可以以空字节结尾,则零填充可能会出现问题。

我在此之前已经回答了与此问题类似的问题,并在答案中提供了用于在 Java 中加密和在 PHP 中解密的代码。希望这可以帮助你。

于 2013-09-01T15:11:00.263 回答