PHP 和 Java �g用 Des 加密(ECB mode) ��鬏��Y料,要�_保�蛇�用同�拥�key加解密的�Y果一�印�
PHP code:
/**
* DES 加解密(ECB mode)
*/
class DesCrypt {
private $key;
/**
* DES 加解密(ECB mode)
* @param string $key 加密的key
*/
public function __construct($key) {
$this->key = $key;
}
/**
* 加密(ECB mode)
* @param string $str 要加密的�Y料
* @return string
* @throws \Exception
*/
public function encrypt($str) {
//�@得加密算法的分�M大小
$size = mcrypt_get_block_size('des', 'ecb');
//填充不足字��担��魅����L度必�是 n * 分�M大小
$str = $this->pkcs5Pad($str, $size);
$key = $this->key;
//打�_算法和模�M���的模�K
$td = mcrypt_module_open('des', '', 'ecb', '');
$key_max_len = mcrypt_enc_get_key_size($td);
if (strlen($key) > $key_max_len) {
throw new \Exception("key超�^最大�L度:{$key_max_len}");
}
//建立初始向量
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
//初始化加密所需的��n�^
//在 ECB 模式下,初始向量��被忽略, 在 CFB,CBC,STREAM,nOFB 和 OFB 模式下,必�提供初始向量
mcrypt_generic_init($td, $key, $iv);
//加密���
$data = mcrypt_generic($td, $str);
//清理指定加密模�M��n�^
mcrypt_generic_deinit($td);
//�P�]加密模�M
mcrypt_module_close($td);
//�⒓用芙Y果用base64��a
$data = base64_encode($data);
return $data;
}
/**
* 解密(ECB mode)
* @param string $str 要解密的密文
* @return string
* @throws \Exception
*/
public function decrypt($str) {
//��base64��a�Y果解�_
$str = base64_decode($str);
$key = $this->key;
//�@得加密算法的分�M大小
$td = mcrypt_module_open('des', '', 'ecb', '');
$key_max_len = mcrypt_enc_get_key_size($td);
if (strlen($key) > $key_max_len) {
throw new \Exception("key超�^最大�L度:{$key_max_len}");
}
//建立初始向量
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
//$ks = mcrypt_enc_get_key_size($td);
//初始化加密所需的��n�^
mcrypt_generic_init($td, $key, $iv);
//解密���
$decrypted = mdecrypt_generic($td, $str);
//清理指定加密模�M��n�^
mcrypt_generic_deinit($td);
//�P�]加密模�M
mcrypt_module_close($td);
//去除 pkcs5Pad 的填充值
$result = $this->pkcs5Unpad($decrypted);
return $result;
}
/**
* 填充不足字���
* 1.�⑻畛淞咳�chr��填充值
* 2.��好�M也再填充一�M
* @param string $text
* @param int $blocksize
* @return string
*/
private function pkcs5Pad($text, $blocksize) {
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
/**
* 去除 pkcs5Pad 的填充值
* @param string $text
* @return boolean
* @return 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);
}
}
$Des = new DesCrypt("12345678");
$encrypt_res = $Des->encrypt("test data"); //l9TN9Ln/71IvFRjlhD8PaQ==
$Des->decrypt($encrypt_res); //test data
�]:PHP要�_定有�b php-mcrypt
$ yum install php-mcrypt
Java Code:
import javax.crypto.*;
import java.security.*;
import javax.crypto.spec.*;
/**
* DES算法
*
* @author user
*/
public class DES {
/**
* 加密函��
*
* @param data 加密���
* @param key 密�
* @return 返回加密後的���
*/
public static byte[] encrypt(byte[] data, byte[] key) {
try {
// DES算法要求有一��可信任的�S�C�翟�
SecureRandom sr = new SecureRandom();
// �脑�始密������建DESKeySpec�ο�
DESKeySpec dks = new DESKeySpec(key);
// ��建一��密匙工�S,然後用它把DESKeySpec�D�Q成
// 一��SecretKey�ο�
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(dks);
// using DES in ECB mode
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
// 用密匙初始化Cipher�ο�
cipher.init(Cipher.ENCRYPT_MODE, secretKey, sr);
// �绦屑用懿僮�
byte encryptedData[] = cipher.doFinal(data);
return encryptedData;
} catch (Exception e) {
System.err.println("DES算法,加密���出�e!");
e.printStackTrace();
}
return null;
}
/**
* 解密函��
*
* @param data 解密���
* @param key 密�
* @return 返回解密後的���
*/
public static byte[] decrypt(byte[] data, byte[] key) {
try {
// DES算法要求有一��可信任的�S�C�翟�
SecureRandom sr = new SecureRandom();
// byte rawKeyData[] = /* 用某�N方法�@取原始密匙��� */;
// �脑�始密匙�����建一��DESKeySpec�ο�
DESKeySpec dks = new DESKeySpec(key);
// ��建一��密匙工�S,然後用它把DESKeySpec�ο筠D�Q成
// 一��SecretKey�ο�
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(dks);
// using DES in ECB mode
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
// 用密匙初始化Cipher�ο�
cipher.init(Cipher.DECRYPT_MODE, secretKey, sr);
// 正式�绦薪饷懿僮�
byte decryptedData[] = cipher.doFinal(data);
return decryptedData;
} catch (Exception e) {
System.err.println("DES算法,解密出�e。");
e.printStackTrace();
}
return null;
}
}
import javax.xml.bind.*;
public class desTest {
public static void main(String[] args) {
String key = "12345678"; //�O定加密 key
String plain = "test data";//加密�热菝魑�
byte[] key_byte = key.getBytes();
byte[] plain_byte = plain.getBytes();
//ECB mode 加密
byte[] data_ecb = DES.encrypt(plain_byte, key_byte);
//加密�Y果�BASE64��a
String base64String = DatatypeConverter.printBase64Binary(data_ecb);
System.out.println("ECB密文��^BASE64��a:" + base64String);
try {
byte[] b = DatatypeConverter.parseBase64Binary(base64String);
System.out.println("ECB解密後明文:" + new String(DES.decrypt(b, key_byte)));
} catch (Exception ex) {
System.out.println(ex.getMessage());
System.out.println(ex.toString());
}
}
}
//�出
ECB密文��^BASE64��a:l9TN9Ln/71IvFRjlhD8PaQ==
ECB解密後明文:test data
�⒖肌⒐��: