通过反射使用Base64进行数据加密及解密 (1)

通过反射使用Base64进行数据加密及解密

前言

和MD5,SHA不同的是Base64进行加密后还可以进行解密。JDK自带Base64,本文直接引用了Maven仓库,搞懂Base64后方便研究其他的加密方法。

Base64介绍

Base64是一种字符串编码格式,采用了A-Z,a-z,0-9,"+和"/"这64个字符来编码原始字符。一个字符本身是一个字节,占八位;但是Base64编码后一个字符只能表示六位的信息(2=64,六位足以包含所有的字符)。就是说原始字符串三个字节的信息进行编码后会变成四个字节的信息。

Base64编码的意义

有些网络传送渠道不支持所有的字节。例如图片二进制流的每个字节不可能全部都是可见字符,(在ASCII码表中,算上空格, 从32到126共95个是可见字符,不算上空格则为94个。也叫打印字符,即可以被直接打印出来的字符。剩下的则是不可见字符,即不可以被直接打印出来。)所以就传送不了。再比如传统邮件只支持可见字符的传送,这样就会使用途收到很大的限制。
最好的方法是在不改变传统协议的情况下,做一种扩展方案来支持二进制文件的传送。即把不可见的字符用可见字符的形式打印出来。Base64编码应运而生。

加密原理

字符串转为Base64码,会先把对应的字符串转化为ascll码对应的数字,然后把数字转化为2进制。转化后的二级制每六位提取一下,对应Base64编码表后就为编码后的字符串。

优势与劣势

×:Base64编码可以将3个字节的二进制数据编码为4个字节的文本数据,长度增加1/3。

√:编码后的文本数据可以直接在正文、网页等显示。

使用的Class文件

com.sun.org.apache.xml.internal.security.utils.Base64

Maven导入的Jar包

//编码加密
    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>1.10</version>
    </dependency>

进行加密

/**
     * 利用Base64进行加密
     */
    public static String enCode(byte[] bytes) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        String ab=null;
        //通过反射找到Base64加载的Class对象
        Class aClass = Class.forName("com.sun.org.apache.xml.internal.security.utils.Base64");
        //拿到加密的方法
        Method encode = aClass.getMethod("encode", byte[].class);
        //第一个参数注入要调用的对象,因为方法为静态,可以直接调用,所以可以直接写null;第二个参数写方法的形参;
         ab =(String) encode.invoke(null, bytes);
        return ab;
    }

进行解密

/**
     * 利用Base64进行解密
     * @param string
     * @return
     */
    public static byte[] deCode(String string) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        byte[] bytes=null;
        //通过反射找到Base64加载的Class对象
        Class deClass = Class.forName("com.sun.org.apache.xml.internal.security.utils.Base64");
        //获得解密的方法
        Method decode = deClass.getMethod("decode", String.class);
        //传参
        bytes = (byte[]) decode.invoke(null, string);
        return bytes;
    }

测试

String name="好好学习,天天向上!";
        String s=enCode(name.getBytes());
        byte[] bytes=deCode(s);
        System.out.println("编码后:"+s);
        System.out.println("解码后:"+new String(bytes));

结果

编码后:5aW95aW95a2m5Lmg77yM5aSp5aSp5ZCR5LiK77yB
解码后:好好学习,天天向上!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值