对于一个项目,我应该在php上加密字符串,就像在java端加密代码块一样。下面是java代码。input是要加密的字符串,key是加密密钥。
MessageDigest digest;
try {
digest = MessageDigest.getInstance("MD5");
byte[] md5key = digest.digest(key.getBytes("UTF-8"));
Cipher cipher = Cipher.getInstance("DESEDE/ECB/PKCS5Padding");
SecretKeySpec myKey = new SecretKeySpec(md5key, "DESede");
cipher.init(Cipher.ENCRYPT_MODE, myKey);
try {
byte[] encryptedPlainText = cipher.doFinal(input.getBytes());
String encrypted = Base64.encodeToString(encryptedPlainText, 0);
return encrypted;
}
}这是我尝试加密字符串的php代码。"encryptText_3des“函数获取字符串和密钥,并返回加密字符串。
function encryptText_3des($plainText, $key) {
$key = hash("md5", $key, true);
$padded = pkcs5_pad($plainText, mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_ECB));
$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_3DES, $key, $padded, MCRYPT_MODE_ECB));
return $encrypted;
}
function pkcs5_pad ($text, $blocksize)
{
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}java和php代码的输出字符串不一致。我到底漏掉了什么?
谢谢..。
发布于 2014-12-18 04:15:50
问题是PHP似乎使用了自己专有的键扩展机制。它不使用16字节作为DES ABA密钥(16字节),而是简单地用0值字符扩展密钥,直到它有24个字节可用作DES ABC密钥。
如果您想使用16字节密钥的DES EDE,那么您应该在密钥的末尾重复密钥的前8个字节(从MD5检索):
$key = hash("md5", $key, true);
$key = $key . substr($key, 0, 8);https://stackoverflow.com/questions/27530067
复制相似问题