java实现3des cbc加密解密操作(避坑指南)

最近遇到一个算法,是3des cbc的加密算法,用在线的工具跑出来一直有问题,有的不支持pkcs5,有的编码有问题,因此自己实现一下,我是java菜鸟,只为实现加密解密功能,至于代码规范问题先不考虑了,有大神也可以提一下宝贵意见,代码如下:

package PicCrypt;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.InvalidKeySpecException;
import javax.crypto.*;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;


public class DESedeCoder {
    //3des cbc解密,第一个参数是密文,第二个参数是秘钥,第三个参数是IV
    public static String decrypt(String arg1, String arg2, byte[] arg3) throws NoSuchPaddingException, InvalidAlgorithmParameterException, NoSuchAlgorithmException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException, InvalidKeySpecException {
        return new String(decrypt(Base64.decode(arg1),arg2.getBytes(),arg3));
    }

    public static byte[] decrypt(byte[] arg2, byte[] arg3, byte[] arg4) throws NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, InvalidAlgorithmParameterException, BadPaddingException, IllegalBlockSizeException, InvalidKeySpecException {
        SecretKey v3 = SecretKeyFactory.getInstance("DESede").generateSecret(new DESedeKeySpec(arg3));
        Cipher v0 = Cipher.getInstance("DESede/CBC/PKCS5Padding");
        v0.init(2, ((Key)v3), new IvParameterSpec(arg4));
        return v0.doFinal(arg2);
    }
    //3des cbc加密,第一个参数是明文,第二个参数是秘钥,第三个参数是IV
    public static String encrypt(String arg0, String arg1, byte[] arg2) {
        try {
            byte[] doFinal=encrypt(arg0.getBytes(), arg1.getBytes(), arg2);
            String encode=Base64.encode(doFinal);
            //return new String(encrypt(arg0.getBytes(), arg1.getBytes(), arg2))
            return encode;
        }
        catch(Exception v0) {
            v0.printStackTrace();
            return null;
        }
    }
    public static byte[] encrypt(byte[] arg2, byte[] arg3, byte[] arg4) throws Exception {
        SecretKey v3 = SecretKeyFactory.getInstance("DESede").generateSecret(new DESedeKeySpec(arg3));
        IvParameterSpec v0 = new IvParameterSpec(arg4);
        Cipher v4 = Cipher.getInstance("DESede/CBC/PKCS5Padding");
        v4.init(1, ((Key)v3), ((AlgorithmParameterSpec)v0));
        //byte res[]=v4.doFinal(arg2);
        //String encode=Base64.encode(res);
        return v4.doFinal(arg2);
    }

}

java不太会用,报啥错alt+enter傻瓜式修改了,主要是代码流程。

踩到的坑如下:

1,base64编码的问题,试了不少,最后用如上的base64库能正常跑

2,byte转string,String res=new String(bytedata);其中bytedata是byte类型数据,res为转换后的String类型数据

3,加密的时候,加密出来的byte类型数据bytedata,直接用base64编码,如下:

String encode=Base64.encode(butedata);

我将加密和解密后的数据再和网上在线工具加密解密后的数据进行了对比,也没啥问题。

你可能感兴趣的:(逆向,数据传输相关,java,算法,安全)