美文网首页加密
对称加密之-AES加密

对称加密之-AES加密

作者: MengkZhang | 来源:发表于2019-07-28 10:04 被阅读5次

AES简介

高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图


使用

  • 安卓中AES加密方案如下:
  • 安卓里面提供了2个API:SecretKeySpec和Cipher
  • 明文和密文,由Ciper提供加密和解密的函数

第一步:首先生成秘钥

 /**
     * 生成秘钥
     * @return Base64编码的秘钥
     */
    public static String generateSecretKey() {
        try {
            // 获取Key生成器实例,一般一个实例可以多次用来生成秘钥
            KeyGenerator keyGenerator = KeyGenerator.getInstance(AES);
            // 256位
            keyGenerator.init(256);
            // 生成密钥
            SecretKey secretKey = keyGenerator.generateKey();
            // 获取密钥
            byte[] keyBytes = secretKey.getEncoded();
            return Base64.encodeToString(keyBytes, Base64.DEFAULT);// 生成的秘钥转换成Base64编码,加、解密时需要用Base64还原秘钥
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }

第二步:加密明文

   /**
     * 加密
     * @param plaintext 明文
     * @param key 秘钥
     * @return Base64编码的密文
     */
    public static String encrypt(String plaintext, String key) {
        try {
            // Base64还原秘钥
            byte[] keyBytes = Base64.decode(key.getBytes(), Base64.DEFAULT);
            // 还原密钥对象
            SecretKey secretKey = new SecretKeySpec(keyBytes, AES);
            // 加密初始化实例
            Cipher cipher = Cipher.getInstance(AES_CBC_PKCS5_PADDING);
            // CBC模式需要添加一个参数IvParameterSpec,ECB模式则不需要
            cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(new byte[cipher.getBlockSize()]));
            byte[] result = cipher.doFinal(plaintext.getBytes("UTF-8"));
            return Base64.encodeToString(result, Base64.DEFAULT);// 生成的密文转换成Base64编码出文本,解密时需要用Base64还原出密文
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (InvalidAlgorithmParameterException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        }
        return null;
    }
 

第三步:解密密文

    /**
     * 解密
     * @param ciphertext 密文
     * @param key  秘钥
     * @return 明文
     */
    public static String decrypt(String ciphertext, String key) {
 
        try {
            byte[] keyBytes = Base64.decode(key.getBytes(), Base64.DEFAULT);// Base64还原秘钥
            // 还原密钥对象
            SecretKey secretKey = new SecretKeySpec(keyBytes, AES);
            // 加密初始化实例
            Cipher cipher = Cipher.getInstance(AES_CBC_PKCS5_PADDING);
            cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(new byte[cipher.getBlockSize()]));
            // Base64还原密文
            byte[] cipherBytes = Base64.decode(ciphertext, Base64.DEFAULT);
            byte[] result = cipher.doFinal(cipherBytes);
            return new String(result, "UTF-8");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (InvalidAlgorithmParameterException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }
}

几个全局变量

    private static final String AES_CBC_PKCS5_PADDING = "AES/CBC/PKCS5Padding";
    private static final String AES = "AES";

密钥

用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的。密钥为接收方与发送方协商产生,但不可以直接在网络上传输,否则会导致密钥泄漏,通常是通过非对称加密算法加密密钥,然后再通过网络传输给对方,或者直接面对面商量密钥。密钥是绝对不可以泄漏的,否则会被攻击者还原密文,窃取机密数据。

加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合。缺点是密钥的传输比较麻烦

AES的基本结构和原理

AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同,如下表所示

轮数在下面介绍,这里实现的是AES-128,也就是密钥的长度为128位,加密轮数为10轮。
上面说到,AES的加密公式为C = E(K,P),在加密函数E中,会执行一个轮函数,并且执行10次这个轮函数,这个轮函数的前9次执行的操作是一样的,只有第10次有所不同。也就是说,一个明文分组会被加密10轮。AES的核心就是实现一轮中的所有操作

现在假设明文分组P为”abcdefghijklmnop”,则对应上面生成的状态矩阵图如下:


上图中,0x61为字符a的十六进制表示。可以看到,明文经过AES加密后,已经面目全非

解密过程仍为10轮,每一轮的操作是加密操作的逆操作。由于AES的4个轮操作都是可逆的,因此,解密操作的一轮就是顺序执行逆行移位、逆字节代换、轮密钥加和逆列混合。同加密操作类似,最后一轮不执行逆列混合,在第1轮解密之前,要执行1次密钥加操作。

相关文章

  • iOS开发证书相关总结

    加密、解密 对称加密、非对称加密 对称加密:加密、解密使用相同的密钥;DES、AES(Mac、Windows的磁盘...

  • 密码学及iOS签名(一) —— 加密解密

    加密解密类型 对称加密 公钥密码(非对称加密) 对称加密(常见的DES、 3DES、AES) 在对称密码中,加密、...

  • (23)加密算法

    23.1 AES算法(对称加密) 高级加密标准(AES,Advanced Encryption Standard)...

  • iOS常用加密算法

    AES(对称加密) 代码: 使用: RSA(非对称加密) 参考文章

  • 史上最详HTTPS加密解析

    一、概念 加密类型 1、对称加密,如:常见的AES 加密算法 2、非对称加密,如:常见的RSA 加密算法 对称加密...

  • 2019-06-10 对称加密 和非对称加密

    一、对称加密 AES加密 AES加密是一种高级加密标准,是一种区块加密标准。它是一个对称密码,就是说加密和解密用相...

  • 有关https

    加密类型 首先了解一下两种加密类型 对称类型 如AES DES 非对称加密 如RSA 对称加密 对称加密很好理解...

  • iOS加密实用总结

    加密原则: 一:对称加密的话用AES最好,苹果系统(钥匙串也是用的AES加密),美国安全局,RSA中的对称加密用的...

  • RSA和AES区别

    先了解下AES和RSA的区别,前者属于对称加密,后者属于非对称加密。 1、对称加密 对称加密就是加密和解密使用同一...

  • 命令

    文件编译 加密解密 1. 对称加密 DES AES Base64 2. 非对称加密 RSA RSA加密:公钥加密,...

网友评论

    本文标题:对称加密之-AES加密

    本文链接:https://www.haomeiwen.com/subject/kpdurctx.html