最开始想的是对apk进行加密,但是搜到的资料都是对dex层面的加密,后来转念一想,apk也可以被看做是一个普通的文件,普通的文件其实是可以使用AES进行加密的(AES比DES安全性和速度要更好,属于对称性加密里面很好的了),代码如下

fun main(args: Array<String>) {// key也可以采用下边的FileAESUtil.getAutoCreateAESKey()方法自动生成val key = "asdfghjkl"val content = "plugin.apk"val encryptMode = AESUtil.aes(content, key, Cipher.ENCRYPT_MODE)System.out.println("加密之后:" + encryptMode)// 解密val decryptMode = AESUtil.aes(encryptMode,key,Cipher.DECRYPT_MODE);System.out.println("解密之后:" + decryptMode)// 源文件val sourceFile = "F:\\app-debug.apk"// 加密输出的目标文件val targetFile = "F:\\a.apk"// 解密输出的目标文件val sourceDecryptFile = "F:\\target\\plugin.apk"val autoCreateKey = FileAESUtil.getAutoCreateAESKey()FileAESUtil.aesEncryptFile(sourceFile,targetFile,autoCreateKey);System.out.println("加密完成")FileAESUtil.aesDecryptFile(targetFile,sourceDecryptFile,autoCreateKey)System.out.println("解密完成")}

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.SecureRandom;import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;public class FileAESUtil {private static String ALGORITHM_AES = "AES";private static int AES_KEY_LEN = 128;public static byte[] getAutoCreateAESKey() throws Exception {// 实例化一个AES加密算法的密钥生成器KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM_AES);// 初始化密钥生成器,指定密钥位数为128位keyGenerator.init(AES_KEY_LEN, new SecureRandom());// 生成一个密钥SecretKey secretKey = keyGenerator.generateKey();return secretKey.getEncoded();}/** AES加密** @param sourceFile 源文件* @param encryptFile 加密文件* @param password 密钥,128bit* @throws Exception 抛出异常*/public static void aesEncryptFile(String sourceFile, String encryptFile, byte[] password) throws Exception {// 创建AES密钥SecretKeySpec key = new SecretKeySpec(password,  "AES");// 创建加密引擎(CBC模式)。Cipher类支持DES,DES3,AES和RSA加加密// AES:算法名称// CBC:工作模式// PKCS5Padding:明文块不满足128bits时填充方式(默认),即在明文块末尾补足相应数量的字符,// 且每个字节的值等于缺少的字符数。另外一种方式是ISO10126Padding,除最后一个字符值等于少的字符数// 其他字符填充随机数。Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");// 初始化加密器cipher.init(Cipher.ENCRYPT_MODE, key,new IvParameterSpec(new byte[cipher.getBlockSize()]));// 原始文件流FileInputStream inputStream = new FileInputStream(sourceFile);// 加密文件流FileOutputStream outputStream = new FileOutputStream(encryptFile);// 以加密流写入文件CipherInputStream cipherInputStream = new CipherInputStream(inputStream, cipher);byte[] tmpArray = new byte[1024];int len;while((len = cipherInputStream.read(tmpArray)) != -1) {outputStream.write(tmpArray, 0, len);outputStream.flush();}cipherInputStream.close();inputStream.close();outputStream.close();}/** AES解密** @param encryptFile 加密文件* @param decryptFile 解密文件* @param password 密钥,128bit* @throws Exception 抛出异常*/public static void aesDecryptFile(String encryptFile, String decryptFile, byte[] password) throws Exception {// 创建AES密钥,即根据一个字节数组构造一个SecreteKey// 而这个SecreteKey是符合指定加密算法密钥规范SecretKeySpec key = new SecretKeySpec(password,   "AES");// 创建解密引擎(CBC模式)// Cipher类支持DES,DES3,AES和RSA加解密Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");// 初始化解密器cipher.init(Cipher.DECRYPT_MODE, key,new IvParameterSpec(new byte[cipher.getBlockSize()]));// 加密文件流FileInputStream fileInputStream = new FileInputStream(encryptFile);// 解密文件流FileOutputStream fileOutputStream = new FileOutputStream(decryptFile);// 以解密流写出文件CipherOutputStream cipherOutputStream =new CipherOutputStream(fileOutputStream, cipher);byte[] buffer = new byte[1024];int len;while((len = fileInputStream.read(buffer)) >= 0) {cipherOutputStream.write(buffer, 0, len);}cipherOutputStream.close();fileInputStream.close();fileOutputStream.close();}}

字符串加密

import java.security.Provider;
/*** Implementation of Provider for SecureRandom. The implementation     supports the* "SHA1PRNG" algorithm described in JavaTM Cryptography Architecture, API* Specification & Reference*/
public final class CryptoProvider extends Provider {/*** Creates a Provider and puts parameters*/public CryptoProvider() {super("Crypto", 1.0, "HARMONY (SHA1 digest; SecureRandom; SHA1withDSA signature)");put("SecureRandom.SHA1PRNG","org.apache.harmony.security.provider.crypto.SHA1PRNG_SecureRandomImpl");put("SecureRandom.SHA1PRNG ImplementedIn", "Software");}
}

import android.annotation.SuppressLint;
import android.os.Build;import androidx.annotation.IntDef;import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;/*** AES 工具类*/
public class AESUtil {private final static String SHA1PRNG = "SHA1PRNG";@IntDef({Cipher.ENCRYPT_MODE, Cipher.DECRYPT_MODE})@interface AESType {}/*** Aes加密/解密** @param content  字符串* @param password 密钥* @param type     加密:{@link Cipher#ENCRYPT_MODE},解密:{@link Cipher#DECRYPT_MODE}* @return 加密/解密结果字符串*/public static String aes(String content, String password, @AESType int type) {try {KeyGenerator generator = KeyGenerator.getInstance("AES");SecureRandom secureRandom;if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {secureRandom = SecureRandom.getInstance(SHA1PRNG, new CryptoProvider());} else if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {secureRandom = SecureRandom.getInstance(SHA1PRNG, "Crypto");} else {secureRandom = SecureRandom.getInstance(SHA1PRNG);}secureRandom.setSeed(password.getBytes());generator.init(128, secureRandom);SecretKey secretKey = generator.generateKey();byte[] enCodeFormat = secretKey.getEncoded();SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");@SuppressLint("GetInstance") Cipher cipher = Cipher.getInstance("AES");cipher.init(type, key);if (type == Cipher.ENCRYPT_MODE) {byte[] byteContent = content.getBytes("utf-8");return parseByte2HexStr(cipher.doFinal(byteContent));} else {byte[] byteContent = parseHexStr2Byte(content);return new String(cipher.doFinal(byteContent));}} catch (NoSuchAlgorithmException | BadPaddingException | IllegalBlockSizeException |UnsupportedEncodingException | InvalidKeyException | NoSuchPaddingException |NoSuchProviderException e) {e.printStackTrace();}return null;}/*** 二进位组转十六进制字符串** @param buf 二进位组* @return 十六进制字符串*/public static String parseByte2HexStr(byte buf[]) {StringBuilder sb = new StringBuilder();for (byte b : buf) {String hex = Integer.toHexString(b & 0xFF);if (hex.length() == 1) {hex = '0' + hex;}sb.append(hex.toUpperCase());}return sb.toString();}/*** 十六进制字符串转二进位组** @param hexStr 十六进制字符串* @return 二进位组*/public static byte[] parseHexStr2Byte(String hexStr) {if (hexStr.length() < 1) return null;byte[] result = new byte[hexStr.length() / 2];for (int i = 0; i < hexStr.length() / 2; i++) {int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);result[i] = (byte) (high * 16 + low);}return result;}}

遇到Didn’t find class “org.apache.harmony.security.provider.crypto.SHA1PRNG_SecureRandomImpl”
可以使用下边链接解决
https://7449.github.io/2018/12/11/android-p-aes.html

android对文件进行加密相关推荐

  1. Android so文件函数加密

    一.前言 经过上次写完在ELF文件中根据函数名找函数,就准备开始编写so文件函数加密,这里这是对代码进行加密,还没有对函数名做混淆,会放到下次写.还有本次的测试机是nexus4,操作系统为androi ...

  2. android数据库文件是否加密存储,详解Android数据存储之SQLCipher数据库加密

    前言: 最近研究了Android Sqlite数据库以及ContentProvider程序间数据共享,我们清晰的知道Sqlite数据库默认存放位置data/data/pakage/database目录 ...

  3. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 项目中配置 OpenSSL 开源库 | 使用 OpenSSL 开源库解密 dex 文件 )

    文章目录 一.项目中配置 OpenSSL 开源库 二.OpenSSL 开源库解密参考代码 三.解密 dex 文件的 Java 代码 四.解密 dex 文件的 Jni 代码 参考博客 : [Androi ...

  4. 【Android 安全】DEX 加密 ( Java 工具开发 | apk 文件签名 )

    文章目录 一.生成 jks 文件 二.签名命令 三.执行结果 四.处理 Unsupported major.minor version 52.0 错误 参考博客 : [Android 安全]DEX 加 ...

  5. 【Android 安全】DEX 加密 ( Java 工具开发 | apk 文件对齐 )

    文章目录 一.apk 对齐操作 二.apk 对齐命令 三.apk 对齐操作代码示例 四.apk 对齐执行结果 参考博客 : [Android 安全]DEX 加密 ( 常用 Android 反编译工具 ...

  6. 【Android 安全】DEX 加密 ( Java 工具开发 | 解压 apk 文件 | 加密生成 dex 文件 | 打包未签名 apk 文件 | 文件解压缩相关代码 )

    文章目录 一.解压 apk 文件 二.加密生成 dex 文件 三.打包未签名 apk 文件 四.完整代码示例 五.文件解压缩相关代码 六.执行结果 参考博客 : [Android 安全]DEX 加密 ...

  7. 【Android 安全】DEX 加密 ( Java 工具开发 | 生成 dex 文件 | Java 命令行执行 )

    文章目录 一.生成 dex 文件 二.生成 dex 文件代码示例 三.生成 dex 结果 参考博客 : [Android 安全]DEX 加密 ( 常用 Android 反编译工具 | apktool ...

  8. 【Android 安全】DEX 加密 ( Java 工具开发 | 加密解密算法 API | 编译代理 Application 依赖库 | 解压依赖库 aar 文件 )

    文章目录 一.加密解密算法 API 二.编译代理 Application 依赖库 三.解压代理 Application 依赖库 aar 文件 参考博客 : [Android 安全]DEX 加密 ( 常 ...

  9. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 将系统的 dexElements 与 应用的 dexElements 合并 | 替换操作 )

    文章目录 一.将系统的 dexElements 与 应用的 dexElements 合并 二.Element[] dexElements 替换操作 三.完整 dex 加载源码 参考博客 : [Andr ...

  10. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 使用反射获取方法创建本应用的 dexElements | 各版本创建 dex 数组源码对比 )

    文章目录 一.不同 Android 系统创建 dex 数组源码对比 二.不同 Android 系统创建 dex 数组源码对比 三. Android 5.1 及以下系统反射方法并创建 Element[] ...

最新文章

  1. Linux系统起源及主流发行版
  2. 创建Goldengate例外句丙记录跟踪Oracle错误
  3. C#操作Word Aspose.Words组件介绍及使用 基本介绍与DOM概述
  4. 安装java过程_Java的安装过程
  5. WinAPI: waveOutPause - 暂停播放
  6. 随想录(用memmove函数代替strncpy函数)
  7. 蘑菇车联打造一体化解决方案,致力产业协同发展
  8. 会议家用多面手!智能微型投影设备导购
  9. 【免费毕设】ASP.NET电子购物商城系统(源代码+lunwen)
  10. 阐述沙盒游戏的历史和理论
  11. 在Oracle中删除用户时提示:ORACLE无法删除当前连接用户
  12. 用技术——设计模式22——行为型模式——模板模式——待补充
  13. C++使用Socks5协议进行代理上网(四)
  14. nmn对卵巢的作用,nmn吃多久对卵巢,女性知识!
  15. python tab键自动补全_为python命令行添加Tab键自动补全功能
  16. 苏阳乐队杭州巡演后记
  17. 固态硬盘:NVME 2.0 新技术 ZNS 自动分区:减少延迟,提高寿命
  18. 【机器学习线性代数】06 解方程组:从空间的角度再引入
  19. 关于关于接口测试自动化的总结与思考接口测试自动化的总结与思考
  20. R语言基于决策树的银行信贷风险预警模型

热门文章

  1. 本人常用软件(工具)
  2. 求两个圆公切线的模板
  3. 综述:基于深度学习的文本分类 --《Deep Learning Based Text Classification: A Comprehensive Review》总结(二)
  4. 大数据IMF传奇行动绝密课程第91课:SparkStreaming基于Kafka Direct案例实战和内幕源码解密
  5. 基于BeautifulSoup爬取豆瓣网上的电影信息
  6. java 获取ipv4的地址_java 获取ip地址和网络接口
  7. 一个屌丝程序猿的人生(二十二)
  8. 量化java_用java做量化
  9. QQ空间说说刷赞网页版开放公测
  10. c语言 switch错误用法,C语言switch使用之诡异用法详解