android使用AES加密和解密文件实例代码

前言

最近公司需要对本公司的一些下载文件进行加密解密需求,也就尝试去实现下,其实需要借助第三方的jar包:bcprov-jdk15on-155.jar,下载这个可以到网上搜或者下载本人的demo即可,注意:需要加密和解密的key是一致的才可以解密,不然就会解密失败。不多说,直接上代码。

效果图

代码:

实现加密解密逻辑代码

package com.vsoontech.p2p.sample; 

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
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.ShortBufferException; 

/**
 * @author zhou
 * @since 2016/9/26
 */ 

public enum AES {
  INSTANCE;
  private Key key; 

  /**
   * 生成AES对称秘钥
   */
  public String generateKey() throws NoSuchAlgorithmException {
    KeyGenerator keygen = KeyGenerator.getInstance("AES");
    SecureRandom random = new SecureRandom();
    keygen.init(random);
    this.key = keygen.generateKey();
    return "Algorithm Format Encoded:" + key.getAlgorithm() + " - " + key.getFormat() + " - " + new String(key.getEncoded());
  } 

  /**
   * 加密
   */
  public void encrypt(InputStream in) throws InvalidKeyException, ShortBufferException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException, IOException {
    this.crypt(in, null, Cipher.ENCRYPT_MODE);
  } 

  /**
   * 解密
   */
  public String decrypt(InputStream in) throws InvalidKeyException, ShortBufferException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException, IOException {
    return this.crypt(in, Cipher.DECRYPT_MODE);
  } 

  /**
   * 加密
   */
  public void encrypt(InputStream in, OutputStream out) throws InvalidKeyException, ShortBufferException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException, IOException {
    this.crypt(in, out, Cipher.ENCRYPT_MODE);
  } 

  /**
   * 解密
   */
  public void decrypt(InputStream in, OutputStream out) throws InvalidKeyException, ShortBufferException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException, IOException {
    this.crypt(in, out, Cipher.DECRYPT_MODE);
  } 

  /**
   * 实际的加密解密过程
   */
  public void crypt(InputStream in, OutputStream out, int mode) throws IOException, ShortBufferException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException {
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(mode, this.key); 

    int blockSize = cipher.getBlockSize();
    int outputSize = cipher.getOutputSize(blockSize);
    byte[] inBytes = new byte[blockSize];
    byte[] outBytes = new byte[outputSize]; 

    int inLength = 0;
    boolean more = true;
    while (more) {
      inLength = in.read(inBytes);
      if (inLength == blockSize) {  //只要输入数据块具有全长度(长度可被8整除),调用update方法
        int outLength = cipher.update(inBytes, 0, blockSize, outBytes);
        if (out != null) out.write(outBytes, 0, outLength);
      } else {
        more = false;
      }
    }
    if (inLength > 0)  //不具有全长度,调用doFinal方法
      outBytes = cipher.doFinal(inBytes, 0, inLength);
    else
      outBytes = cipher.doFinal();
    if (out != null) {
      out.write(outBytes);
      out.flush();
    }
  } 

  /**
   * 实际的加密解密过程
   */
  public String crypt(InputStream in, int mode) throws IOException, ShortBufferException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException {
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(mode, this.key); 

    int blockSize = cipher.getBlockSize();
    int outputSize = cipher.getOutputSize(blockSize);
    byte[] inBytes = new byte[blockSize];
    byte[] outBytes = new byte[outputSize]; 

    int inLength = 0;
    boolean more = true;
    StringBuilder sb = new StringBuilder();
    while (more) {
      inLength = in.read(inBytes);
      if (inLength == blockSize) {  //只要输入数据块具有全长度(长度可被8整除),调用update方法
        int outLength = cipher.update(inBytes, 0, blockSize, outBytes);
      } else {
        more = false;
      }
    }
    if (inLength > 0)  //不具有全长度,调用doFinal方法
      outBytes = cipher.doFinal(inBytes, 0, inLength);
    else
      outBytes = cipher.doFinal();
    sb.append(new String(outBytes));
    return sb.toString();
  } 

  public void setKey(Key key) {
    this.key = key;
  } 

  public Key getKey() {
    return key;
  }
}

生成秘钥代码

package com.vsoontech.p2p.sample; 

import org.bouncycastle.jce.provider.BouncyCastleProvider; 

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.Key;
import java.security.NoSuchAlgorithmException; 

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec; 

/**
 * @author zhou
 * @since 2016/9/26
 */ 

public class AESKeyModel {
  public static final String KEY_ALGORITHM = "AES";
  private static final String DEFAULT_CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
  private String srcFile = "", destionFile = ""; 

  /**
   * 初始化密钥
   *
   * @return byte[] 密钥
   * @throws Exception
   */
  public byte[] initSecretKey() {
    //返回生成指定算法的秘密密钥的 KeyGenerator 对象
    KeyGenerator kg = null;
    try {
      kg = KeyGenerator.getInstance(KEY_ALGORITHM);
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
      return new byte[0];
    }
    //初始化此密钥生成器,使其具有确定的密钥大小
    //AES 要求密钥长度为 128
    kg.init(128);
    //生成一个密钥
    SecretKey secretKey = kg.generateKey();
    return secretKey.getEncoded();
  } 

  public void setDestionFile(String destionFile) {
    this.destionFile = destionFile;
  } 

  public void setSrcFile(String srcFile) {
    this.srcFile = srcFile;
  } 

  /**
   * 转换密钥
   *
   * @param key 二进制密钥
   * @return 密钥
   */
  private static Key toKey(byte[] key) {
    //生成密钥
    return new SecretKeySpec(key, KEY_ALGORITHM);
  } 

  /**
   * 加密
   *
   * @param data 待加密数据
   * @param key 密钥
   * @return byte[]  加密数据
   * @throws Exception
   */
  public static byte[] encrypt(byte[] data, Key key) throws Exception {
    return encrypt(data, key, DEFAULT_CIPHER_ALGORITHM);
  } 

  /**
   * 加密
   *
   * @param data 待加密数据
   * @param key 二进制密钥
   * @return byte[]  加密数据
   * @throws Exception
   */
  public static byte[] encrypt(byte[] data, byte[] key) throws Exception {
    return encrypt(data, key, DEFAULT_CIPHER_ALGORITHM);
  } 

  /**
   * 加密
   *
   * @param data      待加密数据
   * @param key       二进制密钥
   * @param cipherAlgorithm 加密算法/工作模式/填充方式
   * @return byte[]  加密数据
   * @throws Exception
   */
  public static byte[] encrypt(byte[] data, byte[] key, String cipherAlgorithm) throws Exception {
    //还原密钥
    Key k = toKey(key);
    return encrypt(data, k, cipherAlgorithm);
  } 

  /**
   * 加密
   *
   * @param data      待加密数据
   * @param key       密钥
   * @param cipherAlgorithm 加密算法/工作模式/填充方式
   * @return byte[]  加密数据
   * @throws Exception
   */
  public static byte[] encrypt(byte[] data, Key key, String cipherAlgorithm) throws Exception {
    //实例化
    Cipher cipher = Cipher.getInstance(cipherAlgorithm);
    //使用密钥初始化,设置为加密模式
    cipher.init(Cipher.ENCRYPT_MODE, key);
    //执行操作
    return cipher.doFinal(data);
  } 

  /**
   * 解密
   *
   * @param data 待解密数据
   * @param key 二进制密钥
   * @return byte[]  解密数据
   * @throws Exception
   */
  public static byte[] decrypt(byte[] data, byte[] key) throws Exception {
    return decrypt(data, key, DEFAULT_CIPHER_ALGORITHM);
  } 

  /**
   * 解密
   *
   * @param data 待解密数据
   * @param key 密钥
   * @return byte[]  解密数据
   * @throws Exception
   */
  public static byte[] decrypt(byte[] data, Key key) throws Exception {
    return decrypt(data, key, DEFAULT_CIPHER_ALGORITHM);
  } 

  /**
   * 解密
   *
   * @param data      待解密数据
   * @param key       二进制密钥
   * @param cipherAlgorithm 加密算法/工作模式/填充方式
   * @return byte[]  解密数据
   * @throws Exception
   */
  public static byte[] decrypt(byte[] data, byte[] key, String cipherAlgorithm) throws Exception {
    //还原密钥
    Key k = toKey(key);
    return decrypt(data, k, cipherAlgorithm);
  } 

  /**
   * 解密
   *
   * @param data      待解密数据
   * @param key       密钥
   * @param cipherAlgorithm 加密算法/工作模式/填充方式
   * @return byte[]  解密数据
   * @throws Exception
   */
  public static byte[] decrypt(byte[] data, Key key, String cipherAlgorithm) throws Exception {
    //实例化
    Cipher cipher = Cipher.getInstance(cipherAlgorithm);
    //使用密钥初始化,设置为解密模式
    cipher.init(Cipher.DECRYPT_MODE, key);
    //执行操作
    return cipher.doFinal(data);
  } 

  public void encryptionFile(Key sessionKey) throws Exception {
    int len = 0;
    byte[] buffer = new byte[1024];
    byte[] cipherbuffer = null; 

    // 使用会话密钥对文件加密。
    Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM, new BouncyCastleProvider());
    IvParameterSpec iv = new IvParameterSpec("0000000000123456".getBytes());
    cipher.init(Cipher.ENCRYPT_MODE, sessionKey, iv); 

    FileInputStream fis = new FileInputStream(new File(srcFile));
    FileOutputStream fos = new FileOutputStream(new File(destionFile)); 

    // 读取原文,加密并写密文到输出文件。
    while ((len = fis.read(buffer)) != -1) {
      cipherbuffer = cipher.update(buffer, 0, len);
      fos.write(cipherbuffer);
      fos.flush();
    }
    cipherbuffer = cipher.doFinal();
    fos.write(cipherbuffer);
    fos.flush(); 

    if (fis != null)
      fis.close();
    if (fos != null)
      fos.close();
  } 

  public void descryptionFile(Key sessionKey) throws Exception {
    int len = 0;
    byte[] buffer = new byte[5 * 1024];
    byte[] plainbuffer = null; 

    Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM, new BouncyCastleProvider());
    IvParameterSpec iv = new IvParameterSpec("0000000000123456".getBytes());
    cipher.init(Cipher.DECRYPT_MODE, sessionKey, iv); 

    FileInputStream fis = new FileInputStream(new File(srcFile));
    FileOutputStream fos = new FileOutputStream(new File(destionFile)); 

    while ((len = fis.read(buffer)) != -1) {
      plainbuffer = cipher.update(buffer, 0, len);
      fos.write(plainbuffer);
      fos.flush();
    } 

    plainbuffer = cipher.doFinal();
    fos.write(plainbuffer);
    fos.flush(); 

    if (fis != null)
      fis.close();
    if (fos != null)
      fos.close();
  }
}

加密逻辑示例代码

/**
   * 加密
   *
   * @param path
   * @param destionFile
   */
  private void aes(String path, String destionFile) {
    try {
      Log.d(TAG, "aes Key: " + AES.INSTANCE.generateKey());
      FileInputStream fis = new FileInputStream(new File(path));
      FileOutputStream fos = new FileOutputStream(new File(destionFile));
      AES.INSTANCE.encrypt(fis, fos);
    } catch (Exception e) {
      Log.d(TAG, "Exception: " + e.toString());
      e.printStackTrace();
    } 

  }

解密逻辑示例代码:

/**
   * AES解密文件
   *
   * @param path 需要解密的文件目录
   */
  private void aesJieMi(String path) {
    File f = new File(path);
    if (!f.exists() || f.isDirectory())
      Toast.makeText(getApplicationContext(), "该文件不合法!", Toast.LENGTH_SHORT).show();
    else {
      String prefix = f.getName().substring(0, f.getName().indexOf('.'));
      String suffix = f.getName().substring(f.getName().indexOf('.'));
      String outjiemiFile = Environment.getExternalStorageDirectory() + File.separator + prefix + "AES_jieMi" + suffix; 

      AESKeyModel model_aes = new AESKeyModel();
      model_aes.setSrcFile(path);
      model_aes.setDestionFile(outjiemiFile); 

      try {
//        model_aes.descryptionFile(key_AES);
        model_aes.descryptionFile(key_aes);
        // TODO: 加密后的文件
        RandomAccessFile raf = new RandomAccessFile(path, "rw");
        Log.d(TAG, "解密后 file length: " + raf.length());
        Log.d(TAG, "解密后 file content: " + raf.readLine());
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }

总结:

注意秘钥需要一致。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android、iOS和Java通用的AES128加密解密示例代码

    前言 移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如android和iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输. 这篇文章给大家分享AES的加密和解密.Android和ios通用的AES加密算法.大家可以直接集成到自己的项目.服务器接口如果是用Java写的话.整个框架都完美了.如果是.NET编写的后台接口的话.得改造一下哦 IOS加密 /*加密方法*/ (NSString *)AES256EncryptWithPlainText:(NSString

  • android使用AES加密和解密文件实例代码

    前言 最近公司需要对本公司的一些下载文件进行加密解密需求,也就尝试去实现下,其实需要借助第三方的jar包:bcprov-jdk15on-155.jar,下载这个可以到网上搜或者下载本人的demo即可,注意:需要加密和解密的key是一致的才可以解密,不然就会解密失败.不多说,直接上代码. 效果图 代码: 实现加密解密逻辑代码 package com.vsoontech.p2p.sample; import java.io.IOException; import java.io.InputStrea

  • Java使用AES加密和解密的实例详解

    Java使用AES加密和解密的实例详解 前言: AES的基本要求是,采用对称分组密码体制,密钥长度的最少支持为128.192.256,分组长度128位,算法应易于各种硬件和软件实现.1998年NIST开始AES第一轮分析.测试和征集,共产生了15个候选算法.1999年3月完成了第二轮AES2的分析.测试.2000年10月2日美国政府正式宣布选中比利时密码学家Joan Daemen 和 Vincent Rijmen 提出的一种密码算法RIJNDAEL 作为 AES. 在应用方面,尽管DES在安全上

  • Golang实现AES加密和解密的示例代码

    目录 对称加密 AES 算法 加解密 文件加密解密 说明 对称加密 AES 算法 (Advanced Encryption Standard ,AES) 优点 算法公开.计算量小.加密速度快.加密效率高. 缺点 发送方和接收方必须商定好密钥,然后使双方都能保存好密钥,密钥管理成为双方的负担. 应用场景 相对大一点的数据量或关键数据的加密. 加解密 package helpers import ( "bytes" "crypto/aes" "crypto/c

  • Android使用RSA加密和解密的示例代码

    一.公钥加密和私钥解密 /**RSA算法*/ public static final String RSA = "RSA"; /**加密方式,android的*/ // public static final String TRANSFORMATION = "RSA/None/NoPadding"; /**加密方式,标准jdk的*/ public static final String TRANSFORMATION = "RSA/None/PKCS1Pad

  • 使用Python进行AES加密和解密的示例代码

    高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用.经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准.2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一.---百度百科 本科的时候弄过DES

  • java 数据的加密与解密普遍实例代码

    这是一个关于密钥查询的jsp文件,接受上级文件的数据并加密处理,放入Map集合中,通过form表单提交到xdoc文件中:不过这种做法是为了满足公司的要求,用到了框架的内容不免显得繁琐:下篇文章会介绍一种简便的不需要搭建太多环境的普遍做法. <br><br><%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8&quo

  • Python基于pycrypto实现的AES加密和解密算法示例

    本文实例讲述了Python基于pycrypto实现的AES加密和解密算法.分享给大家供大家参考,具体如下: 一 代码 # -*- coding: UTF-8 -*- import string import random from Crypto.Cipher import AES def keyGenerater(length): '''''生成指定长度的秘钥''' if length not in (16, 24, 32): return None x = string.ascii_lette

  • python简单实现AES加密和解密

    本文实例为大家分享了python实现AES加密和解密的具体代码,供大家参考,具体内容如下 参考:python实现AES加密和解密 AES加密算法是一种对称加密算法, 他有一个密匙, 即用来加密, 也用来解密 import base64 from Crypto.Cipher import AES # 密钥(key), 密斯偏移量(iv) CBC模式加密 def AES_Encrypt(key, data): vi = '0102030405060708' pad = lambda s: s + (

  • java使用RSA与AES加密解密的实例代码详解

    首先了解下,什么是堆成加密,什么是非对称加密? 对称加密:加密与解密的密钥是相同的,加解密速度很快,比如AES 非对称加密:加密与解密的秘钥是不同的,速度较慢,比如RSA •先看代码(先会用在研究) 相关依赖: <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.58</versio

  • Java AES加密和解密教程

    在本教程中,我们将看到如何使用JDK中的Java密码体系结构(JCA)来实现AES加密和解密.对称密钥块密码在数据加密中起重要作用.这意味着同一密钥可用于加密和解密.高级加密标准(AES)是一种广泛使用的对称密钥加密算法. AES算法是一种迭代的对称密钥块密码,它支持128.192和256位的加密密钥(秘密密钥),以对128位的块中的数据进行加密和解密. 在AES中生成密钥的方法有两种:从随机数生成或从给定密码生成. 在第一种方法中,应该从像SecureRandom类这样的加密安全(伪)随机数生

随机推荐