AES 加密又称对称性加密,在开发中常用于对流数据对加密,尤其是流数据在网络传输过程中,担心被泄露,AES 加密被常用于这块的校验中。下面是 AES 加密的百度百科说明解释:

AES加密标准又称为高级加密标准 Rijndael 加密法,是美国国家标准技术研究所NIST旨在取代 DES 的 21 世纪的加密标准。AES 的基本要求是,采用对称分组密码体制,密钥长度可以为 128、192 或 256 位,分组长度 128 位,算法应易在各种硬件和软件上实现。1998 年 NIST 开始 AES 第一轮分析、测试和征集,共产生了 15 个候选算法。
1999 年 3 月完成了第二轮 AES2 的分析、测试。2000 年 10 月 2 日美国政府正式宣布选中比利时密码学家 Joan Daemen 和 Vincent Rijmen 提出的一种密码算法 Rijndael作为 AES 的加密算法。
AES 加密数据块和密钥长度可以是 128b、192b、256b 中的任意一个。AES 加密有很多轮的重复和变换。大致步骤如下:
①密钥扩展(Key Expansion)
②初始轮(InitialRound)
③重复轮(Rounds),每一重复轮又包括字节间减法运算(SubBytes)、行移位(ShiftRows)、列混合(MixColumns)、轮密钥加法运算(AddRoundKey) 等操作
④最终轮(Final Round),最终轮没有列混合操作(MixColumns)

接下来把 Android 的代码贴一下:

  • 解密
    public static byte[] decryptData(byte[] data, byte[] key, byte[] iv, String transformation) throws Exception {if (data == null || data.length == 0|| key == null || key.length < 16|| iv == null || iv.length < 16|| transformation == null || transformation.length() == 0) {throw (new InvalidParameterException());}AlgorithmParameterSpec ivSpec = new IvParameterSpec(iv);SecretKeySpec newKey = new SecretKeySpec(key, "AES");Cipher cipher = Cipher.getInstance(transformation,"BC");cipher.init(Cipher.DECRYPT_MODE, newKey, ivSpec);return cipher.doFinal(data);}
  • 加密
public static byte[] encryptEncode(byte[] data, byte[] key, byte[] iv, String transformation) throws Exception {if (data == null || data.length == 0|| key == null || key.length == 0|| iv == null || iv.length == 0|| transformation == null || transformation.length() == 0) {throw (new InvalidParameterException());}AlgorithmParameterSpec ivSpec = new IvParameterSpec(iv);SecretKeySpec newKey = new SecretKeySpec(key, "AES");Cipher cipher = Cipher.getInstance(transformation,"BC");cipher.init(Cipher.ENCRYPT_MODE, newKey, ivSpec);return cipher.doFinal(data);}
  • key 密钥必须是 16 位以上

  • iv:偏移量,最少 16 位数

  • transformation 的选择
    一般选择 PKCS7Padding,因为 PKCS5Padding 最终调用的是 PKCS7Padding 只是做了块位数的限制 详情请看
    另外要注意 Java 是不支持 PKCS7Padding,需要引入 bouncycastle https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk16
    组件实现

  • base64 编码
    与后台人员协商,如果是需要对数据进行编码解码,协商好,只需要通过以下方式中转就可以了

byte[] baseData = Base64.encode(cipher.doFinal(data), Base64.DEFAULT)

例子

@Testpublic void  test(){byte[] data = {0x01,0x02,0x03,0x04,0x05};byte[] mAESKey = {0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01};byte[] iv = {0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01};String mAESTransformation = "AES/CBC/PKCS7Padding";try {byte[] encrypt = EncryptUtil.encryptEncode(data, mAESKey, iv, mAESTransformation);byte[] decrypt = EncryptUtil.decryptData(encrypt, mAESKey, iv, mAESTransformation);System.out.println("加密前:"+bytes2HexString(data));System.out.println("加密后:"+bytes2HexString(encrypt));System.out.println("解密后:"+bytes2HexString(decrypt));} catch (Exception e) {e.printStackTrace();}}public static String bytes2HexString(byte[] bytes) {String ret = "";for (int i = 0; i < bytes.length; i++) {String hex = Integer.toHexString(bytes[i] & 0xFF);if (hex.length() == 1) {hex = '0' + hex;}ret += hex.toUpperCase();}return ret;}

结果

加密前:0102030405
加密后:F2C0C2091ABB5CC09FC71E4614E0733B
解密后:0102030405

Android 加密 AES相关推荐

  1. Android加密和解密(DES,AES,MD5)

    加密是通过加密算法和加密密钥将明文转变为密文的过程,解密是其逆过程.加密算法有很多种,一般可以分为对称加密(如DES.AES等).非对称加密(如RSA等)和单向加密(如MD5等)3类算法. 1)在对称 ...

  2. Android采用AES+RSA的加密机制对http请求进行加密

    前言 最近维护公司APP应用的登录模块,由于测试人员用Fiddler抓包工具抓取到了公司关于登录时候的明文登录信息.虽然使用的是HTTPS的方式进行http请求的,但还是被Fiddler抓到了明文内容 ...

  3. android 十六进制加密,使用十六进制十进制值的Android加密和解密?

    本问题已经有最佳答案,请猛点这里访问. 我需要在Android中进行加密和解密, 现在我使用"aes"算法加密,我得到了一些加密值,比如"?*?1FO??'但我需要这样的 ...

  4. Android加密手机

    CSDN地址: http://blog.csdn.net/magod/article/details/7928090 原文地址:http://source.android.com/tech/encry ...

  5. 【加密】对称加密DES和非对称加密AES、数字签名|非对称加密--公钥和私钥的区别

    目录 对称加密DES和非对称加密AES.数字签名 对称加密 1.1 定义 1.2 优缺点 1.3 常用对称加密算法 非对称加密( Asymmetric Cryptography ) 非对称加密(现代加 ...

  6. js加密-AES加密解密

    js加密-AES加密解密 // AES加密AESencrypt(word) {let srcs = CryptoJS.enc.Utf8.parse(word);let encrypted = Cryp ...

  7. JS常见加密 AES、DES、RSA、MD5、SHAI、HMAC、Base64(编码) - Python/JS实现

    主要加密算法前言 本文仅仅介绍了常见的一些JS加密,并记录了JS和Python的实现方式 常见的加密算法基本分为这几类: (1)base64编码伪加密 (2)线性散列算法(签名算法)MD5 (3)安全 ...

  8. android n AES加密,AndroidP AES 加密适配

    message Android N Didn't find class "org.apache.harmony.security.provider.crypto.SHA1PRNG_Secur ...

  9. android base64解密,android Base64 AES加密解密

    Android Base64代码如下: // 加密传入的数据是byte类型的,并非使用decode方法将原始数据转二进制,String类型的数据 使用 str.getBytes()即可 String ...

最新文章

  1. 软件定义闪存存储系统关键技术
  2. 使用pip将Python包安装到不同的目录中?
  3. 这个省3月23日开始错时错峰开学,在校不要求戴口罩!
  4. java main生命周期_java的生命周期
  5. Halcon图像预处理与形态学(图像的滤波)
  6. spring aop如何在切面类中获取切入点相关方法的参数、方法名、返回值、异常等信息
  7. springmvc生成注册验证码
  8. 流畅的python和cookbook学习笔记(五)
  9. PHP实现下载远程图片保存到本地的方法
  10. 【机器学习/MachineLearning】相关基本概念2——归纳,演绎,溯因法
  11. 开发中mock什么意思_开发中
  12. 你真的会用苹果备忘录吗?iPhone用户必须学会的10个备忘录使用技巧
  13. 开发版linux随身wifi,让linux下无线网卡变身随身wifi
  14. OpenWrt上搭建纯L2TP服务器[ZT]
  15. 2020年中国各省GDP简析
  16. Redis布隆过滤器与布谷鸟过滤器
  17. 局部二值模式LBP的详细理解
  18. Storm Metric
  19. 猜拳游戏python实现
  20. 如何制作新年公众号封面图?手把手教你在线编辑图片

热门文章

  1. RV1126笔记一:环境搭建及SDK编译
  2. javascript练习12:得到输入歌词中朋友出现的次数
  3. 迷宫游戏python实现
  4. 公众号被处罚后排名下滑
  5. unix操作系统可以用于服务器管理吗,UNIX操作系统使用必备(四)
  6. LeetCode刷题分类
  7. Android端集成支付宝支付
  8. 强烈推荐一位改变我命运的程序员大佬!当作礼物送给你!
  9. IC学习笔记——DRV8804
  10. TSDB 时序数据库时序数据压缩解压技术浅析