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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 补码、二进制的减法

    补码、二进制的减法有关二进制的负数及减法运算二进制数表示方法:原码反码补码二进制减法运算法则:**二进制数表示方法:**无符号二进制数(正数)(8位)(能够表示的十进制数范围0-255)举例:10(8’b0000_1010)100(8’b0110_0100)255(8’b1111_1111)有符号二进制数(正数负数)(8位)(能够表示的十进制数范围-128~127)举例…

    2022年6月18日
    32
  • shell getopt「建议收藏」

    shell getopt「建议收藏」getopt简介命令语法解析规则短选项长选项双引号的作用shell脚本示例shift命令set命令eval实际运行最后getopt简介以下主要翻译自mangetopt。getopt是用来解析传入shell的命令行参数的,它可以支持如‘rm-r’中’-r’形式的参数解析。命令语法先从一个较为明了的语法开始getopt-ooptstring–paramete

    2022年4月29日
    155
  • 心灵鸡汤【5】

    心灵鸡汤【5】

    2021年8月20日
    58
  • 逻辑漏洞之密码找回漏洞(semcms)「建议收藏」

    逻辑漏洞之密码找回漏洞(semcms)「建议收藏」目录什么是密码找回漏洞一般流程可能产生该漏洞的情况脑洞图1.用户凭证暴力破解2.返回凭证3.邮箱弱token4.用户凭证有效性5.重新绑定6.服务器验证7.用户身份验证8.找回步骤9.本地验证10.注入11.Token生成12.注册覆盖13.session覆盖演示暴破验证码找回密码更改id号修改admin密码靶场cms下载什么是密码找回漏洞利用漏洞修改他人帐号密码,甚至修改管理员的密码。一般流程1首先尝试正常找回密码流程,选择不同的找回方式,记录所有数据包2分析数据包,找到敏感部分3

    2022年4月30日
    75
  • MySQL安装配置教程(超详细!)

    MySQL安装配置教程(超详细!)Windows下有两种安装MySQL的方式:图形界面安装(.msi文件)免安装版(.zip压缩文件)MySQL下载官网:http://www.mysql.com也可前往百度网盘提取(两种安装方式文件都有):链接:https://pan.baidu.com/s/1NMRUu_E098h4ErzSXTUKgA提取码:3tfb一、MySQL免安装版配置教程http://c.biancheng.net/view/2412.html二、MySQL图形界面安装(一)安装MySQL1.打开安

    2022年5月31日
    40
  • 初始化磁盘_c++怎么初始化

    初始化磁盘_c++怎么初始化磁盘在联机后要初始化,同样也有两种方法,一种是调用IOCTL_DISK_CREATE_DISK,还有一种是调用WMI的Initialize方法。1.首先说说简单的WMI的方法:大致思路同博客:C++实现磁盘联机 先获取磁盘的id,然后执行无参数方法Initialize 核心模块代码如下:wchar_tmsftDiskObjectID[256];GetWMIMSFTDiskObjectId(…

    2025年11月26日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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