前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >常用的加密算法DES3、AES & RSA

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

作者头像
BUG弄潮儿
发布2024-05-11 13:42:43
1900
发布2024-05-11 13:42:43
举报
文章被收录于专栏:JAVA乐园JAVA乐园

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. 两密钥模式(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加密解密示例:

代码语言:javascript
复制
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. 密钥生成
  • 选择两个大素数 pq
  • 计算它们的乘积 n = p * qn 成为RSA公钥和私钥的一部分,同时也是加密和解密时的模数。
  • 计算欧拉函数值 \(\phi(n) = (p-1)*(q-1)\)
  • 选取一个整数 e 作为公钥指数,要求 1<𝑒<𝜙(𝑛)

e\(\phi(n)\) 互质。

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

2. 加密过程
  • 假设Bob想向Alice发送一条消息 m,并且 m 必须小于 n
  • Bob使用Alice公布的公钥 (n, e) 对消息 m 进行加密,加密后的密文 c 计算为 𝑐=𝑚𝑒mod 𝑛。
3. 解密过程
  • Alice收到密文 c 后,使用自己的私钥 (n, d) 进行解密,计算 𝑚=𝑐𝑑mod 𝑛

,从而恢复原始消息 m

特点:

  • 安全性:RSA的安全性依赖于大数分解的难度。
  • 速度:RSA加密和解密的速度相对较慢,尤其是对于大消息,因此在实际应用中,RSA通常与对称加密算法结合使用,RSA用于安全地交换对称密钥,而对称密钥则用于大量数据的加解密。
  • 用途:RSA广泛应用于数字签名、安全通信、身份验证等领域。

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

代码语言:javascript
复制
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密钥对,并使用这对密钥进行加密和解密操作。注意,实际应用中应考虑填充模式、异常处理和安全性最佳实践。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-04-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 BUG弄潮儿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基本原理
  • 密钥长度
  • 安全性与应用
  • 注意事项
  • AES的特点
  • 加密解密流程
  • RSA的基本原理和操作流程包括以下几个步骤:
    • 1. 密钥生成
      • 2. 加密过程
        • 3. 解密过程
        • 特点:
        相关产品与服务
        多因子身份认证
        多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档