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转换等信息

你可能感兴趣的:(java、php 中 des3 加密、解密)