21,886
社区成员
发帖
与我相关
我的任务
分享
/**
* 3des加密
*
* @param key 密钥
* @param data 明文数据 16进制且长度为16的整数倍不足时补0
* @return 密文数据
*/
public static byte[] Union3DesEncrypt(byte[] key, byte[] data) {
try {
byte[] k = new byte[24];
if (key.length == 16) {
System.arraycopy(key, 0, k, 0, key.length);
System.arraycopy(key, 0, k, 16, 8);
} else {
System.arraycopy(key, 0, k, 0, 24);
}
byte[] buff = EncodeUtils.complementZero(data);
KeySpec ks = new DESedeKeySpec(k);
SecretKeyFactory kf = SecretKeyFactory.getInstance("DESede");
SecretKey ky = kf.generateSecret(ks);
Cipher c = Cipher.getInstance("DESede/ECB/NoPadding");
c.init(Cipher.ENCRYPT_MODE, ky);
return c.doFinal(buff);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 3des解密
*
* @param key 密钥
* @param data 密文数据 16进制且长度为16的整数倍
* @return 明文数据
*/
public static byte[] Union3DesDecrypt(byte[] key, byte[] data) {
try {
byte[] k = new byte[24];
if (key.length == 16) {
System.arraycopy(key, 0, k, 0, key.length);
System.arraycopy(key, 0, k, 16, 8);
} else {
System.arraycopy(key, 0, k, 0, 24);
}
KeySpec ks = new DESedeKeySpec(k);
SecretKeyFactory kf = SecretKeyFactory.getInstance("DESede");
SecretKey ky = kf.generateSecret(ks);
Cipher c = Cipher.getInstance("DESede/ECB/NoPadding");
c.init(Cipher.DECRYPT_MODE, ky);
return c.doFinal(data);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
class TripleDesEcb{
/**加密
* @param $text string 文本内容
* @param $key string 秘钥 max 24
* @return string
*/
public function encrypt($text,$key)
{
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_TRIPLEDES,MCRYPT_MODE_ECB), MCRYPT_RAND);
$text = $this->pkcs5Pad($text);
$td = mcrypt_module_open(MCRYPT_3DES,'',MCRYPT_MODE_ECB,'');
mcrypt_generic_init($td,$key,$iv);
$data = base64_encode(mcrypt_generic($td, $text));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
print_r($data);
return $data;
}
/**解密
* @param $text
* @param $key
*/
public function decrypt($text,$key)
{
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_TRIPLEDES,MCRYPT_MODE_ECB), MCRYPT_RAND);
$td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_ECB, '');
mcrypt_generic_init($td, $key, $iv);
$data = $this->pkcs5UnPad(mdecrypt_generic($td, base64_decode($text)));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
print_r($data);
}
/**
* @param $text
* @return string
*/
private function pkcs5Pad($text)
{
$pad = 8 - (strlen($text) % 8);
return $text . str_repeat(chr($pad), $pad);
}
/**
* @param $text
* @return bool|string
*/
private function pkcs5UnPad($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);
}
}
include('TripleDesEcb.class.php');
$a = new TripleDesEcb();
$r = $a->encrypt('1234567890','97d8e63a7b8c90cb97d8e63a');
生成的密文:6pxoN39+75TAB7UZpSGuNQ==,与java生成的密文,前11位相同,后13位不同。用在线生成工具http://tool.chacuo.net/crypt3des,以相同的条件加密也是一样的结果,如果填充用原来的pkcs5padding-->zeropadding,则生成的密文与java一致class Crypt3Des
{
public $key = "xxxxxxxxxxxxxxx"; //密钥 要与java的转化成的16进制字符串对应
//数据加密
function encrypt($input)
{
$size = mcrypt_get_block_size(MCRYPT_3DES,'ecb');
$input = $this->pkcs5_pad($input, $size);
$key = str_pad($this->key,24,'0');
$td = mcrypt_module_open(MCRYPT_3DES, '', 'ecb', '');
$iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
@mcrypt_generic_init($td, $key, $iv);
$data = mcrypt_generic($td, $input);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$data = base64_encode($data);
return $data;
}
//数据解密
function decrypt($encrypted)
{
$encrypted = base64_decode($encrypted);
$key = str_pad($this->key,24,'0');
$td = mcrypt_module_open(MCRYPT_3DES,'','ecb','');
$iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td),MCRYPT_RAND);
$ks = mcrypt_enc_get_key_size($td);
@mcrypt_generic_init($td, $key, $iv);
$decrypted = mdecrypt_generic($td, $encrypted);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$y=$this->pkcs5_unpad($decrypted);
return $y;
}
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);
}
}