Android 加密 AES
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相关推荐
- Android加密和解密(DES,AES,MD5)
加密是通过加密算法和加密密钥将明文转变为密文的过程,解密是其逆过程.加密算法有很多种,一般可以分为对称加密(如DES.AES等).非对称加密(如RSA等)和单向加密(如MD5等)3类算法. 1)在对称 ...
- Android采用AES+RSA的加密机制对http请求进行加密
前言 最近维护公司APP应用的登录模块,由于测试人员用Fiddler抓包工具抓取到了公司关于登录时候的明文登录信息.虽然使用的是HTTPS的方式进行http请求的,但还是被Fiddler抓到了明文内容 ...
- android 十六进制加密,使用十六进制十进制值的Android加密和解密?
本问题已经有最佳答案,请猛点这里访问. 我需要在Android中进行加密和解密, 现在我使用"aes"算法加密,我得到了一些加密值,比如"?*?1FO??'但我需要这样的 ...
- Android加密手机
CSDN地址: http://blog.csdn.net/magod/article/details/7928090 原文地址:http://source.android.com/tech/encry ...
- 【加密】对称加密DES和非对称加密AES、数字签名|非对称加密--公钥和私钥的区别
目录 对称加密DES和非对称加密AES.数字签名 对称加密 1.1 定义 1.2 优缺点 1.3 常用对称加密算法 非对称加密( Asymmetric Cryptography ) 非对称加密(现代加 ...
- js加密-AES加密解密
js加密-AES加密解密 // AES加密AESencrypt(word) {let srcs = CryptoJS.enc.Utf8.parse(word);let encrypted = Cryp ...
- JS常见加密 AES、DES、RSA、MD5、SHAI、HMAC、Base64(编码) - Python/JS实现
主要加密算法前言 本文仅仅介绍了常见的一些JS加密,并记录了JS和Python的实现方式 常见的加密算法基本分为这几类: (1)base64编码伪加密 (2)线性散列算法(签名算法)MD5 (3)安全 ...
- android n AES加密,AndroidP AES 加密适配
message Android N Didn't find class "org.apache.harmony.security.provider.crypto.SHA1PRNG_Secur ...
- android base64解密,android Base64 AES加密解密
Android Base64代码如下: // 加密传入的数据是byte类型的,并非使用decode方法将原始数据转二进制,String类型的数据 使用 str.getBytes()即可 String ...
最新文章
- 软件定义闪存存储系统关键技术
- 使用pip将Python包安装到不同的目录中?
- 这个省3月23日开始错时错峰开学,在校不要求戴口罩!
- java main生命周期_java的生命周期
- Halcon图像预处理与形态学(图像的滤波)
- spring aop如何在切面类中获取切入点相关方法的参数、方法名、返回值、异常等信息
- springmvc生成注册验证码
- 流畅的python和cookbook学习笔记(五)
- PHP实现下载远程图片保存到本地的方法
- 【机器学习/MachineLearning】相关基本概念2——归纳,演绎,溯因法
- 开发中mock什么意思_开发中
- 你真的会用苹果备忘录吗?iPhone用户必须学会的10个备忘录使用技巧
- 开发版linux随身wifi,让linux下无线网卡变身随身wifi
- OpenWrt上搭建纯L2TP服务器[ZT]
- 2020年中国各省GDP简析
- Redis布隆过滤器与布谷鸟过滤器
- 局部二值模式LBP的详细理解
- Storm Metric
- 猜拳游戏python实现
- 如何制作新年公众号封面图?手把手教你在线编辑图片