【网络安全】对称加密算法

发布于:2024-07-08 ⋅ 阅读:(105) ⋅ 点赞:(0)


非对称加密

非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

对称加密:

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。

  • 示例
    我们现在有一个原文3要发送给B,设置密钥为108,3* 108 = 324,将324作为密文发送给B。B拿到密文324后,使用324/108= 3得到原文
  • 常见加密算法
    DES : Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。
    AES : Advanced Encryption Standard,高级加密标准.在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
  • 特点
    加密速度快,可以加密大文件
    密文可逆,一旦密钥文件泄漏,就会导致数据暴露。加密后编码表找不到对应字符,出现乱码
    一般结合Base64使用

Des 加密


b站视频教程链接
DES算法是属于对称密码算法中的分组加密算法。

  • 算法步骤
  • IP置换
    按照一定的规则,将原来的64位二进制位重新排序。
  • 轮函数——E扩展置换
    将32 位输⼊扩展为48位输出

    可以理解为 将每部分的第一个和最后一个数取出交换后放到,原来数的前(后)面
  • 轮函数–S盒压缩处理
    经过扩展的48位明文和48位密钥进行异或运算后,再使用8个S盒压缩处理得到32位数据。将48位输入等分为8块,每块6位输入压缩为4位输出。
  • 轮函数——P盒置换
    与ip置换相同,根据p盒置换表进行置换
    S盒置换再经过P盒置换。⾄此,⼀次轮函数操作完毕。
  • 密钥生成
    密钥为64位,除去8位校验位,剩余56位参与运算。
    按照交换规则,⽣成16个48位的轮密钥。

3 DES 加密

DES是一个经典的对称加密算法,但也缺陷明显,即56位的密钥安全性不足,已被证实可以在短时间内破解。为解决此问题,出现了3DES,也称Triple DES,3DES为DES向AES过渡的加密算法,它使用3条56位的密钥对数据进行三次加密。为了兼容普通的DES,3DES并没有直接使用 加密->加密->加密 的方式,而是采用了加密->解密->加密 的方式。

Des 加密java Api

加密过程

 @Test
    public void testEnDes() throws Exception{
        //原文
        String input="加密测试";
        //定义密钥
        String key="12345678";
        //加密方式
        String Des="DES";
        //创建加密对象
        Cipher cipher = Cipher.getInstance(Des);
        //创建加密规则
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), Des);
        //加密初始化
        cipher.init(Cipher.ENCRYPT_MODE,secretKeySpec);
        byte[] bytes = cipher.doFinal(input.getBytes(StandardCharsets.UTF_8));
        String encode = Base64.encode(bytes);
        log.info("解密前的内容为:{}",input);
        log.info("加密后的内容为:{}",encode);
    }


解密过程

@Test
    public void testDeDes() throws Exception{
        //原文
        String input="fvlQhBYI8Ev8KJFCWAHY9A==";
        //定义密钥
        String key="12345678";
        //加密方式
        String Des="DES";
        //创建加密对象
        Cipher cipher = Cipher.getInstance(Des);
        //创建加密规则
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), Des);
        //加密初始化
        cipher.init(Cipher.DECRYPT_MODE,secretKeySpec);
        byte[] bytes = cipher.doFinal(Base64.decode(input));
        log.info("解密前的内容为:{}",input);
        log.info("解密后的内容为:{}",new String(bytes));
        //制定加密算法
        //String password=
    }

AES 加密算法

AES 属于 分组加密 算法
明⽂⻓度固定为128位
密钥⻓度可以是128、192、256位

  • 输入字节的顺序

AES 加密过程

b站教程

  • 初始变换(Initial round)
  • 字节代换(SubBytes)
  • ⾏移位(ShiftRows)
    第几行向左移动几位(第0行移动0位,第1行1位……)
  • 列混合(MixColumn)
    左乘一个给定的4*4 矩阵
  • 轮密钥加(AddRoundKey)

AES 密钥拓展

  • 如果i不是4的倍数,那么第i列由如下等式确定:W[i]=W[i-4]⨁W[i-1] w[i] 为4*4 矩阵的第i列

  • 如果i是4的倍数,那么第i列由如下等式确定:W[i]=W[i-4]⨁T(W[i-1])
    函数T由3部分组成:字循环、字节代换和轮常量异或。

    • 字循环 将1个字中的4个字节循环左移1个字节。即将输⼊字[b0, b1, b2, b3]变换成
      [b1,b2,b3,b0]。
    • 字节代换 对字循环的结果使⽤S盒进⾏字节代换。
    • 轮常量异或 将前两步的结果同轮常量Rcon[j]进⾏异或,其中j表示轮数。(同轮常量给定)

网站公告

今日签到

点亮在社区的每一天
去签到