java、php 中 des3 加密、解密

 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轉換等信息

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章