android对文件进行加密

android对文件进行加密最开始想的是对apk进行加密,但是搜到的资料都是对dex层面的加密,后来转念一想,apk也可以被看做是一个普通的文件,普通的文件其实是可以使用AES进行加密的(AES比DES安全性和速度要更好,属于对称性加密里面很好的了),代码如下funmain(args:Array<String>){ //key也可以采用下边的FileAESUtil.getAutoCreateAESKey()方法自动生成valkey=”asdfghjkl”valcontent=.

大家好,又见面了,我是你们的朋友全栈君。

最开始想的是对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;
    }

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/145699.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Python深拷贝与浅拷贝_python 赋值

    Python深拷贝与浅拷贝_python 赋值深拷贝和浅拷贝不管对于浅拷贝、还是深拷贝,针对不可变对象str、int、tuple(有点特殊)、boolean,它的内存地址是不变的,拷贝的仅仅是值importcopya=1b=co

    2022年7月31日
    3
  • activate-power-mode安装与设置

    activate-power-mode安装与设置Windowactivatepowermode去掉combo/shake,其他三个全勾上,现在用起来就很爽了,赶紧体验吧。

    2022年7月1日
    24
  • matlab norm函数作用_norm值计算

    matlab norm函数作用_norm值计算%X为向量,求欧几里德范数,即。n=norm(X,inf)%求-范数,即。n=norm(X,1)%求1-范数,即。n=norm(X,-inf)%求向量X的元素的绝对值的最小值,即。n=norm(X,p)%求p-范数,即,所以norm(X,2)=norm(X)。命令矩阵的范数函数norm格式n=norm(A)

    2022年10月24日
    0
  • NV12截图_js 截图

    NV12截图_js 截图截图原理参考:从NV12中裁剪子画面注意事项这是源码://裁剪的坐标X和Y必须是偶数,否则UV和Y会有偏差,注意点,linesize对其为1intNV12CropTo420P(uint8_t*nv12data,intwidth,intheight,intcropx, intcropy,uint8_t*yuv420pdata,intdscw,intdsc…

    2022年9月25日
    0
  • 【18】进大厂必须掌握的面试题-15个Kafka面试

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 1.什么是kafka? Apache Kafka是由Apache开发的一种发布订阅消息系统。 2.kafka的3个关…

    2021年6月23日
    83
  • App测试面试题_手机软件测试

    App测试面试题_手机软件测试1.Web端测试和App端测试有何不同(常见)系统结构方面Web项目,b/s架构,基于浏览器的;Web测试只要更新了服务器端,客户端就会同步会更新;App项目,c/s结构的,必须要有客户端;App修改了服务端,则客户端用户所有核心版本都需要进行回归测试一遍;兼容方面Web项目:a.浏览器(火狐、谷歌、IE等)b.操作系统(Windows7、Windows10、Linux等)App项目:a.设备系统:iOS(ipad、iphone)、Android(三星、华为、联想等)、

    2022年9月5日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号