【安卓学习之Cipher类】加密和解密

█ 【安卓学习之Cipher类】加密和解密

█ 相关文章:

- 
 ● 【安卓学习之第三方库】库的使用2-jar类库的使用(以dom4j为例)和升级(以极光推送为例)

█ 读前说明:

- 
 ● 本文通过学习别人写demo,学习一些课件,参考一些博客,’学习相关知识,如果涉及侵权请告知
 ● 本文只简单罗列相关的代码实现过程
 ● 涉及到的逻辑以及说明也只是简单介绍,主要当做笔记,了解过程而已

█ 加密和解密:

- 
 ● 加密:
  key:加密用的Key 可以用26个字母和数字组成 此处使用AES-128-CBC加密模式,key需要为16位。
  ivParameter:偏移量,可增加加密算法的强度
  src:要加密的字符串:如手机号、身份证、住址、密码等

    public String encrypt(String key,String ivParameter,String src) {
        try {
            // 定义加密算法,通过AES算法得到加密后的密钥
            SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
            // 使用CBC模式,需要一个向量iv,可增加加密算法的强度
            IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());
            // 创建 Cipher 对象,并用密钥和一组算法参数初始化
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, keySpec , iv);// 用于将 Cipher 初始化为加密模式的常量
            // 按单部分操作加密或解密数据
            byte[] encrypted = cipher.doFinal(src.getBytes("utf-8"));
            // 字符串进行Base64编码,同 Base64.encodeToString(),返回值类型不同
            byte[] encode = Base64.encode(encrypted, Base64.DEFAULT);
            return new String(encode).trim();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

● 解密:
   key:加密用的Key 可以用26个字母和数字组成 此处使用AES-128-CBC加密模式,key需要为16位。
  ivParameter:偏移量,可增加加密算法的强度
  src:要解密的字符串:如手机号、身份证、住址、密码等

    public String decrypt(String key,String ivParameter,String src) {
        try {
        	// 定义加密算法,通过AES算法得到加密后的密钥
            SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
            // 使用CBC模式,需要一个向量iv,可增加加密算法的强度
            IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());
            // 创建 Cipher 对象,并用密钥和一组算法参数初始化
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, keySpec , iv);// 用于将 Cipher 初始化为加密模式的常量
            // 字符串进行Base64解码
            byte[] encrypted1 = Base64.decode(src.getBytes(), Base64.DEFAULT);
            // 按单部分操作加密或解密数据
            byte[] original = cipher.doFinal(encrypted1);
            String originalString = new String(original, "utf-8");
            return originalString;
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return "";
    }

█ 小测试:

- 
 ● String.getBytes():
  String.getBytes():得到一个操作系统默认的编码格式(utf-8)的字节数组
  String.getBytes(String decode):根据指定的decode编码返回某字符串在该编码下的byte数组表示

    System.out.println("0:" +new Gson().toJson( "123abc".getBytes()));
    System.out.println("1:" +new Gson().toJson( "123abc".getBytes("ASCII")));
    System.out.println("2:" + new Gson().toJson( "123abc".getBytes("UTF-8")));

    System.out.println("3:" +new Gson().toJson( "你好".getBytes()));
    System.out.println("4:" +new Gson().toJson( "你好".getBytes("ASCII")));
    System.out.println("5:" + new Gson().toJson( "你好".getBytes("UTF-8")));

    System.out.println("6:" +new Gson().toJson( "你好,我好,大家好!".getBytes()));
    System.out.println("7:" +new Gson().toJson( "你好,我好,大家好!".getBytes("ASCII")));
    System.out.println("8:" + new Gson().toJson( "你好,我好,大家好!".getBytes("UTF-8")));
I/System.out: 0[49,50,51,97,98,99]
I/System.out: 1[49,50,51,97,98,99]
I/System.out: 2[49,50,51,97,98,99]

I/System.out: 3[-28,-67,-96,-27,-91,-67]
I/System.out: 4[63,63]
I/System.out: 5[-28,-67,-96,-27,-91,-67]

I/System.out: 6[-28,-67,-96,-27,-91,-67,-17,-68,-116,-26,-120,-111,-27,-91,-67,-17,-68,-116,-27,-92,-89,-27,-82,-74,-27,-91,-67,-17,-68,-127]
I/System.out: 7[63,63,63,63,63,63,63,63,63,63]
I/System.out: 8[-28,-67,-96,-27,-91,-67,-17,-68,-116,-26,-120,-111,-27,-91,-67,-17,-68,-116,-27,-92,-89,-27,-82,-74,-27,-91,-67,-17,-68,-127]

● 加密解密耗时多久?加密后长怎么样?

     // 需要加密的字串
     String src = "123abc";
     // 加密
     long startTime = System.currentTimeMillis();
     String encryptStr= encrypt("1234567890ABCDEF","1234567890ABCDEF",src);
     System.out.println("加密后的字串是:" + encryptStr);

     long useTime = System.currentTimeMillis() - startTime ;
     System.out.println("加密耗时:" + useTime + "毫秒");
     // 解密
     startTime = System.currentTimeMillis();
     String decryptStr= decrypt("1234567890ABCDEF","1234567890ABCDEF",encryptStr);
     System.out.println("解密后的字串是:" + decryptStr);
     useTime = System.currentTimeMillis() - startTime ;
     System.out.println("解密耗时:" + useTime + "毫秒");
    I/System.out: 加密后的字串是:3UyP43NU4eFvnpYV96U+gQ==
    I/System.out: 加密耗时:1毫秒
    I/System.out: 解密后的字串是:123abc
    I/System.out: 解密耗时:0毫秒
    I/System.out: 加密后的字串是:zWfYdUj5Qaaj1W77UoPDkg==
    I/System.out: 加密耗时:0毫秒
    I/System.out: 解密后的字串是:你好
    I/System.out: 解密耗时:0毫秒
    I/System.out: 加密后的字串是:zaINWveUBs3MBlnUHbhU8MoAYS/QqA1sysoQ/+DXDkk=
    I/System.out: 加密耗时:1毫秒
    I/System.out: 解密后的字串是:你好,我好,大家好!
    I/System.out: 解密耗时:0毫秒

█ 相关资料:

- 
 ● 1.2017-11-22 11:30:08 java中的Cipher类 (加密和解密)_许小珊的博客-CSDN博客
转载请注明出处:
https://blog.csdn.net/ljb568838953/article/details/108800966

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值