Android 加解密算法工具类封装:AES、RSA、MD5 一站式解决方案

ops/2025/3/11 2:10:55/

在 Android 开发中,数据的安全性非常重要,尤其是敏感数据的存储和传输。为了实现数据加密和解密,我们可以封装一个通用的加解密工具类,支持常见的加密算法(如 AES、RSA、DES 等)。以下是一个基于 AES 对称加密算法的工具类封装示例,同时提供扩展性以支持其他算法

  1. AES 加解密工具类封装
    AES(Advanced Encryption Standard)是一种对称加密算法,加密和解密使用相同的密钥。以下是封装好的工具类:
import android.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;public class AESUtil {private static final String ALGORITHM = "AES";private static final String TRANSFORMATION = "AES/ECB/PKCS5Padding"; // AES 加密模式和填充方式/*** 加密** @param data 待加密的数据* @param key  密钥(必须是 16、24 或 32 字节)* @return 加密后的 Base64 编码字符串*/public static String encrypt(String data, String key) {try {SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), ALGORITHM);Cipher cipher = Cipher.getInstance(TRANSFORMATION);cipher.init(Cipher.ENCRYPT_MODE, secretKey);byte[] encryptedBytes = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));return Base64.encodeToString(encryptedBytes, Base64.DEFAULT);} catch (Exception e) {e.printStackTrace();return null;}}/*** 解密** @param encryptedData 加密后的 Base64 编码字符串* @param key           密钥(必须是 16、24 或 32 字节)* @return 解密后的原始数据*/public static String decrypt(String encryptedData, String key) {try {SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), ALGORITHM);Cipher cipher = Cipher.getInstance(TRANSFORMATION);cipher.init(Cipher.DECRYPT_MODE, secretKey);byte[] decryptedBytes = cipher.doFinal(Base64.decode(encryptedData, Base64.DEFAULT));return new String(decryptedBytes, StandardCharsets.UTF_8);} catch (Exception e) {e.printStackTrace();return null;}}
}

使用示例

public class Main {public static void main(String[] args) {String originalData = "Hello, AES Encryption!";String key = "1234567890123456"; // 密钥必须是 16、24 或 32 字节// 加密String encryptedData = AESUtil.encrypt(originalData, key);System.out.println("加密后的数据: " + encryptedData);// 解密String decryptedData = AESUtil.decrypt(encryptedData, key);System.out.println("解密后的数据: " + decryptedData);}
}

2.RSA 加解密工具类封装
RSA 是一种非对称加密算法,使用公钥加密、私钥解密。以下是 RSA 工具类的简单实现:

import android.util.Base64;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;public class RSAUtil {private static final String ALGORITHM = "RSA";/*** 生成 RSA 密钥对** @return 生成的密钥对*/public static KeyPair generateKeyPair() throws Exception {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM);keyPairGenerator.initialize(2048); // 密钥长度return keyPairGenerator.generateKeyPair();}/*** 使用公钥加密** @param data      待加密的数据* @param publicKey 公钥* @return 加密后的 Base64 编码字符串*/public static String encrypt(String data, PublicKey publicKey) throws Exception {Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, publicKey);byte[] encryptedBytes = cipher.doFinal(data.getBytes());return Base64.encodeToString(encryptedBytes, Base64.DEFAULT);}/*** 使用私钥解密** @param encryptedData 加密后的 Base64 编码字符串* @param privateKey    私钥* @return 解密后的原始数据*/public static String decrypt(String encryptedData, PrivateKey privateKey) throws Exception {Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] decryptedBytes = cipher.doFinal(Base64.decode(encryptedData, Base64.DEFAULT));return new String(decryptedBytes);}/*** 将 Base64 编码的公钥字符串转换为 PublicKey 对象** @param base64PublicKey Base64 编码的公钥字符串* @return PublicKey 对象*/public static PublicKey getPublicKey(String base64PublicKey) throws Exception {byte[] keyBytes = Base64.decode(base64PublicKey, Base64.DEFAULT);X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);return keyFactory.generatePublic(keySpec);}/*** 将 Base64 编码的私钥字符串转换为 PrivateKey 对象** @param base64PrivateKey Base64 编码的私钥字符串* @return PrivateKey 对象*/public static PrivateKey getPrivateKey(String base64PrivateKey) throws Exception {byte[] keyBytes = Base64.decode(base64PrivateKey, Base64.DEFAULT);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);return keyFactory.generatePrivate(keySpec);}/*** 将公钥对象转换为 Base64 编码字符串** @param publicKey 公钥对象* @return Base64 编码的公钥字符串*/public static String getPublicKeyString(PublicKey publicKey) {return Base64.encodeToString(publicKey.getEncoded(), Base64.DEFAULT);}/*** 将私钥对象转换为 Base64 编码字符串** @param privateKey 私钥对象* @return Base64 编码的私钥字符串*/public static String getPrivateKeyString(PrivateKey privateKey) {return Base64.encodeToString(privateKey.getEncoded(), Base64.DEFAULT);}
}

使用示例:

import java.security.KeyPair;public class Main {public static void main(String[] args) {try {// 1. 生成密钥对KeyPair keyPair = RSAUtil.generateKeyPair();String publicKeyString = RSAUtil.getPublicKeyString(keyPair.getPublic());String privateKeyString = RSAUtil.getPrivateKeyString(keyPair.getPrivate());System.out.println("公钥: " + publicKeyString);System.out.println("私钥: " + privateKeyString);// 2. 加密数据String originalData = "Hello, RSA Encryption!";String encryptedData = RSAUtil.encrypt(originalData, keyPair.getPublic());System.out.println("加密后的数据: " + encryptedData);// 3. 解密数据String decryptedData = RSAUtil.decrypt(encryptedData, keyPair.getPrivate());System.out.println("解密后的数据: " + decryptedData);} catch (Exception e) {e.printStackTrace();}}
}

输出示例:

公钥: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu1X7...
私钥: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBA...
加密后的数据: jKlQmZ2P3X7v...
解密后的数据: Hello, RSA Encryption!

工具类的功能说明
生成密钥对

使用 generateKeyPair() 方法生成 RSA 密钥对(公钥和私钥)。

公钥用于加密,私钥用于解密。

加密数据

使用 encrypt() 方法,传入原始数据和公钥,返回加密后的 Base64 编码字符串。

解密数据

使用 decrypt() 方法,传入加密后的 Base64 编码字符串和私钥,返回解密后的原始数据。

密钥转换

支持将 PublicKey 和 PrivateKey 对象转换为 Base64 编码字符串,便于存储和传输。

支持将 Base64 编码的密钥字符串转换回 PublicKey 或 PrivateKey 对象。

注意事项
密钥长度

RSA 密钥长度通常为 2048 位或更高,以确保安全性。

加密数据大小限制

RSA 加密的数据大小受密钥长度限制。例如,2048 位密钥最多只能加密 245 字节的数据。如果需要加密更大的数据,可以结合对称加密(如 AES)使用。

密钥存储

私钥必须妥善保存,避免泄露。可以使用 Android Keystore 系统来安全存储密钥。

性能

RSA 加密和解密速度较慢,适合加密小数据(如密钥或敏感信息)。

3. MD5 工具类封装
MD5 是一种广泛使用的哈希算法,通常用于生成数据的唯一摘要(哈希值)。虽然 MD5 不再推荐用于加密(因为它容易受到碰撞攻击),但它仍然可以用于校验数据完整性或生成唯一标识。以下是 MD5 工具类的封装,并附带使用示例。
代码

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class MD5Util {/*** 生成字符串的 MD5 哈希值** @param input 输入字符串* @return MD5 哈希值(32 位十六进制字符串)*/public static String md5(String input) {try {// 创建 MessageDigest 实例,指定使用 MD5 算法MessageDigest digest = MessageDigest.getInstance("MD5");// 将输入字符串转换为字节数组并计算哈希值byte[] hashBytes = digest.digest(input.getBytes());// 将字节数组转换为十六进制字符串StringBuilder hexString = new StringBuilder();for (byte b : hashBytes) {String hex = Integer.toHexString(0xff & b);if (hex.length() == 1) {hexString.append('0');}hexString.append(hex);}return hexString.toString();} catch (NoSuchAlgorithmException e) {e.printStackTrace();return null;}}/*** 生成文件的 MD5 哈希值** @param filePath 文件路径* @return 文件的 MD5 哈希值(32 位十六进制字符串)*/public static String md5File(String filePath) {try {MessageDigest digest = MessageDigest.getInstance("MD5");FileInputStream fis = new FileInputStream(filePath);byte[] buffer = new byte[8192];int bytesRead;while ((bytesRead = fis.read(buffer)) != -1) {digest.update(buffer, 0, bytesRead);}fis.close();// 将字节数组转换为十六进制字符串byte[] hashBytes = digest.digest();StringBuilder hexString = new StringBuilder();for (byte b : hashBytes) {String hex = Integer.toHexString(0xff & b);if (hex.length() == 1) {hexString.append('0');}hexString.append(hex);}return hexString.toString();} catch (Exception e) {e.printStackTrace();return null;}}
}

使用示例
示例 1:计算字符串的 MD5 哈希值

public class Main {public static void main(String[] args) {String input = "Hello, MD5!";String md5Hash = MD5Util.md5(input);System.out.println("MD5 哈希值: " + md5Hash);}
}

输出结果:

MD5 哈希值: ed076287532e86365e841e92bfc50d8c

示例 2:计算文件的 MD5 哈希值:

public class Main {public static void main(String[] args) {String filePath = "path/to/your/file.txt";String md5Hash = MD5Util.md5File(filePath);System.out.println("文件的 MD5 哈希值: " + md5Hash);}
}

输出结果:

文件的 MD5 哈希值: d41d8cd98f00b204e9800998ecf8427e

工具类的功能说明
字符串 MD5 哈希:

md5(String input) 方法用于计算输入字符串的 MD5 哈希值。

返回一个 32 位的十六进制字符串。

文件 MD5 哈希:

md5File(String filePath) 方法用于计算文件的 MD5 哈希值。

适用于校验文件完整性或生成文件的唯一标识。

异常处理:

如果算法不可用(NoSuchAlgorithmException),会捕获异常并返回 null。

文件操作异常(如文件不存在)也会被捕获并返回 null。


http://www.ppmy.cn/ops/164815.html

相关文章

前端 | CORS 跨域问题解决

问题:Access to fetch at http://localhost:3000/save from origin http://localhost:5174 has been blocked by CORS policy: Response to preflight request doesnt pass access control check: No Access-Control-Allow-Origin header is present on the request…

Ae 效果详解:VR 数字故障

Ae菜单:效果/沉浸式视频/VR 数字故障 Immersive Video/VR Digital Glitch VR 数字故障 VR Digital Glitch效果用于在 VR 视频中创建数字故障效果,模拟电视信号干扰、视频损坏或计算机错误等视觉表现。通过调整属性,可以控制故障的强度、样式和…

Beeline的使用和Hive JDBC

目录 1. 引言1.1 Hadoop1.2 HBase1.3 Hive 2. Beeline2.1 使用Beeline访问Hive2.1.1 通过beeline直接连接Hive2.1.2 先进入beeline客户端再连接Hive2.1.3 先进入beeline客户端再连接MySQL 2.2 Beeline命令 3. Hive JDBC3.1 pom.xml中依赖配置3.2 Util工具类3.3 代码3.4 结果 参…

Java零基础入门笔记:多线程

前言 本笔记是学习狂神的java教程,建议配合视频,学习体验更佳。 【狂神说Java】Java零基础学习视频通俗易懂_哔哩哔哩_bilibili 第1-2章:Java零基础入门笔记:(1-2)入门(简介、基础知识)-CSDN博客 第3章…

SpringCloud—概述—01

一、微服务 1)单体架构 业务的所有功能实现都打包在一个 war 包或者 jar 包中,这种方式就称为 单体架构 例如,学校中实现的博客系统,前端后端数据库实现,都是在一个项目中 把所有模块都写在一个 web 项目中&#x…

ArcGIS Pro建库中常用公式的应用与技巧

在当今数字化的时代,地理信息系统(GIS)在各个领域都发挥着至关重要的作用。 ArcGIS Pro作为一款功能强大的GIS软件,为用户提供了丰富的工具和功能,使得数据处理、地图制作和空间分析变得更加高效和便捷。 本文将为您…

TDengine 安装使用及备份数据

官网文档地址:https://docs.taosdata.com/get-started/package/ 下载安装包后: taosd 是 TDengine 数据库引擎的核心服务,其配置文件默认是 /etc/taos/taos.cfg 但也可以指定不同路径的配置文件。本节详细介绍 taosd 的命令行参数及配置文件中的配置参数…

通义千问本地配置并实现微调

通义千问本地配置并实现微调 最小Qwen模型大小942mb from modelscope import snapshot_download model_dir = snapshot_download(“qwen/Qwen2.5-0.5B”, cache_dir=“./models2.5”) Qwen2.5-0.5B:942MB from modelscope import snapshot_download model_dir = snapshot_d…