2013-04-09 132 views
1

我需要有一个基本的/简单的字符串加密(即低安全性不够好,我只是想避免这种通信是人类可读)我的Java客户端应用程序和PHP服务器之间。Java和PHP对称加密(DES)

我因此选择了对称DES加密,因为它不需要任何密钥交换(相同的密钥将服务器上的客户端和使用)+它不需要更长的密钥Java安全策略的更新。 我也编码/解码Base64的数据获取发送Http后。

不幸的是我的代码不作为解密的文字工作不匹配输入。

我的Java代码加密:

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); 
DESKeySpec keySpecEncrypt = new DESKeySpec(ParamsProvider.SERVER_ECRYPTION_SECRETKEY2); //Secret key is a byte[8] = {1, 2, 3, 4, 5, 6, 7, 8} 
SecretKey keyEncrypt = keyFactory.generateSecret(keySpecEncrypt); 

// Create the cipher 
Cipher desCipher = Cipher.getInstance("DES/CFB8/NoPadding"); 

// Initialize the cipher for encryption 
desCipher.init(Cipher.ENCRYPT_MODE, keyEncrypt); 

// Encrypt the text 
byte[] textEncrypted = desCipher.doFinal(data.getBytes("UTF-8")); 

//B64 encoding and return 
byte[] encryptedB64ByteArray = (new org.apache.commons.codec.binary.Base64()).encode(textEncrypted); 
return new String(encryptedB64ByteArray, "UTF8"); 

我的PHP代码解密:

function decrypt($message) { 
    $secret_key = array(1, 2, 3, 4, 5, 6, 7, 8); 
    $decodedMsg = base64_decode($message); 
    return base64_decode(mcrypt_decrypt(MCRYPT_DES, $key, $decodedMsg, MCRYPT_MODE_CFB)); 
} 

我最好的猜测是,我的Java和PHP EN /解密参数是不相等的(如CFB8模式)但我不知道如何解决这个问题。

任何帮助或提示将不胜感激(我已经失去了在这一个几个小时), 干杯, 托马斯

+0

我在这里猜测,但在java端加密,然后b64。在PHP上你解密然后解密b64。我认为,在PHP端你首先要做的decryptb64,然后解密步骤 – ITroubs 2013-04-09 12:29:12

+0

找到[这里](http://stackoverflow.com/questions/8530312/php-equivalent-for-java-triple-des-encryption - 解密),这可能会帮助你开始。 Java在这个问题中,PHP在答案中相当于。 – Jon 2013-04-09 12:30:10

回答

3

感谢提示。

不幸的是他们都没有为我工作。

我终于解决了它基于这种代码: https://github.com/stevenholder/PHP-Java-AES-Encrypt

干杯, 托马斯

+0

是什么?这段代码给了javax.crypto.BadPaddingException,你如何解决这个问题:https://github.com/stevenholder/PHP-Java-AES-Encrypt/issues/1 – 2015-11-13 17:41:41

1

您有太多选择的填充方法,阅读this 随着在PHP代码@Jon的链接你必须选择PKCS#5填充:

// Create the cipher 
Cipher desCipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 
0

我在RSA的情况下有同样的问题(java的:加密,PHP:解密), 解决了我问题如下:在keyPair生成中,将'initialize'值从512增加到1024.它起作用。 我跟着提示在这里:http://docs.oracle.com/javase/7/docs/api/javax/crypto/Cipher.html 它规定,每个Java的实现必须至少实现: ... RSA/ECB/PKCS1Padding(1024,2048) ... 所以也许的结果代码不兼容