Android常用加解密算法总结

Android开发中对于数据的传输和保存一定会使用加密技术,加密算法是最普遍的安保手段,多数情况数据加密后在需要使用源数据时需要再进行解密,但凡是都有例外。下面从可逆加密、不可逆、不纯粹加密三种方式记录一下常见的加解密算法。

加密技术包括两个元素:算法和密钥:算法使用密钥将明文数据变成无法辨识的密文。

以下代码是点击事件里调用SecurityUtil工具类,加解密算法都再SecurityUtil中实现。

1、可逆加密:分为对称加密和非对加密

1.1对称加密

加密和解密使用的同一套密钥,包括:DES、3DES、AES等

以AES为例:

被加密的明文public static final String CONTENT = "suibianxie888888888";密钥public static final String SECRET_KEY = "6a8w0c91kc7";
public static final String SECRET_KEY_PREFIX = "aw098";aesTv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {try {String encryptAES = SecurityUtil.encryptAES( CONTENT, SECRET_KEY+SECRET_KEY_PREFIX);Log.e(TAG, "onClick: encryptAES= "+encryptAES );String value = SecurityUtil.decryptAES(encryptAES, SECRET_KEY+SECRET_KEY_PREFIX);Log.e(TAG, "onClick: decryptAES = "+value);}catch (Exception e){Log.e(TAG, "onClick: decryptAES -Exception= "+e.getMessage() );}}
});

    /*** AES加密* @throws Exception  此处实际有好多个Exception,偷懒直接抛Exception了*/public static String encryptAES(String data, String secretKey) {try {Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes(), "AES");IvParameterSpec ivSpec = new IvParameterSpec(secretKey.getBytes());cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);byte[] bEncData = cipher.doFinal(data.getBytes());
//            return com.android.api.utils.Base64.encode(bEncData);return Base64.encodeToString(bEncData, Base64.NO_WRAP);} catch (Exception e) {e.printStackTrace();return "";}}/*** AES 解密* @param cipherText* @param secretKey* @return* @throws Exception*/
public static String decryptAES(String cipherText, String secretKey){try {byte[] encrypted1 = Base64.decode(cipherText, Base64.NO_WRAP);Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes(), "AES");IvParameterSpec ivSpec = new IvParameterSpec(secretKey.getBytes());cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);byte[] original = cipher.doFinal(encrypted1);String originalString = new String(original);return originalString;} catch (Exception e) {e.printStackTrace();return null;}
}

AES加密和解密日志打印:

1.2  非对称加密

加密和解密分别使用不同的密钥,包括:SM2、SM4、RSA

2、不可逆加密

无解,理论上谁都别想解开,包括:MD5、SHA系列,MD5和SHA系列,SHA-1之外的SHA系列称作SHA2算法,SHA系列比MD5安全性更高而SHA2的都高于SHA-1。SHA-x 后面的x代表加密后的字符串长度,SHA-1加密后固定160位。常用于用户密码和文件完整性校验。

2.1 MD5加密

拥有以下特质:

压缩性:无论多大加密后都生成128位(16字节)的数据,通常用它的16进制字面值输出是一个32位长度的字符串;  

容易计算性质:通过原数据很容易计算出MD5值;   

抗修改性:随便修改一个字节重新计算的MD5值千差万别;   

抗碰撞性:知道数据和MD5值,很小概率找到相同MD5值的原数据。

public static final String CONTENT = "suibianxie888888888";md5Tv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Log.e(TAG, "onClick: md5Tv-string= "+ SecurityUtil.encryptMD5(CONTENT) );Log.e(TAG, "onClick: md5Tv-bytes1= "+SecurityUtil.encryptMD5Bytes(CONTENT.getBytes()) );}
});
// 16进制下数字到字符的映射数组
public static String[] hexDigits = new String[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9","a", "b", "c", "d", "e", "f" };// 对字符串进行MD5编码
public static String encryptMD5(String originstr) {if (originstr != null) {return encryptMD5Bytes(originstr.getBytes());}else {return null;}
}public static String encryptMD5Bytes(byte[] originstr) {if (originstr != null) {try {// 创建具有指定算法名称的信息摘要MessageDigest md = MessageDigest.getInstance("MD5");// 使用指定的字节数组对摘要进行最后的更新,然后完成摘要计算byte[] results = md.digest(originstr);// 将得到的字节数组编程字符串返回String resultString = byteArrayToHexString(results);return resultString.toUpperCase();} catch (Exception ex) {ex.printStackTrace();}}return null;
}// 转换字节数组为十六进制字符串
public static String byteArrayToHexString(byte[] b) {StringBuffer resultsb = new StringBuffer();int i = 0;for (i = 0; i < b.length; i++) {resultsb.append(byteToHexString(b[i]));}return resultsb.toString();
}
//以下代码是对字符串进行MD5加密的相关代码// 将字节转化成十六进制的字符串
private static String byteToHexString(byte b) {int n = b;if (n < 0) {n = 256 + n;}int d1 = n / 16;int d2 = n / 16;return hexDigits[d1] + hexDigits[d2];
}

MD5日志:

SHA1和SHA256:

public static final String CONTENT = "suibianxie888888888";sha1Tv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//SHA1算法String fileSHA1 = SecurityUtil.getFileSHA1(CONTENT);Log.e(TAG, "onClick:  sha1Tv="+fileSHA1 );//SHA256算法String sha_256 = SecurityUtil.SHA_256(CONTENT);Log.e(TAG, "onClick:  sha_256="+sha_256 );}
});

// 获取文件的SHA1值
public static String getFileSHA1(String text) {if (text.isEmpty()){return "";}try{text = text.trim();byte[] bytes = text.getBytes("UTF-8");return getFileSHA1(bytes);}catch (Exception e){return "";}
}// 获取文件的SHA1值
public static String getFileSHA1(byte[] bytes) {StringBuffer strResult = new StringBuffer();MessageDigest md;try {md = MessageDigest.getInstance("SHA-1");md.update(bytes);byte[] encryptedBytes = md.digest();String stmp;for (int n = 0; n < encryptedBytes.length; n++) {stmp = (Integer.toHexString(encryptedBytes[n] & 0XFF));if (stmp.length() == 1) {strResult.append("0");strResult.append(stmp);} else {strResult.append(stmp);}}return strResult.toString();} catch (Exception e) {return "";}
}/*** SHA加密* @param strText 明文* @return*/
public static String SHA_256(final String strText){// 返回值String strResult = null;// 是否是有效字符串if (strText != null && strText.length() > 0){try{// SHA 加密开始MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");// 传入要加密的字符串messageDigest.update(strText.getBytes());byte byteBuffer[] = messageDigest.digest();StringBuffer strHexString = new StringBuffer();for (int i = 0; i < byteBuffer.length; i++){String hex = Integer.toHexString(0xff & byteBuffer[i]);if (hex.length() == 1){strHexString.append('0');}strHexString.append(hex);}strResult = strHexString.toString();} catch (NoSuchAlgorithmException e) {e.printStackTrace();}}return strResult;
}

SHA1和SHA256算法日志打印:

3、不纯粹加密

Base64,经它运算后表面看是变形了,但不属于真的加密,开发中也经常遇到。一种不算严格意义上的加解密,把字符串转换成以"=="双等号结尾的串。

未完结,持续更新中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/37165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【使用sudo apt-get出现报错】——无法获得锁 /var/lib/dpkg/lock-open(11:资 源暂时不可用) ,是否有其他进程正占用它?

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、ubuntu中进程正在被占用1. 问题描述2. 原因分析3. 解决 总结 前言 一、ubuntu中进程正在被占用 1. 问题描述 在Ubuntu中&#xff0c;使用终端时输入带有…

昇思25天学习打卡营第7天之二 | 模型保存与加载

1. 保存与加载 在训练网络模型的过程中&#xff0c;实际上我们希望保存中间和最后的结果&#xff0c;用于微调&#xff08;fine-tune&#xff09;和后续的模型推理与部署&#xff0c;本章节我们将介绍如何保存与加载模型。 1.1 导入依赖 # 导入numpy库&#xff0c;并将其重命…

六月,允许自己做自己,别人做别人

今天结束后&#xff0c;2024 就过去一半了。 年初的规划完成一半了吗&#xff1f;如果没有也没关系&#xff0c;做你自己继续前进。 家人来北京旅游&#xff0c;我累趴了 六月初&#xff0c;我搬家了&#xff0c;这次租了一整套房&#xff0c;是一个小俩居、还带一个小阁楼。…

数学学习与研究杂志社《数学学习与研究》杂志社2024年第6期目录

课改前沿 基于核心素养的高中数学课堂教学研究——以“直线与圆、圆与圆的位置关系”为例 张亚红; 2-4 核心素养视角下初中生数学阅读能力的培养策略探究 贾象虎; 5-7 初中数学大单元教学实践策略探索 耿忠义; 8-10《数学学习与研究》投稿&#xff1a;cn7kantougao…

使用Python绘制极坐标图

使用Python绘制极坐标图 极坐标图极坐标图的优点使用场景 效果代码 极坐标图 极坐标图&#xff08;Polar Chart&#xff09;是一种图表类型&#xff0c;用于显示在极坐标系中的数据。极坐标图使用圆形坐标系&#xff0c;角度表示一个变量的值&#xff0c;半径表示另一个变量的…

线程安全问题(二)——死锁

死锁 前言可重入锁逻辑 两个线程两把锁&#xff08;死锁&#xff09;死锁的特点多个线程多把锁&#xff08;哲学家就餐问题&#xff09;总结 前言 在前面的文章中&#xff0c;介绍了锁的基本使用方式——锁 在上一篇文章中&#xff0c;通过synchronized关键字进行加锁操作&am…

XML简介XML 使用教程XML的基本结构XML的使用场景

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

VMware每次打开网络设置都出现需要运行NetworkManager问题

每次打开都出现这个情况&#xff0c;是因为之前把NetworkManager服务服务关闭&#xff0c;重新输入命令&#xff1a; sudo systemctl start NetworkManager.service或者 sudo service network-manager restart 即可解决&#xff0c;但是每次开机重启都要打开就很麻烦&#xf…

【Chapter4】汇编语言及其程序设计,《微机系统》第一版,赵宏伟

一、汇编语言概述 **指令&#xff1a;**指使计算机完成某种操作的命令。 **程序&#xff1a;**完成某种功能的指令序列。 **软件&#xff1a;**各种程序总称。 **机器语言&#xff1a;**计算机能直接识别的语言。用机器语言写出的程序称为机器代码。 **汇编语言&#xff1…

Forecasting from LiDAR via Future Object Detection

Forecasting from LiDAR via Future Object Detection 基础信息 论文&#xff1a;cvpr2022paper https://openaccess.thecvf.com/content/CVPR2022/papers/Peri_Forecasting_From_LiDAR_via_Future_Object_Detection_CVPR_2022_paper.pdfgithub&#xff1a;https://github.co…

SyncUnsafeCell替换Mutex提高性能

1. 背景 在Rust开发过程中&#xff0c;很多情况下需要在不可变的情况下获取可变性或者在多线程的情况下可以安全的贡献可变数据。这种情况下我们一般使用**Mutex来实现通过加锁来实现。现在我们可以通过使用SyncUnsafeCell来替代Mutex**。 2. SyncUnsafeCell SyncUnsafeCell…

K8S之网络深度剖析(一)(持续更新ing)

K8S之网络深度剖析 一 、关于K8S的网络模型 在K8s的世界上,IP是以Pod为单位进行分配的。一个Pod内部的所有容器共享一个网络堆栈(相当于一个网络命名空间,它们的IP地址、网络设备、配置等都是共享的)。按照这个网络原则抽象出来的为每个Pod都设置一个IP地址的模型也被称作为I…

SpringBoot(一)创建一个简单的SpringBoot工程

Spring框架常用注解简单介绍 SpringMVC常用注解简单介绍 SpringBoot&#xff08;一&#xff09;创建一个简单的SpringBoot工程 SpringBoot&#xff08;二&#xff09;SpringBoot多环境配置 SpringBoot&#xff08;三&#xff09;SpringBoot整合MyBatis SpringBoot&#xff08;四…

3.ROS串口实例

#include <iostream> #include <ros/ros.h> #include <serial/serial.h> #include<geometry_msgs/Twist.h> using namespace std;//运行打开速度控制插件&#xff1a; rosrun rqt_robot_steering rqt_robot_steering //若串口访问权限不够&#xff1a…

详解PEFT库中LoRA源码

前言 GitHub项目地址Some-Paper-CN。本项目是译者在学习长时间序列预测、CV、NLP和机器学习过程中精读的一些论文&#xff0c;并对其进行了中文翻译。还有部分最佳示例教程。如果有帮助到大家&#xff0c;请帮忙点亮Star&#xff0c;也是对译者莫大的鼓励&#xff0c;谢谢啦~本…

读书笔记-《Spring技术内幕》(三)MVC与Web环境

前面我们学习了 Spring 最核心的 IoC 与 AOP 模块&#xff08;读书笔记-《Spring技术内幕》&#xff08;一&#xff09;IoC容器的实现、读书笔记-《Spring技术内幕》&#xff08;二&#xff09;AOP的实现&#xff09;&#xff0c;接下来继续学习 MVC&#xff0c;其同样也是经典…

Spring底层原理之bean的加载方式八 BeanDefinitionRegistryPostProcessor注解

BeanDefinitionRegistryPostProcessor注解 这种方式和第七种比较像 要实现两个方法 第一个方法是实现工厂 第二个方法叫后处理bean注册 package com.bigdata1421.bean;import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.…

解决idea中git无法管理项目中所有需要管理的文件

点击文件->设置 选择版本控制—>目录映射 点击加号 设置整个项目被Git管理

MySQL高级-事务-并发事务演示及隔离级别

文章目录 0、四种隔离级别1、创建表 account2、修改当前会话隔离级别为 read uncommitted2.1、会出现脏读 3、修改当前会话隔离级别为 read committed3.1、可以解决脏读3.2、会出现不可重复读 4、修改当前会话隔离级别为 repeatable read&#xff08;默认&#xff09;4.1、解决…

【论文阅读】transformer及其变体

写在前面&#xff1a; transformer模型已经是老生常谈的一个东西&#xff0c;以transformer为基础出现了很多变体和文章&#xff0c;Informer、autoformer、itransformer等等都是顶刊顶会。一提到transformer自然就是注意力机制&#xff0c;变体更是数不胜数&#xff0c;一提到…