快捷搜索:  汽车  科技

认证模式加密模式,3.加密模式与填充模式

认证模式加密模式,3.加密模式与填充模式String transformation = "DES/CBC/PKCS5Padding"; 运行 ,报错,需要添加一个参数修改成 CBC 加密 模式加密模式和填充模式AES/CBC/NoPadding (128) AES/CBC/PKCS5Padding (128) AES/ECB/NoPadding (128) AES/ECB/PKCS5Padding (128) DES/CBC/NoPadding (56) DES/CBC/PKCS5Padding (56) DES/ECB/NoPadding (56) DES/ECB/PKCS5Padding (56) DESede/CBC/NoPadding (168) DESede/CBC/PKCS5Padding (168) DESede/ECB/NoPadding (168) DESede/ECB/PKCS5Padding

  • 1.3.1.加密模式

加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html

ECB

ECB : Electronic codebook 电子密码本. 需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密

认证模式加密模式,3.加密模式与填充模式(1)

  • 优点 : 可以并行处理数据
  • 缺点 : 同样的原文生成同样的密文 不能很好的保护数据
  • 同时加密,原文是一样的,加密出来的密文也是一样的
CBC

CBC : Cipher-block chaining 密码块链接. 每个明文块先与前一个密文块进行异或后,再进行加密。在这种方法中,每个密文块都依赖于它前面的所有明文块

认证模式加密模式,3.加密模式与填充模式(2)

  • 优点 : 同样的原文生成的密文不一样
  • 缺点 : 串行处理数据.
  • 1.3.2.当需要按块处理的数据 数据长度不符合块处理需求时 按照一定的方法填充满块长的规则
NoPadding
  • 不填充.
  • 在DES加密算法下 要求原文长度必须是8byte的整数倍
  • 在AES加密算法下 要求原文长度必须是16byte的整数倍
PKCS5Padding

数据块的大小为8位 不够就补足

Tips
  • 默认情况下 加密模式和填充模式为 : ECB/PKCS5Padding
  • 如果使用CBC模式 在初始化Cipher对象时 需要增加参数 初始化向量IV : IvParameterSpec iv = new IvParameterSpec(key.getBytes());

加密模式和填充模式

AES/CBC/NoPadding (128) AES/CBC/PKCS5Padding (128) AES/ECB/NoPadding (128) AES/ECB/PKCS5Padding (128) DES/CBC/NoPadding (56) DES/CBC/PKCS5Padding (56) DES/ECB/NoPadding (56) DES/ECB/PKCS5Padding (56) DESede/CBC/NoPadding (168) DESede/CBC/PKCS5Padding (168) DESede/ECB/NoPadding (168) DESede/ECB/PKCS5Padding (168) RSA/ECB/PKCS1Padding (1024 2048) RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024 2048) RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024 2048)

加密模式和填充模式例子

package com.atguigu.desaes; import com.sun.org.apache.xml.internal.security.utils.Base64; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class DesDemo { // DES加密算法 key的大小必须是8个字节 public static void main(String[] args) throws Exception { String input ="硅谷"; // DES加密算法,key的大小必须是8个字节 String key = "12345678"; // 指定获取Cipher的算法 如果没有指定加密模式和填充模式 ECB/PKCS5Padding就是默认值 // String transformation = "DES"; // 9PQXVUIhaaQ= //String transformation = "DES/ECB/PKCS5Padding"; // 9PQXVUIhaaQ= // CBC模式 必须指定初始向量 初始向量中密钥的长度必须是8个字节 //String transformation = "DES/CBC/PKCS5Padding"; // 9PQXVUIhaaQ= // NoPadding模式 原文的长度必须是8个字节的整倍数 ,所以必须把 硅谷改成硅谷12 String transformation = "DES/CBC/NoPadding"; // 9PQXVUIhaaQ= // 指定获取密钥的算法 String algorithm = "DES"; String encryptDES = encryptDES(input key transformation algorithm); System.out.println("加密:" encryptDES); // String s = dncryptDES(encryptDES key transformation algorithm); // System.out.println("解密:" s); } /** * 使用DES加密数据 * * @param input : 原文 * @param key : 密钥(DES 密钥的长度必须是8个字节) * @param transformation : 获取Cipher对象的算法 * @param algorithm : 获取密钥的算法 * @return : 密文 * @throws Exception */ private static String encryptDES(String input String key String transformation String algorithm) throws Exception { // 获取加密对象 Cipher cipher = Cipher.getInstance(transformation); // 创建加密规则 // 第一个参数key的字节 // 第二个参数表示加密算法 SecretKeySpec sks = new SecretKeySpec(key.getBytes() algorithm); // ENCRYPT_MODE:加密模式 // DECRYPT_MODE: 解密模式 // 初始向量,参数表示跟谁进行异或,初始向量的长度必须是8位 // IvParameterSpec iv = new IvParameterSpec(key.getBytes()); // 初始化加密模式和算法 cipher.init(Cipher.ENCRYPT_MODE sks); // 加密 byte[] bytes = cipher.doFinal(input.getBytes()); // 输出加密后的数据 String encode = Base64.encode(bytes); return encode; } /** * 使用DES解密 * * @param input : 密文 * @param key : 密钥 * @param transformation : 获取Cipher对象的算法 * @param algorithm : 获取密钥的算法 * @throws Exception * @return: 原文 */ private static String dncryptDES(String input String key String transformation String algorithm) throws Exception { // 1 获取Cipher对象 Cipher cipher = Cipher.getInstance(transformation); // 指定密钥规则 SecretKeySpec sks = new SecretKeySpec(key.getBytes() algorithm); // IvParameterSpec iv = new IvParameterSpec(key.getBytes()); cipher.init(Cipher.DECRYPT_MODE sks); // 3. 解密 byte[] bytes = cipher.doFinal(Base64.decode(input)); return new String(bytes); } }

运行程序:

认证模式加密模式,3.加密模式与填充模式(3)

修改成 CBC 加密 模式

String transformation = "DES/CBC/PKCS5Padding";

运行 ,报错,需要添加一个参数

认证模式加密模式,3.加密模式与填充模式(4)

修改加密代码:

认证模式加密模式,3.加密模式与填充模式(5)

运行程序

认证模式加密模式,3.加密模式与填充模式(6)

修改填充模式

String transformation = "DES/CBC/NoPadding";

运行报错 NoPadding 这种填充模式 原文必须是8个字节的整倍数

认证模式加密模式,3.加密模式与填充模式(7)

修改运行

认证模式加密模式,3.加密模式与填充模式(8)

在测试 AES 的时候需要注意,key需要16个字节,加密向量也需要16个字节 ,其他方式跟 DES 一样

猜您喜欢: