常用的加密算法DES3、AES & RSA

「万事开头难,视频号500粉直播需要你的助力!你的支持是我前进的动力!」

04d42a30fe6624d1084a48709f127365.png

0x01:DES3

DES3,通常指的是三重数据加密算法(Triple Data Encryption Algorithm,3DES)或称为Triple DES,是一种对称加密算法。它是基于原有的DES(Data Encryption Standard)算法扩展而来,通过三次DES加密来增强安全性。

基本原理

3DES通过使用三个不同的密钥(K1, K2, K3)进行三次加密操作,或者在某些情况下,为了减少密钥管理的复杂度,也可以使用两个密钥,其中一个密钥被重复使用两次(K1, K2=K1, K3)。它提供了两种操作模式:

  1. 三密钥模式(3-key,也称作3TDEA)

  • 加密过程:C = E(K3, D(K2, E(K1, P)))

  • 解密过程:P = D(K1, E(K2, D(K3, C)))

  • 在这种模式下,使用三个不同的密钥,提供最大的安全性。

两密钥模式(2-key,也称作2TDEA或EDE)

  • 加密过程:C = E(K2, D(K1, E(K2, P))) 或 C = E(K1, D(K2, E(K1, P)))

  • 解密过程与加密过程相反,确保了加密和解密的可逆性。

  • 在这种模式下,K1和K3是相同的,减少了密钥管理负担,但安全性略低于三密钥模式。

密钥长度

原始的DES算法使用56位密钥,因此3DES在三密钥模式下提供168位的密钥长度,但实际上,由于密钥之间存在一定的冗余,其有效密钥长度为112位。在两密钥模式下,有效密钥长度为112位,因为K1和K3相同。

安全性与应用

3DES最初设计来替代安全性受到质疑的DES算法。在一段时间内,3DES因其较高的安全性被广泛应用于金融行业、网络通信等领域。然而,随着时间推移和技术进步,特别是随着AES(Advanced Encryption Standard)的出现,3DES由于其较慢的处理速度和逐渐降低的安全边际(相比AES-256),已被许多新系统弃用或计划淘汰。

注意事项

  • 性能: 由于执行三次加密操作,3DES比单次DES或AES等算法在计算上更为耗时。

  • 安全性: 尽管3DES在历史上被认为是安全的,但现代安全标准和建议已经开始推荐使用AES等更现代、更快且更安全的算法。

  • 合规性: 许多安全标准和法规已不再推荐或禁止使用3DES,特别是在需要高安全性的应用场景中。

综上所述,虽然3DES在过去是一种可靠的加密选择,但考虑到当前的安全标准和计算能力的发展,建议评估并转向更先进的加密算法,如AES。

0x02:AES

AES(Advanced Encryption Standard,高级加密标准)是一种对称加密算法,它被广泛用于各种安全领域,包括网络安全、文件加密、磁盘加密等。相比RSA这样的非对称加密算法,AES在加解密速度上有着显著的优势,特别适合于大量数据的快速加密处理。AES的设计基于字节代换、行移位、列混淆和轮密钥加等操作,其安全性依赖于密钥长度和算法的复杂性。

AES的特点

  • 安全性:AES支持128、192和256位密钥长度,分别对应AES-128、AES-192、AES-196,其中AES-256提供了最高级别的安全性。

  • 块大小:AES固定使用128位的数据块大小进行加密操作。

  • 轮数:根据密钥长度不同,AES的加密轮数也不同,AES-128有10轮,AES-192有12轮,AES-256有14轮。

  • 对称性:AES算法使用相同的密钥进行加密和解密,这要求密钥在通信双方之间安全地共享。

加密解密流程

AES加密和解密过程都包括几个主要步骤,如AddRoundKey(轮密钥加)、SubBytes(字节代换)、ShiftRows(行移位)、MixColumns(列混淆)。解密过程是加密过程的逆运算,除了在某些步骤上的顺序和操作略有不同(例如,MixColumns在解密时变为InvMixColumns)。

在Java中,可以使用javax.crypto包中的类来实现AES的加密和解密。以下是一个简单的AES-128加密解密示例:

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;


public class AESEncryptionExample {


    public static void main(String[] args) throws Exception {
        String original = "Hello AES Encryption!";
        String key = "ThisIsASecretKey123456"; // 密钥需要是16字节,这里简化示例,实际应更随机


        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");


        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); // ECB模式不建议用于多块数据,仅作示例
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);


        byte[] encryptedBytes = cipher.doFinal(original.getBytes(StandardCharsets.UTF_8));
        String encrypted = Base64.getEncoder().encodeToString(encryptedBytes);
        System.out.println("Encrypted: " + encrypted);


        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encrypted));
        String decrypted = new String(decryptedBytes, StandardCharsets.UTF_8);
        System.out.println("Decrypted: " + decrypted);
    }
}

请注意,上述示例使用了ECB(Electronic Codebook)模式,这是一种最简单的加密模式,但不提供数据的扩散性,因此对于相同明文块会产生相同的密文块,安全性较低。在实际应用中,推荐使用CBC(Cipher Block Chaining)模式或者更安全的模式,并且考虑使用初始化向量(IV)以增强安全性。

0x03:RSA

RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman于1977年提出,也因此得名。RSA算法的安全性基于大数分解难题,即给定两个大素数p和q,它们的乘积n很容易计算得出,但反过来,给定n想要分解回p和q在计算上是非常困难的,特别是在n非常大的情况下。

RSA的基本原理和操作流程包括以下几个步骤:

1. 密钥生成
  • 选择两个大素数 p 和 q

  • 计算它们的乘积 n = p * qn 成为RSA公钥和私钥的一部分,同时也是加密和解密时的模数。

  • 计算欧拉函数值 \(\phi(n) = (p-1)*(q-1)\)

  • 选取一个整数 e 作为公钥指数,要求 1<𝑒<𝜙(𝑛) b4b42eae37d7ab17d0062c42c2813577.png且 e 与 \(\phi(n)\) 互质。

  • 计算私钥指数 d,满足 𝑑∗𝑒≡1mod  𝜙(𝑛)ca91950efe48d3f83b0ca466e3c5aee0.png

2. 加密过程
  • 假设Bob想向Alice发送一条消息 m,并且 m 必须小于 n

  • Bob使用Alice公布的公钥 (n, e) 对消息 m 进行加密,加密后的密文 c 计算为 𝑐=𝑚𝑒mod  𝑛。6b11bd2e6a9b887f918c7061c5255e57.png

3. 解密过程
  • Alice收到密文 c 后,使用自己的私钥 (n, d) 进行解密,计算 𝑚=𝑐𝑑mod  𝑛4d0bd40612804ad7ed3418269c43a338.png,从而恢复原始消息 m

特点:

  • 安全性:RSA的安全性依赖于大数分解的难度。

  • 速度:RSA加密和解密的速度相对较慢,尤其是对于大消息,因此在实际应用中,RSA通常与对称加密算法结合使用,RSA用于安全地交换对称密钥,而对称密钥则用于大量数据的加解密。

  • 用途:RSA广泛应用于数字签名、安全通信、身份验证等领域。

在Java中,可以使用java.security包中的类来实现RSA加密解密。以下是一个简单的示例:

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.RSAPublicKeySpec;
import javax.crypto.Cipher;


public class RSAExample {
    public static void main(String[] args) throws Exception {
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
        kpg.initialize(2048); // 指定密钥长度
        KeyPair kp = kpg.generateKeyPair();
        PublicKey publicKey = kp.getPublic();
        PrivateKey privateKey = kp.getPrivate();


        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");


        // 加密
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedBytes = cipher.doFinal("Hello RSA!".getBytes());
        System.out.println("Encrypted: " + new String(encryptedBytes));


        // 解密
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
        System.out.println("Decrypted: " + new String(decryptedBytes));
    }
}

这个例子展示了如何生成RSA密钥对,并使用这对密钥进行加密和解密操作。注意,实际应用中应考虑填充模式、异常处理和安全性最佳实践。

8053af3932198babd28c39855014b182.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值