aes是什么?

aes是对称加密的一种,什么是对称加密呢?就是加密和解密使用相同的秘钥的加密算法,显而易见,aes加密和md5不同,aes是可逆的,aes加密算法用于替代以前的des加密算法。

使用场景:

         工作的过程中,我们有些文件因为需要携带出公司,可能需要加密,最常见的比如源代码加密。如果我想让加密可逆,又能自己指定加密和解密使用的秘钥,那么aes加密算法真的是一个不错的选择哦。因为既然可以自己指定秘钥,我们控制起来就会让aes这个加密算法安全很多。

看下面的例子:

package com.lzzcms.utils;import java.io.File;
import java.security.SecureRandom;import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;import org.apache.commons.io.FileUtils;
public class CryptoUtilTest {public static Cipher getCipher(int type,String seed){try {// 创建AES的KeyGenerator对象KeyGenerator  kgen = KeyGenerator.getInstance("AES");// 利用用户传入的字符串作为种子初始化出128位的key生产者不能使用//kgen.init(128, new SecureRandom(seed.getBytes()));因为在linux上会导致加解密出错,//见代码后边的说明。SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" );secureRandom.setSeed(seed.getBytes());kgen.init(128, secureRandom);//生成秘钥SecretKey  secretKey = kgen.generateKey(); //返回基本编码格式的密钥,如果此密钥不支持编码,则返回 null。byte[] enCodeFormat = secretKey.getEncoded();// 转换为AES专用密钥SecretKeySpec  specKey = new SecretKeySpec(enCodeFormat, "AES");// 创建密码器Cipher cipher = Cipher.getInstance("AES");// 初始化为加密模式Cipher.ENCRYPT_MODE或解密模式Cipher.DECRYPT_MODE的密码器cipher.init(type, specKey);return cipher;} catch (Exception e) {e.printStackTrace();} return null;}/*** 加密* @param content :要加密的内容* @param seed :种子* @return  :加密后的字节数组*/public static byte[] encrypt(String content, String seed) {try {Cipher cipher = getCipher(Cipher.ENCRYPT_MODE,seed);byte[] contentBytes = content.getBytes("utf-8");byte[] result = cipher.doFinal(contentBytes);return result;} catch (Exception e) {e.printStackTrace();} return null;}/***  解密AES加密过的字节数组* @param contentBytes :AES加密过的字节数组* @param seed  :加密时传入的种子* @return  :解密后的字节数组*/public static byte[] decrypt(byte[] contentBytes, String seed) {try {Cipher cipher = getCipher(Cipher.DECRYPT_MODE,seed);byte[] result = cipher.doFinal(contentBytes);  return result;  } catch (Exception e) {e.printStackTrace();}return null;}/**将字节数组转换成16进制字符组成的字符串 * @param buf :* @return */  public static String parseByte2HexStr(byte buf[]) {  StringBuffer sb = new StringBuffer();  int length = buf.length;for (int i = 0; i < length; i++) {  String hex = Integer.toHexString(buf[i]&0xFF);  if (hex.length() == 1) {  hex = '0' + hex;  }  sb.append(hex.toUpperCase());  }  return sb.toString();  } /*** 把16进制字符组成的字符串转为字节数组并返回* 这里传入的十六进制一定是偶数的长度,因为parseByte2HexStr处理了* @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++) {  //两个十六进制字符构成一个byte.high表示高4位,low表示低四位。Integer.parseInt(s,radix),//作用:把s转为10进制,radix指定s是什么进制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;  }public static void main(String[] args) throws Exception {test();        }private static void test() throws Exception {String content = FileUtils.readFileToString(new File("D:\\zhao\\tmp\\app.py"), "utf-8");String seed = "123";//秘钥System.out.println("加密之前:" + content);// 加密byte[] encrypt = CryptoUtil.encrypt(content, seed);System.out.println("加密后返回的字节数组转为string:" + new String(encrypt,"utf-8"));//如果想要加密内容不显示乱码,需要将加密后返回的字节数组转换为16进制String hexStrResult = CryptoUtil.parseByte2HexStr(encrypt);System.out.println("加密后返回的字节数组转为16进制字符组成的字符串:"+hexStrResult);//把16进制字符组成的字符串还原为字节数组byte[] twoBytes = CryptoUtil.parseHexStr2Byte(hexStrResult);System.out.println("16进制字符组成的字符串还原的字节数组:"+new String(twoBytes,"utf-8"));//解密1byte[] decrypt1 = CryptoUtil.decrypt(twoBytes, seed);System.out.println("通过16进制字符组成的字符串还原的字节数组解密:"+new String(decrypt1,"utf-8"));  /* 解密2:与解密1结果完全一样,之所以通过16进制转换了一下,仅仅是为了在存储的时候不想存储乱码二是存储16进制字符组成的字符串而已*/byte[] decrypt = CryptoUtil.decrypt(encrypt, seed);System.out.println("通过加密后的原始字节数组解密:" + new String(decrypt,"utf-8"));}
}

结果截图如下:

代码说明:

1.功能解释:读入一个python文件,并把源代码的内容进行aes加密,因为转为字符串之后是乱码,需要转为16进制字符组成的字符串,也相当于进行了一次二次加密。

2.不能使用kgen.init(128, new SecureRandom(seed.getBytes()));因为在linux上会导致加解密出错:

javax.crypto.BadPaddingException: Given final block not properly paddedat com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)at com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..)at javax.crypto.Cipher.doFinal(DashoA13*..)at chb.test.crypto.AESUtils.crypt(AESUtils.java:386)at chb.test.crypto.AESUtils.AesDecrypt(AESUtils.java:254)at chb.test.crypto.AESUtils.main(AESUtils.java:40)

虽然kgen.init(128, new SecureRandom(seed.getBytes()));和

SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" );

secureRandom.setSeed(seed.getBytes());

kgen.init(128, secureRandom);

看起来差不多,但是如果使用kgen.init(128, new SecureRandom(seed.getBytes()));就会报上边的错,当初想起来也是让我折腾了好久呀,后来查资料说是SecureRandom 的内部实现与操作系统有关,但是如果在getInstance 方法之后又调用了 setSeed 方法,就可以避免这种因为操作系统的不同而一起的差异,以便确保在 windows 和所有的linux上每次初始化的 key 都相同。

3.上面我只是打印出了各个步骤加密和解密后的结果,实际存储的时候可以把16进制字符组成的字符串存放在文件中作为加密文件的内容,解密的时候读取该加密内容按照上边代码中的方法解密就可以了。

java使用aes加密文件内容相关推荐

  1. java中读取properties文件内容五种方式

    一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC ...

  2. 五种方式让你在java中读取properties文件内容不再是难题

    2019独角兽企业重金招聘Python工程师标准>>> 方式1.通过context:property-placeholder加载配置文件jdbc.properties中的内容 < ...

  3. JAVA实现AES加密

    JAVA实现AES加密 java实现AES加密,直接上代码: import java.security.InvalidKeyException; import java.security.NoSuch ...

  4. .NET对JAVA进行AES加密(SHA1PRNG)及解密方法

    第一步:生成对应JAVA AES加密方法的KEY值 private static byte[] encryptJavaAes(string aesKey)         {             ...

  5. java aes iv 24位_【JAVA】AES加密 简单实现 AES-128/ECB/PKCS5Padding

    AES加密 AES 是一种可逆加密算法,对用户的敏感信息加密处理. 本文暂不深入AES原理,仅关注JAVA代码实现AES加解密. JAVA代码实现 这是一个在线AES加密网站.从页面上我们可以看到如下 ...

  6. java android aes加密解密_AES加密解密在JAVA和ANDROID下互通

    昨天外包安卓的那个人说AES的加解密结果不一样.于是百度搜索发现还真是! 贴上AES加密核心: Cipher cipher = Cipher.getInstance("AES/CBC/PKC ...

  7. ios java aes_PHP7 AES加密解密函数_兼容ios/andriod/java对等加解密

    **PHP7.0 7.1 7.2 7.3 AES对等加解密类 函数文件_兼容ios/andriod/java等** 由于新项目规划要求使用PHP7.2开发环境,但在部分新系统中仍需使用AES加解密方式 ...

  8. java字符流 加密文件和解密文件

    准备一个文本文件(非二进制),其中包含ASCII码的字符和中文字符. 设计一个方法 public static void encodeFile(File encodingFile, File enco ...

  9. window环境下AES加密文件无法解密问题记录

    最近在做项目中遇到需要对数据进行AES加密,加密文件用openssl命令行解密. 在linux/unix 环境下测试没有问题,但在windows环境下一直解密失败,由于AES解密数据要求解密数据需16 ...

最新文章

  1. 动视暴雪员工大罢工:因CEO被曝多次包庇高管性侵下属、本人曾性骚扰助理
  2. (并查集 带关系)Find them, Catch them -- poj -- 1703
  3. 【干货】最早的打车App产品摇摇招车死亡背后的那些经验
  4. ACM论文格式上常见的一些错误
  5. 北京 | 一场产品经理必听的实战交流会!
  6. 寻找丢失的数字(二)
  7. SAP Spartacus home页面根据product code请求产品数据的几种边界情况
  8. fs-extra导出换行txt文件
  9. 博客开通了,开卷有益,纪念一下
  10. AJAX(XMLHttpRequest)进行跨域请求方法详解(三)
  11. 安装MATLAB R2012B遇到问题(需要继续安装以下一个或多个产品: MATLAB 8.0 (不可用) 您必须选择已至少安装这些),已决解!...
  12. 深入解剖 linux内存管理之mmap
  13. python怎么设置加密,Python 加密的实例详解
  14. oracle安装包安装教程,oracle安装教程【搞定方案】
  15. STM32F207时钟系统解析
  16. cmd批量修改文件名 增加文字_如何批量修改文件名称,如何批量修改文件标题
  17. 遗传算法和神经网络算法区别与联系
  18. LATEX如何设置英文字体,中英文标题
  19. kali流量转发后依然断网_虚拟运营商流量卡列表
  20. 普物期末题型总结题解

热门文章

  1. WINDOWS7 安装node最新版本成功
  2. Python脚本---在 MySQL数据库中跑批加载多个表的数据
  3. 根据慕课网Daisy老师教程写的 爱心鱼 网页小游戏
  4. 8421.5421.2421.余3码的区别
  5. RPG血腥僵尸感染像素恐怖游戏素材地图场景
  6. 如何用ipad或者是iphone来无线投屏到电视机
  7. 深入了解css中的grid布局
  8. 中控煤化工丨大型煤化工智能工厂高效精准生产,到底有多牛?
  9. 简网越过阅读,重新定义个性化
  10. 【报告分享】2021-11-20-2022年家电市场趋势与机会展望-GfK(附下载)