java 中3DES加密、解密
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
/**
* java des 加解密
* java 加密時沒有使用iv,php解密時也可爲空
*/
public class DESUtils {
// 加密
public static String encrypt(String src, String key) {
try {
DESedeKeySpec dks = new DESedeKeySpec(key.getBytes("UTF-8"));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
SecretKey securekey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.ENCRYPT_MODE, securekey);
byte[] b = cipher.doFinal(src.getBytes("UTF-8"));
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(b);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
// 解密
public static String decrypt(String src, String key) {
try {
// --通過base64,將字符串轉成byte數組
BASE64Decoder decoder = new BASE64Decoder();
byte[] bytesrc = decoder.decodeBuffer(src);
// --解密的key
DESedeKeySpec dks = new DESedeKeySpec(key.getBytes("UTF-8"));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
SecretKey securekey = keyFactory.generateSecret(dks);
// --Chipher對象解密
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.DECRYPT_MODE, securekey);
byte[] retByte = cipher.doFinal(bytesrc);
return new String(retByte, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
php中3DES加密、解密
public static function encrypt3DES($str, $key)
{
$sign = openssl_encrypt($str, 'DES-EDE3', $key, OPENSSL_RAW_DATA);
return base64_encode($sign);
}
//上面的java加密也可用php解密
public static function decrypt3DES($str, $key)
{
return openssl_decrypt(base64_decode($str), 'DES-EDE3', $key, OPENSSL_RAW_DATA);
}
建議php中使用AES進行加解密
public function encryptAES($data,$key)
{
return openssl_encrypt($data, 'AES-128-ECB',$key);
}
public function decryptAES($data,$key)
{
return openssl_decrypt($data, 'AES-128-ECB', $key);
}
不同的算法(比如AES、3DES、DES)也都對應了很多不同的模式,可以使用 openssl_get_cipher_methods() 來查看所有的模式,如上面例子中的AES算法使用的是 AES-128-ECB 模式,該模式就可以不設置iv(向量),但如果使用的是 AES-128-CBC 就必須設置一個16位的iv。
在實際應用中無論是java、php、還是混合加解密,都需要清楚使用了哪種算法、哪種模式,key、iv、有無base64轉換等信息