2013-09-01 67 views
1

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

<? 
$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代码中的确切等价物。有任何想法吗?有没有人需要做类似的事情?

感谢,
伊拿克里斯

+0

您可能会使用OpenSSL函数。这些可能会更便携。 http://php.net/manual/en/function.openssl-encrypt.php –

+0

@ConnorPeet注意,默认情况下,OpenSSL使用它自己的密钥派生函数('EVP_BytesToKey')。这不是在默认的Java库中可以找到的。 –

+0

谢谢你的评论,但是,我很可能没有太多的控制PHP集成上发生的事情。我的目标是尝试在Java中实现PHP方面。不过我会向他们提及OpenSSL的功能。 – Iraklis

回答

0

考虑与加密的三个主要的东西是算法,模式和填充。那些必须在加密和解密软件之间兼容才能使所有工作都可用。

首先,AESRijndael)肯定推荐使用DES作为加密算法。 DES已不再足够安全。您发布链接的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"应该做的伎俩。

当然,如果您正在加密的数据可以以空字节结尾,则零填充可以是problematic

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

+0

嗨拉兹,非常感谢你的回答。当然我明白我发布的Java代码是使用不同的算法,我只是想展示代码的主要结构。至于通过AES的AES和通过EBC的CBC,我已经阅读了关于DES的弱点,但不幸的是,我无法控制整合的PHP部分,并且开发人员很可能会坚持使用DES 。因此,如果我使用了我发布的Java代码,但是我更改为新的SecretKeySpec(key.getBytes(),“DES”);和Cipher.getInstance(“DES/CBC/0”); /解密是兼容的? – Iraklis

+0

或者没有办法在Java中使用零填充,我将不得不在PHP代码中包含PKCS5填充? – Iraklis

+0

我在Java中添加了关于零填充的信息。 – laz