• 加密算法的简易应用


    在介绍如何使用实现加密之前,首先来介绍一个类javax.crypto.Cipher.这是java自带的加密实现类,也是本文依赖的重点。创建实例通过调用静态方法Cipher.getInstance(String),传入参数指定了加密过程,格式如下:

    • “algorithm/mode/padding” or
    • “algorithm”

    其中algorithm不做过多解释,就是AES/DES/RSA这样的具体具体加密算法。

    mode这里只介绍两种比较常见的CBC和ECB,至于OFB这种高阶模式,有缘再见
    ECB全程是 Electronic CodeBook,它会将要加密明文msg分为固定长度,比如64,然后独立加密每一组。这样的加密过程导致了ECB的第一个问题:如果某个块被篡改,只有被篡改块在解密后会出现问题,但是其他块解密仍然是正常的。
    如果用ECB加密一段有固定格式的明文,破译加密完全不需要了解如何解密,只需要找到固定格式在密文中的位置,替换想要篡改的位置。
    不仅如此,ECB加密模式还存在另一个问题:在64bit块长度下,加密一段明文。这个明文是由一个长度为32bit的字符串不断重复生成的,假设其重复了8次。显然,现在所有待加密的块中的内容都是一样的,加密后的密文也是一样。虽然我不知道怎么利用这一点干坏事
    相比而言,CBC(Cipher Block Chaining)则安全的多。CBC不再独立加密每个块,每个块都将作为后续块加密运算的参数,参与下一轮加密,所以密文的解密需要顺序,并且对密文任意位置的篡改,都会导致明文完全不可读。

    对于块加密来说,有一个问题是必须要考虑的:如果分组的明文长度小于块长度怎么办?这时候就需要padding来补位,填充明文长度。注意加解密的padding算法保持一致,不然会有问题。

    java自带如下几种,括号中数字为key size

    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)

    AES对称加密实现

    加密原理略,但愿有生之年会补。

    借助java自带的security包,大致流程如下。首先获取key,获取方式详见下文。随后用key和iv矩阵构造cipher,用cipher对明文加密。最后对加密得到的二进制数据用base64编码,便于传输

    public static String encrypt(String plainText,String slat) {
       
    	String ans = null;
    
    	try {
       
    		Key secret = getSecretKey(plainText, slat);
    
    		// configure a cipher instance
    		Cipher cipher = Cipher.getInstance(CIPHER_INST);
    		cipher.init(Cipher.ENCRYPT_MODE, secret, getIvSpec());
    
    		// encrypt the input string
    		plainText = plainText + slat;
    		byte[] cipherText = cipher.doFinal(plainText.getBytes());
    		// why need to use base64?
    		ans = Base64.getEncoder().encodeToString(cipherText);
    	} finally {
       
    		return ans;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    AES加密时,建议同明文一起,传入一个盐值。传入盐值之后,明文会和盐值拼接,这样即使相同的明文,通过加密后也会生成不同的密文,从而减少被查字典的概率。

    这里盐值的生成借助keyGenerator

    public static String getSlat() {
       
    	return KeyGenerators.string().generateKey();
    }
    
    • 1
    • 2
    • 3
    • 4

    解密时与加密过程相反。用相同的key和iv矩阵构造cipher,然后先对密文base64解码,再用cipher解密。如果key和iv与加密时一致,就可以对密文解密得到明文。

  • 相关阅读:
    Java计算机网络篇-TCP
    信创服务器、中间件、数据库监控方案设计与实现
    vue用户点击后下载前端项目中的文件
    如何处理数据集内的缺失值?
    HDLBits: 在线学习 SystemVerilog(九)-Problem 36-42
    20230922 比赛总结
    NTSC和PAL视频格式的区别
    MySQL-InnoDB索引详解
    pta——递增的整数序列链表的插入,奇数值结点链表
    人工智能领域:面试常见问题超全(深度学习基础、卷积模型、对抗神经网络、预训练模型、计算机视觉、自然语言处理、推荐系统、模型压缩、强化学习、元学习)
  • 原文地址:https://blog.csdn.net/white_156/article/details/128140014