字符串加密PHP/Java


String encryption PHP/Java

因此,对于特定的项目,我需要能够像在另一个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代码中的内容完全等效的内容。有什么想法吗?你们中有人需要做类似的事情吗?

谢谢,
Iraklis

加密需要考虑的三个主要因素是算法、模式和填充。它们必须在加密和解密软件之间兼容,才能使一切正常工作。

首先,明确建议使用AESRijndael)而不是DES作为加密算法。CCD_ 4不再被认为是足够安全的。您发布链接的Java代码使用AES,因此它肯定与您显示的PHP代码不兼容。

此外,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解密的代码。希望这能对你有所帮助。