1. 简介

算法秘钥长度秘钥长度默认值工作模式填充方式备注
DES5656ECB,CBC,PCBC,CTR,CTS,CFB,CFB8至CFB128,OFB,OFB8至OFB128NoPadding,PKCS5Padding,ISO101126Paddingjava6实现
DES5656ECB,CBC,PCBC,CTR,CTS,CFB,CFB8至CFB128,OFB,OFB8至OFB128NoPadding,PKCS5Padding,ISO101126Paddingjava6实现

2. java实现

    public static String encryptDES(String plaintext) throws Exception {
        //        初始化秘钥 和加密算法   秘钥必须大于8位
        SecretKeySpec keySpec = new SecretKeySpec("12345678".getBytes(StandardCharsets.UTF_8),"DES");
        IvParameterSpec ivParameterSpec = new IvParameterSpec("12345678".getBytes(StandardCharsets.UTF_8));
        //         得到Cipher的实例   026fcbe02f76529d0a5bb3904aa6efdc           Am/L4C92Up0KW7OQSqbv3A==
        Cipher des = Cipher.getInstance("DES/CBC/NOPadding");

        // 对Cipher 实例进行初始化,
        des.init(Cipher.ENCRYPT_MODE,keySpec,ivParameterSpec);
        // update并不会每次都增加要加密的字符串的长度,并不可靠。理想中的状态是  xiaojianbang +hengdi 解密发现只有banghengdi
//        des.update("xiaojianbang".getBytes(StandardCharsets.UTF_8));
        // 加密 由字符串 得到的byte[]
        byte[] res=des.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));
        Log.d("hengdi","byte test" + Arrays.toString(res));

        // 将 byte[] 实例化为 ByteString 对象
        ByteString bty=  ByteString.of(res);
        // hex 编码
        String str_hex= bty.hex();
        // base64 编码
        String str_base64 = bty.base64();
        return str_hex + "  ||  " + str_base64;
     }

解密:

public static String decryptDES(String cipherText) throws Exception {
        // 将加密后base64编码的字符串 解码,并还原成 byte[]
        byte[] cipherTextBytes = ByteString.decodeBase64(cipherText).toByteArray();
        SecretKeySpec keySpec = new SecretKeySpec("12345678".getBytes(StandardCharsets.UTF_8),"DES");
        Cipher des = Cipher.getInstance("DES/ECB/PKCS5Padding");
        des.init(Cipher.DECRYPT_MODE,keySpec);
        byte[] res=des.doFinal(cipherTextBytes);
        return new String(res);
    }

CBC 模式需要一个IV向量,ECB不需要。

每8个字节进行分组 分组加密

没有指定加密模式和填充模式,默认为ECB,PKCS5Padding ,此时可以加IV,但是IV是不起作用的,明确指定了ECB,PKCS5Padding ,加IV会报错

ECB模式和CBC模式的区别

  1. 使用8个字节为一组进行加密
  2. 对称加密算法里,使用NOPadding,加密的明文必须等于分组长度倍数,否则报错
  3. 如果使用PKCS5Padding,会对加密的明文填充1字节 ~ 1个分组的长度
  4. 没有指明加密模式和填充方式,表示使用默认的DES/ECB/PKCS5Padding
  5. 加密后的字节数组可以编码成Hex、Base64
  6. DES算法明文按64位,也就是8个字节 进行分组加密,可以调用cipher.getBlockSize()来获取
  7. 要复现一个对称加密算法,需要得到明文、key、iv、mode、padding
  8. 明文、key、iv需要注意解析方式,而且不一定是字符串形式
  9. 如果加密模式是ECB,则不需要加iv,加了的话会报错(js中不会),如果没有指定加密模式和填充模式,加上iv不会报错。
  10. 如果明文中有两个分组的内容相同,ECB会得到完全一样的密文,CBC不会(CBC会先用iv和第一个分组进行加密,第一组的加密结果再和第二分组进行加密,第二个分组的加密结果再和第三个分组进行加密,以此类推)
  11. 加密算法的结果通常与明文等长或者更长,如果变短了,那可能是gzip、protobuf,也可能是消息摘要算法。

永乐
23 声望7 粉丝

目前文章属于笔记类型,暂未整理。 后期会系统化整理。


引用和评论

0 条评论