Android常用加解密算法总结

news2025/1/19 8:17:15

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() {
    @Override
    public 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() {
    @Override
    public 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() {
    @Override
    public 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.coloradmin.cn/o/1881087.html

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

相关文章

线程的调度

线程的执行总是趋向于CPU受限或IO受限 一些线程需要花费一定的时间使用CPU进行计算&#xff0c;而另外一些线程则会花费一些时间等待相对较慢的I/O操作的完成 一个用于计算16位整数的14次方根的线程属于前者&#xff0c;而一个等待人类用户通过敲击键盘提供输入数据的线程则属…

Bytebase 2.20.0 - 支持为工单事件配置飞书个人通知

&#x1f680; 新功能 支持 Databricks。支持 SQL Server 的 TLS/SSL 连接。支持为工单事件配置飞书个人通知。支持限制用户注册的邮箱域名。 &#x1f514; 重大变更 将分类分级同步设置从数据库配置移至工作空间的全局配置。 SQL 编辑器只读模式下只允许执行 Redis 的只读…

Java SE入门及基础(60) 线程的实现(下) 线程的同步(synchronized 和 Lock 的实现) 线程通信 线程状态

目录 线程 &#xff08;下&#xff09; 4. 线程同步-synchronized 同步方法语法 示例 同步代码块语法 示例 synchronized锁实现原理 5. 线程同步-Lock 示例 6. 线程通信 Object类中的通信方法 案例 分析 代码实现 7. 线程状态 线程状态转换图 线程 &#xff08…

老师如何将期末成绩单独发给家长?

老师们&#xff0c;期末季又到了&#xff0c;又要面临一个重要而微妙的任务——发放期末成绩。在这个信息爆炸的时代&#xff0c;如何安全、高效、又充满人情味地将成绩单送到家长手中&#xff0c;成了我们的一项挑战。今天&#xff0c;我就来和大家分享一些小技巧&#xff0c;…

Wp-scan一键扫描wordpress网页(KALI工具系列三十二)

目录 1、KALI LINUX 简介 2、Wp-scan工具简介 3、信息收集 3.1 目标IP&#xff08;服务器) 3.2kali的IP 4、操作实例 4.1 基本扫描 4.2 扫描已知漏洞 4.3 扫描目标主题 4.4 列出用户 4.5 输出扫描文件 4.6 输出详细结果 5、总结 1、KALI LINUX 简介 Kali Linux 是一…

LeetCode 算法:二叉树的右视图 c++

原题链接&#x1f517;&#xff1a;二叉树的右视图 难度&#xff1a;中等⭐️⭐️ 题目 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4…

某易六月实习笔试

第一题 下面代码需要更改的地方已指出。 解题思路 模拟题&#xff0c;用双指针记录双方当前式神&#xff0c;再记录一下当前谁先手&#xff0c;直到有一方指针越界。 把下面代码now1变为now(now1)%2就行。 第二题 解题思路 01背包变种&#xff0c;只是背包的容量变为多个维度…

清华大学世界排名:2025QS世界大学排名第20名

近日&#xff0c;国际高等教育研究机构QS Quacquarelli Symonds正式发布了2025QS世界大学排名&#xff0c;其中麻省理工学院连续第13年蝉联榜首&#xff0c;北京大学排名由去年的全球第17上升至全球第14名&#xff0c;清华大学位列2025QS世界大学排名第20名&#xff0c;以下是查…

【高级篇】分区与分片:MySQL的高级数据管理技术(十三)

引言 在上一章,我们探讨了MySQL的主从复制与高可用性,这是构建健壮数据库架构的基石。现在,让我们深入到更高级的主题——分区与分片,这些技术对于处理大规模数据集和提升数据库性能至关重要。我们将详细介绍表分区的概念、类型及分片技术的应用,为下一章讨论MySQL集群与…

【硬件视界2】CPU和GPU:计算机架构的双子星

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 本篇笔记整理&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、CPU (中央处理器)①主要作用②特点 2、 GPU (图形处理…

架构师篇-9、从事件风暴到微服务设计的落地过程

用户付款功能第二个版本的设计实现 单一职责原则&#xff08;SRP&#xff09; 软件系统中的每个元素只完成自己职责内的事&#xff0c;将其他的事交给别人去做“职责”通常人理解为一个事情&#xff0c;与该事情相关的事都是它的责任 一个职责是软件变化的一个原因 第二次需求…

2024年06月CCF-GESP编程能力等级认证Scratch图形化编程二级真题解析

本文收录于《Scratch等级认证CCF-GESP图形化真题解析》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 一、单选题(共 10 题,每题 3 分,共 30 分) 第1题 小杨父母带他到某培训机构给他报名参加 CCF 组织的 GESP 认证考试的第 1 级,那他可以选择的认证语言有几…

Apache Ranger 2.4.0 集成hadoop 3.X(Kerbos)

1、安装Ranger 参照上一个文章 2、修改配置 把各种plugin转到统一目录&#xff08;源码编译的target目录下拷贝过来&#xff09;&#xff0c;比如 tar zxvf ranger-2.4.0-hdfs-plugin.tar.gz tar zxvf ranger-2.4.0-hdfs-plugin.tar.gz vim install.properties POLICY_MG…

基于vue脚手架创建的图书商城

功能简介 此项目包括首页, 搜索列表, 商品详情, 购物车, 订单, 支付, 用户登陆/注册等多个子模块&#xff0c;使用 Vue 全家 桶ES6WebpackAxios 等技术&#xff0c;采用模块化、组件化、工程化的模式开发。 功能模块图 2.1首页 2.2.搜索列表 2.3.商品详情 2.4.购物车 2.5.支…

flask的基本使用2

上一篇我们介绍了基本使用方法 flask使用 【 1 】基本使用 from flask import Flask# 1 实例化得到对象 app Flask(__name__)# 2 注册路由--》写视图函数 app.route(/) def index():# 3 返回给前端字符串return hello worldif __name__ __main__:# 运行app&#xff0c;默认…

正则表达式阅读理解

这段正则表达式可以匹配什么呢&#xff1f; 超级复杂的一段正则表达式。 ((max|min)\\s*\\([^\\)]*(,[^\\)]*)*\\)|[a-zA-Z][a-zA-Z0-9]*(_[a-zA-Z][a-zA-Z0-9]*)?(\\*||%)?|[0-9](\\.[0-9])?|\\([^\\)]*(,[^\\)]*)*\\))(\\s*[-*/%]\\s*([a-zA-Z][a-zA-Z0-9]*(_[a-zA-Z][…

Servlet_Web小结

1.web开发概述 什么是服务器&#xff1f; 解释一&#xff1a;服务器就是一款软件,可以向其发送请求,服务器会做出一个响应. 可以在服务器中部署文件,让他人访问 解释二&#xff1a;也可以把运行服务器软件的计算机也可以称为服务器。 web开发&#xff1a; 指的是从网页中向后…

vue2实例实现一个初步的vue-router

vue2实例实现一个初步的vue-router 实现源码&#xff1a;vue2-review 1.App.vue 2.router目录下的index.js 3.自己实现的x-router.js 4.自己实现的xrouter-view.js 5.自己实现的xrouter-link.js 6.效果 微信公众号&#xff1a;刺头拾年

Unity Shader 极坐标

Unity Shader 极坐标 前言项目简单极坐标极坐标变体之方形极坐标变体之圆形拉花 鸣谢 前言 极坐标记录 项目 简单极坐标 极坐标变体之方形 极坐标变体之圆形 拉花 鸣谢 【菲兹杂货铺】【Unity Shader教程】极坐标实现以及极坐标的两种变体

VUE的快速使用

使用步骤 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head&…