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() {
    @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.mfbz.cn/a/760263.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计Thinkphp/Laravel校园体育器材管理系统

校园体育器材管理系统在流畅性&#xff0c;续航能力&#xff0c;等方方面面都有着很大的优势。这就意味着校园体育器材管理系统的设计可以比其他系统更为出色的能力&#xff0c;可以更高效的完成最新的体育器材、器材借用、器材归还、器材损坏、采购入库、器材报废、维修记录等…

局域网必备文件传输神器,吾爱再出精品,支持电脑、手机无缝对接!

今天给大家带来的不是一般的干货&#xff0c;而是一款让阿星我爱不释手的局域网文件传输神器&#xff0c;而且是吾爱大佬出品。无论是工作还是生活&#xff0c;它都能给你带来极大的便利。这年头&#xff0c;谁还没个跨设备传输文件的需求呢&#xff1f; 手机、电脑、平板&…

AI agent是什么,什么技术栈

AI agent&#xff0c;也称为会话代理或聊天机器人&#xff0c; 是一种通过文本或语音模拟人类对话的计算机程序。 它们旨在以自然且引人入胜的方式理解和响应用户输入。 AI agent 被广泛用于各种应用中&#xff0c;包括客户服务、营销、 销售和教育。 有两种主要类型的 AI agen…

Webpack: 前端资深构建工具

概述 如果你是一名前端工程师&#xff0c;相信之前或多或少听过、用过 Webpack 这一构建工具&#xff0c;它能够融合多种工程化工具&#xff0c;将开发阶段的应用代码编译、打包成适合网络分发、客户端运行的应用产物如今&#xff0c;Webpack 已经深深渗入到前端工程的方方面面…

snat、dnat和firewalld

目录 概述 SNAT源地址转换 DANT目的地址转换 抓包 firewalld 端口管理 概述 snat &#xff1a;源地址转换 内网——外网 内网ip转换成可以访问外网的ip 也就是内网的多个主机可以只有一个有效的公网ip地址访问外部网络 DNAT&#xff1a;目的地址转发 外部用户&#…

使用Python绘制太阳系图

使用Python绘制太阳系图 太阳系图太阳系图的优点使用场景 效果代码 太阳系图 太阳系图&#xff08;Sunburst Chart&#xff09;是一种层次结构图表&#xff0c;用于表示数据的分层结构。它使用同心圆表示各个层级&#xff0c;中心圆代表最高层级&#xff0c;向外的圆环代表逐级…

Ubuntu内存占用高怎么办?docker容器查看内存占用,按照内存占用排序,查看进程占用

Ubuntu内存占用高怎么办&#xff1f;docker容器查看内存占用&#xff0c;按照内存占用排序&#xff0c;查看进程占用 问题描述(废话)解决方案 问题描述(废话) 今天突然注意到服务器内存占用很高&#xff0c;想查看一下内存的占用情况。 首先想到了系统的命令&#xff0c;用top命…

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

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

python工作目录与文件目录

工作目录 文件目录&#xff1a;文件所在的目录 工作目录&#xff1a;执行python命令所在的目录 D:. | main.py | ---data | data.txt | ---model | | model.py | | train.py | | __init__.py | | | ---nlp | | | bert.py | …

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

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

springboot异常产生原因

DataIntegrityViolationException Cause: java.sql.SQLException: Field ‘id’ doesn’t have a default value org.springframework.dao.DataIntegrityViolationException: ### Error updating database. Cause: java.sql.SQLException: Field id doesnt have a default …

Unity3D 物体的运动

运动方式1 修改 position / localPosition &#xff0c;可以让物体运动 例如&#xff0c; Vector3 pos this.transform.localPosition; pos.z distance; this.transform.localPosition pos; 此时&#xff0c;小车向Z 方向运动 具体代码如下 using System.Collection…

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;刺头拾年

基于源码详解ThreadPoolExecutor实现原理

个人博客地址 基于源码详解ThreadPoolExecutor实现原理 | iwts’s blog 内容拆分 这里算是一个总集&#xff0c;内容太多&#xff0c;拆分成几个比较重要的小的模块&#xff1a; ThreadPoolExecutor基于ctl变量的声明周期管理 | iwts’s blog ThreadPoolExecutor 工作线程…

前端小白必学:对Cookie、localStorage 和 sessionStorage 的简单理解

前言 Cookie、localStorage 和 sessionStorage 作为Web开发领域中广泛采用的三种客户端数据存储技术&#xff0c;它们各自拥有独特的优势、应用场景及限制条件&#xff0c;共同支撑起前端数据管理的多样化需求。也是面试常考题之一&#xff0c;今天就和大家简单谈一下我对它们…

vue3项目-基础环境-创建项目

目标&#xff1a; npm>yarn>pnpm 安装pnpm npm install-g pnpm 创建项目 pnpm create vue pnpm create vue (创建的是vue3项目)&#xff0c;pnpm更快 eslint.cjs配置 /* eslint-env node */ //来源: rushstack/eslint-patch 是 RushStack 项目提供的一个工具&…

风水研究会官网源码系统-可展示自己的领域内容-商品售卖等

一款用于展示风水行业&#xff0c;周易测算行业&#xff0c;玄学行业的系统&#xff0c;并支持售卖自己的商品。 整洁大气&#xff0c;非常漂亮&#xff0c;前端内容均可通过后台修改。 大致功能&#xff1a; 支持前端内容通过后端自定义支持开启关闭会员功能&#xff0c;会…

primeflex overflow样式类相关的用法和案例

文档地址&#xff1a;https://primeflex.org/overflow 案例1 <script setup> import axios from "axios"; import {ref} from "vue";const message ref("frontend variable") axios.get(http://127.0.0.1:8001/).then(function (respon…

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

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

cesium 添加 Echarts 图层(空气质量点图)

cesium 添加 Echarts 图层(下面附有源码) 1、实现思路 1、在scene上面新增一个canvas画布 2、通坐标转换,将经纬度坐标转为屏幕坐标来实现 3、将ecarts 中每个series数组中元素都加 coordinateSystem: ‘cesiumEcharts’ 2、示例代码 <!DOCTYPE html> <html lan…