我正在尝试使用PHP mcrypt函数解密由Java Triple DES函数加密的密钥,但是没有运气。在下面找到Java代码
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class Encrypt3DES {
private byte[] key;
private byte[] initializationVector;
public Encrypt3DES(){
}
public String encryptText(String plainText, String key) throws Exception{
//---- Use specified 3DES key and IV from other source --------------
byte[] plaintext = plainText.getBytes();
byte[] myIV = key.getBytes();
byte[] tdesKeyData = {(byte)0xA2, (byte)0x15, (byte)0x37, (byte)0x08, (byte)0xCA, (byte)0x62,
(byte)0xC1, (byte)0xD2, (byte)0xF7, (byte)0xF1, (byte)0x93, (byte)0xDF,
(byte)0xD2, (byte)0x15, (byte)0x4F, (byte)0x79, (byte)0x06, (byte)0x67,
(byte)0x7A, (byte)0x82, (byte)0x94, (byte)0x16, (byte)0x32, (byte)0x95};
Cipher c3des = Cipher.getInstance("DESede/CBC/PKCS5Padding");
SecretKeySpec myKey = new SecretKeySpec(tdesKeyData, "DESede");
IvParameterSpec ivspec = new IvParameterSpec(myIV);
c3des.init(Cipher.ENCRYPT_MODE, myKey, ivspec);
byte[] cipherText = c3des.doFinal(plaintext);
sun.misc.BASE64Encoder obj64=new sun.misc.BASE64Encoder();
return obj64.encode(cipherText);
}
public String decryptText(String encryptText, String key) throws Exception{
byte[] initializationVector = key.getBytes();
byte[] tdesKeyData = {(byte)0xA2, (byte)0x15, (byte)0x37, (byte)0x08, (byte)0xCA, (byte)0x62,
(byte)0xC1, (byte)0xD2, (byte)0xF7, (byte)0xF1, (byte)0x93, (byte)0xDF,
(byte)0xD2, (byte)0x15, (byte)0x4F, (byte)0x79, (byte)0x06, (byte)0x67,
(byte)0x7A, (byte)0x82, (byte)0x94, (byte)0x16, (byte)0x32, (byte)0x95};
byte[] encData = new sun.misc.BASE64Decoder().decodeBuffer(encryptText);
Cipher decipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
SecretKeySpec myKey = new SecretKeySpec(tdesKeyData, "DESede");
IvParameterSpec ivspec = new IvParameterSpec(initializationVector);
decipher.init(Cipher.DECRYPT_MODE, myKey, ivspec);
byte[] plainText = decipher.doFinal(encData);
return new String(plainText);
}
}
我想编写一个与上面的cryptoText Java函数等效的PHP函数。在生成由Java代码生成的用于加密的精确IV值时遇到困难,这是解密所必需的。
这等效于Java代码的PHP(我从The
reference的注释20-Sep-2006 07:56
中复制了PKCS#5-padding )mcrypt
function encryptText($plainText, $key) {
$keyData = "\xA2\x15\x37\x08\xCA\x62\xC1\xD2"
. "\xF7\xF1\x93\xDF\xD2\x15\x4F\x79\x06"
. "\x67\x7A\x82\x94\x16\x32\x95";
$padded = pkcs5_pad($plainText,
mcrypt_get_block_size("tripledes", "cbc"));
$encText = mcrypt_encrypt("tripledes", $keyData, $padded, "cbc", $key);
return base64_encode($encText);
}
function decryptText($encryptText, $key) {
$keyData = "\xA2\x15\x37\x08\xCA\x62\xC1\xD2"
. "\xF7\xF1\x93\xDF\xD2\x15\x4F\x79\x06"
. "\x67\x7A\x82\x94\x16\x32\x95";
$cipherText = base64_decode($encryptText);
$res = mcrypt_decrypt("tripledes", $keyData, $cipherText, "cbc", $key);
$resUnpadded = pkcs5_unpad($res);
return $resUnpadded;
}
function pkcs5_pad ($text, $blocksize)
{
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
function pkcs5_unpad($text)
{
$pad = ord($text{strlen($text)-1});
if ($pad > strlen($text)) return false;
if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;
return substr($text, 0, -1 * $pad);
}
但是,您应该注意一些问题:
String.getBytes()
未指明编码。如果您的明文包含非ASCII字符(如变音符号),则这会使代码不可移植,因为Java使用系统默认的字符集。如果您可以更改,我当然会这样做。我建议您在Java和PHP的两面都使用utf-8。当然,如果必须满足某些给定的要求,则无法更改方法。
本文向大家介绍java中DES加密解密,包括了java中DES加密解密的使用技巧和注意事项,需要的朋友参考一下 废话不多说,直接奉上代码: 代码一 代码二 以上就是本文关于DES加密解密的代码了,希望对大家学习java有所帮助。
本文向大家介绍java 实现DES 加密解密的示例,包括了java 实现DES 加密解密的示例的使用技巧和注意事项,需要的朋友参考一下 以上就是java 实现DES 加密解密的示例代码的详细内容,更多关于java des加密解密的资料请关注呐喊教程其它相关文章!
问题内容: 例如: 在这里,SQL Server 2000是否支持EncryptByPassPharase()函数?如果不是,那么在sql server 2000中是否有类似的功能?如何在sql server 2000中执行相同的操作? 问题答案: 不,函数EncryptByPassPharase()不支持SQL Server <2008。在Microsoft doc上已对此进行了详细介绍。您可以
本文向大家介绍Python基于DES算法加密解密实例,包括了Python基于DES算法加密解密实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python基于DES算法加密解密实现方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Python程序设计有所帮助。
本文向大家介绍java基于Des对称加密算法实现的加密与解密功能详解,包括了java基于Des对称加密算法实现的加密与解密功能详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java基于Des对称加密算法实现的加密与解密功能。分享给大家供大家参考,具体如下: Des 加密相关类介绍: SecureRandom 这个类是继承自java.util.Random 这个类 SecureRan
问题内容: 我正在尝试使用C#和Java加密相同的数据。如果数据超过7个字节,则Java和C#加密值不相同。 输入1: 一 java的输出: FrOzOp / 2Io8 = C#输出: FrOzOp / 2Io8 = 输入2: abc j: H9A / ahl8K7I = c#: H9A / ahl8K7I = 输入3: aaaaaaaa ( 问题 ) j: Gxl7e0aWPd7j6l7uIEu