暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

AES加密

闲来无去 2021-10-25
3030

     AES加解密简述

        AES密钥为对称密钥,为分组密码,密钥的长度可以为128位(16字节)、192位(24字节)、256位(32字节)。

        对称密钥的意思就是加密和解密使用的是同一个密钥串。加解密流程如下:

  • 明文P

    要被加密的数据。

  • 密钥K

    用来加密明文的AES密钥,可以是128位、192位或256位,加密和解密

的密钥是相同的,密钥可以是发送方与接收方协商产生,但不可以直接以明文的方式在网络上传递,否则会导致密钥泄露,通常是通过非对称密钥加密保护对称密钥,然后进行网络传输。

  • AES加密函数

    设AES加密函数为E,则 C = E(K, P),其中P为明文,K为密钥,C为密

文。也就是说,把明文P和密钥K作为加密函数的参数输入,则加密函数E会输出密文C。

  • 密文C

    经过加密后的数据。

  • AES解密函数

    设AES解密函数为D,则 P = D(K, C),其中C为密文,K为密钥,P为明

文。也就是说,把密文C和密钥K作为解密函数的参数输入,则解密函数会输出明文P。


AES的基本结构

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

         AES
密钥长度
分组长度
加密轮数

AES-128

128位(16字节)
128位(16字节)        10
AES-192
192位(24字节)128位(16字节)         12
AES-256
256位(32字节)128位(16字节)         14


此处使用BC进行一个代码展示:

public static SecretKey getKey() throws NoSuchAlgorithmException {
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128);
SecretKey secretKey = keyGenerator.generateKey();
byte[] keyAes = secretKey.getEncoded();
return secretKey;
}


public static byte[] enc(String plainText, SecretKey key) throws NoSuchPaddingException, NoSuchAlgorithmException, NoSuchProviderException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException {
Cipher cipher = getInstance("AES/ECB/NoPadding","BC"); //使用BC
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(Base64.decode(plainText));
}


public static byte[] dec(byte[] cipherText, SecretKey key) throws NoSuchPaddingException, NoSuchAlgorithmException, NoSuchProviderException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException {
Cipher cipher = getInstance("AES/ECB/NoPadding","BC"); //使用BC
cipher.init(Cipher.DECRYPT_MODE, key);
return cipher.doFinal(cipherText);
}


至于加密轮数,与细节,下章继续,加密细节,其实对于我们使用而言,并不需要了解解密的细节,只需要知道怎么使用即可。


欢迎点赞转发,谢谢~

文章转载自闲来无去,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论