█ 【安卓学习之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