【发布时间】:2019-09-18 21:32:37
【问题描述】:
我想将加密/解密从 JAVA 复制到 PHP。但我的问题结果不匹配。我对java一无所知,所以我试图理解java中的每一行代码并用PHP编写。
JAVA
secretkey: thisisasecretkey
import java.security.MessageDigest;
import java.util.Arrays;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
public class TDESEncrypter {
public String _encrypt(String message, String secretKey) throws Exception {
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] digestOfPassword = md.digest(secretKey.getBytes("utf-8"));
byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
SecretKey key = new SecretKeySpec(keyBytes, "DESede");
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] plainTextBytes = message.getBytes("utf-8");
byte[] buf = cipher.doFinal(plainTextBytes);
byte [] base64Bytes = Base64.encodeBase64(buf);
String base64EncryptedString = new String(base64Bytes);
return base64EncryptedString;
}
public String _decrypt(String encryptedText, String secretKey) throws Exception {
byte[] message = Base64.decodeBase64(encryptedText.getBytes("utf-8"));
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] digestOfPassword = md.digest(secretKey.getBytes("utf-8"));
byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
SecretKey key = new SecretKeySpec(keyBytes, "DESede");
Cipher decipher = Cipher.getInstance("DESede");
decipher.init(Cipher.DECRYPT_MODE, key);
byte[] plainText = decipher.doFinal(message);
return new String(plainText, "UTF-8");
}
}
以下是使用 java 的步骤,可能有助于在 PHP 中复制函数。
- 使用 sha1 创建哈希
- 使用 utf-8 编码将密钥(从凭证)转换为字节数组
- 用 xeroes、截断或用零填充(如有必要)填充第 2 步,使副本的指定长度为 24
使用 DESede 使用 step3 中的密钥字节初始化 Secretkey
使用 DESede 实例创建密码
- 初始化密码模式以使用步骤 4 中的密钥进行加密
- 将要加密的数据(用户名/密码)转换为 utf-8 编码的字节数组
- 使用步骤 6 密码加密步骤 7
- 将 step8 编码为 base 64 格式
- 将 step9 转换为最终字符串加密消息的字符串
到目前为止我做了什么,
function encrypt($data, $secret) {
$key = sha1(utf8_encode($secret), true); <-- Step 1 & 2
$iv = utf8_encode("jvz8bUAx"); <-- Do I use initialise vector on it?
$key .= substr($key, 0, 8);
$method = 'des-ede3-cbc'; //<-- Is this cypher method correct from the above?
if (strlen($data) % 8) {
$data = str_pad($data, strlen($data) + 8 - strlen($data) % 8, "\0");
}
$encrypted = openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv); //Force zero padding.
$encrypted = urlencode(base64_encode($encrypted)); // Added the urlencode.....
return $encrypted;
}
【问题讨论】:
-
如果您不向我们展示原始 Java 代码,我们无能为力 ????
-
如果您提供原始数据以及用于在 JAVA 中生成样本的“秘密”,也会很有帮助。但我想如果我们有 JAVA 代码,我们可以创建自己的...但是我们将不得不运行 JAVA...ai...
-
并且还向我们展示了您在 PHP 中得到了什么。
-
@RealSkeptic 我认为代码就在那里......对我来说看起来像 PHP。或者这不是你的意思?
-
不,我指的是 PHP 给出的 结果。
标签: java php encryption encryption-symmetric 3des