Android 加密 AES

Android 加密 AESAES加密又称对称性加密,在开发中常用于对流数据对加密,尤其是流数据在网络传输过程中,担心被泄露,AES加密被常用于这块的校验中。下面是AES加密的百度百科说明解释:AES加密标准又称为高级加密标准Rijndael加密法,是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准。AES的基本要求是,采用对称分组密码体制,密钥长度可以为128、192或256…

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

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)

例子


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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/145786.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 在linux中使用md5校验文件的完整性

    在linux中使用md5校验文件的完整性

  • 磁盘在磁盘管理中显示没有初始化找回文件方案「建议收藏」

    磁盘在磁盘管理中显示没有初始化找回文件方案「建议收藏」磁盘没有初始化是因为0号扇区损坏,导致机械硬盘分区表读取不出来,从而机械硬盘出现磁盘没有初始化。工具/软件:极限数据恢复软件步骤1:程序打开后,直接双击需要恢复数据的物理盘。步骤2:等待程序扫描完毕大概需要几分钟到半个小时,稍微耐心等下即可。步骤3:软件扫描到资料后,软件会将扫描到的分区列出来。步骤4:勾上所有需要恢复的资料,右击选择《复制勾选的文件》,…

  • pycharm 激活吗【2021最新】「建议收藏」

    (pycharm 激活吗)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

  • 利用serv-u创建ftp服务器_ftp读取目录列表失败

    利用serv-u创建ftp服务器_ftp读取目录列表失败一、由来最近改写了项目中ftp上传部分的代码。用到的组件为:<dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.3</version></depen…

  • 统计学 方差分析_python编写计算方差的函数

    统计学 方差分析_python编写计算方差的函数一、理论学习1.0、概念1、方差分析(ANOVA)用于研究一个或多个分类型自变量与一个数值型因变量的关系。方差分析通过检验多个总体(同属于一个大整体)的均值是否相等来判断一个或多个分类型自变量对数值型因变量是否由显著影响。2、方差分析包含的三个重要概念:(以小学六年级的学习成绩为例)因子:分类型自变量。例如:六年级的所有班级水平:某个因子下的不同取值。例如六年级有一班、二班、三班。观测值:每个因子水平下的样本观测值。例如:六年级三个班各自的学生成绩。1.1、单因素方差分析1.1.1

  • bind()、call()、apply()理解及用法

    bind()、call()、apply()理解及用法

发表回复

您的电子邮箱地址不会被公开。

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