【问题标题】:Java & PHP symmetric encryption (DES)Java & PHP 对称加密 (DES)
【发布时间】:2016-11-22 18:13:59
【问题描述】:

我需要在我的 Java 客户端应用程序和 PHP 服务器之间进行基本/简单的字符串加密(即低安全性就足够了,我只是想避免通信是人类可读的)。

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

很遗憾,我的代码无法正常工作,因为解密的文本与输入不匹配。

我要加密的 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 加密/解密参数不相等(例如 CFB8 模式),但我不知道如何解决这个问题。

任何帮助或提示将不胜感激(我已经为此浪费了几个小时), 干杯, 托马斯

【问题讨论】:

  • 我在这里猜测,但在 java 端,你确实加密然后 b64。在你做解密然后解密b64的php上。我认为在 php 方面,您首先必须执行解密 b64,然后执行解密步骤
  • 找到 this 这可能会帮助您入门。 Java 在问题中,PHP 在答案中。

标签: java php encryption des


【解决方案1】:

感谢您的提示。

不幸的是,它们都不适合我。

我终于根据这段代码解决了: https://github.com/stevenholder/PHP-Java-AES-Encrypt

干杯, 托马斯

【讨论】:

【解决方案2】:

你也必须选择填充方法,阅读this 使用@Jon 链接中的 php 代码,您必须选择 PKCS#5-padding:

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

【讨论】:

    【解决方案3】:

    我在 RSA (java:encryption, php:decryption) 的上下文中遇到了同样的问题, 通过以下方式解决了我的问题:在 keyPair-generation 中,将“initialize”值从 512 增加到 1024。它可以工作。 我遵循的提示在这里:http://docs.oracle.com/javase/7/docs/api/javax/crypto/Cipher.html 它指出每个java实现必须至少实现: ... RSA/ECB/PKCS1填充(1024、2048) ... 所以可能密钥生成的结果不兼容

    【讨论】:

      猜你喜欢
      • 2011-08-29
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多