JAVA中AES、RSA、DES加密解密方案比较

   

目录

一、AES 加密与解密

1.1 AES 简介

1.2 AES 加密与解密实现

1.2.1 生成 AES 密钥

1.2.2 AES 加密

1.2.3 AES 解密

二、RSA 加密与解密

2.1 RSA 简介

2.2 RSA 加密与解密实现

2.2.1 生成 RSA 公钥和私钥

2.2.2 RSA 加密

2.2.3 RSA 解密

三、DES 加密与解密

3.1 DES 简介

3.2 DES 加密与解密实现

3.2.1 生成 DES 密钥

3.2.2 DES 加密

3.2.3 DES 解密

四、AES、RSA 和 DES 加密方式的适用场景评价

4.1 AES

4.2 RSA

4.3 DES

4.4 总结


     加密技术是信息安全的基石,用于保护敏感数据免遭未授权访问。在 Java 中,AES(Advanced Encryption Standard)、RSA(Rivest-Shamir-Adleman)和 DES(Data Encryption Standard)是三种常用的加密算法。本文将详细介绍这三种加密方案的实现,包括公钥和私钥的生成方法,并比较它们的适用场景。

一、AES 加密与解密

1.1 AES 简介

        AES 是对称加密算法,即加密和解密使用同一个密钥。AES 以其速度快和安全性高的特点,被广泛应用于数据传输和存储的加密。

1.2 AES 加密与解密实现

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

1.2.1 生成 AES 密钥

import javax.crypto.KeyGenerator;

import javax.crypto.SecretKey;

public class AESKeyGenerator {

    public static SecretKey generateKey(int n) throws Exception {

        KeyGenerator keyGen = KeyGenerator.getInstance("AES");

        keyGen.init(n);

        SecretKey key = keyGen.generateKey();

        return key;

    }

    public static void main(String[] args) throws Exception {

        SecretKey key = generateKey(256);

        System.out.println("Key: " + bytesToHex(key.getEncoded()));

    }

    private static String bytesToHex(byte[] bytes) {

        StringBuilder sb = new StringBuilder();

        for (byte b : bytes) {

            sb.append(String.format("%02x", b));

        }

        return sb.toString();

    }

}

1.2.2 AES 加密

import javax.crypto.Cipher;

import javax.crypto.SecretKey;

import javax.crypto.spec.GCMParameterSpec;

import java.nio.ByteBuffer;

import java.nio.charset.StandardCharsets;

import java.security.SecureRandom;import java.util.Base64;

public class AESEncryption {

    private static final String AES = "AES";

    private static final String AES_GCM_NO_PADDING = "AES/GCM/NoPadding";

    private static final int GCM_TAG_LENGTH = 16;

    public static String encrypt(String plaintext, SecretKey key) throws Exception {

        Cipher cipher = Cipher.getInstance(AES_GCM_NO_PADDING);

        byte[] iv = new byte[12];

        SecureRandom.getInstanceStrong().nextBytes(iv);

        GCMParameterSpec spec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv);

        cipher.init(Cipher.ENCRYPT_MODE, key, spec);

        byte[] cipherText = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));

        byte[] cipherTextWithIv = ByteBuffer.allocate(iv.length + cipherText.length)

                                             .put(iv)

                                             .put(cipherText)

                                             .array();

        return Base64.getEncoder().encodeToString(cipherTextWithIv);

    }

    public static void main(String[] args) throws Exception {

        SecretKey key = AESKeyGenerator.generateKey(256);

        String encryptedText = encrypt("Hello, World!", key);

        System.out.println("Encrypted: " + encryptedText);

    }

}

1.2.3 AES 解密

import javax.crypto.Cipher;

import javax.crypto.SecretKey;

import javax.crypto.spec.GCMParameterSpec;

import java.nio.ByteBuffer;import java.nio.charset.StandardCharsets;

import java.util.Base64;

public class AESDecryption {

    private static final String AES_GCM_NO_PADDING = "AES/GCM/NoPadding";

    private static final int GCM_TAG_LENGTH = 16;

    public static String decrypt(String cipherText, SecretKey key) throws Exception {

        Cipher cipher = Cipher.getInstance(AES_GCM_NO_PADDING);

        ByteBuffer byteBuffer = ByteBuffer.wrap(Base64.getDecoder().decode(cipherText));

        byte[] iv = new byte[12];

        byteBuffer.get(iv);

        byte[] cipherTextBytes = new byte[byteBuffer.remaining()];

        byteBuffer.get(cipherTextBytes);

        GCMParameterSpec spec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv);

        cipher.init(Cipher.DECRYPT_MODE, key, spec);

        byte[] plainText = cipher.doFinal(cipherTextBytes);

        return new String(plainText, StandardCharsets.UTF_8);

    }

    public static void main(String[] args) throws Exception {

        SecretKey key = AESKeyGenerator.generateKey(256);

        String encryptedText = AESEncryption.encrypt("Hello, World!", key);

        String decryptedText = decrypt(encryptedText, key);

        System.out.println("Decrypted: " + decryptedText);

    }

}

二、RSA 加密与解密

2.1 RSA 简介

RSA 是一种非对称加密算法,使用一对公钥和私钥。公钥用于加密,私钥用于解密。RSA 由于其加密速度较慢,通常用于加密较小的数据或加密对称密钥。

2.2 RSA 加密与解密实现

在 Java 中,可以使用 java.security 和 javax.crypto 包中的类来实现 RSA 加密与解密。

2.2.1 生成 RSA 公钥和私钥

import java.security.KeyPair;

import java.security.KeyPairGenerator;

import java.security.PrivateKey;

import java.security.PublicKey;

import java.util.Base64;

public class RSAKeyGenerator {

    public static KeyPair generateKeyPair() throws Exception {

        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");

        keyGen.initialize(2048);

        return keyGen.generateKeyPair();

    }

    public static void main(String[] args) throws Exception {

        KeyPair keyPair = generateKeyPair();

        PublicKey publicKey = keyPair.getPublic();

        PrivateKey privateKey = keyPair.getPrivate();

        System.out.println("Public Key: " + Base64.getEncoder().encodeToString(publicKey.getEncoded()));

        System.out.println("Private Key: " + Base64.getEncoder().encodeToString(privateKey.getEncoded()));

    }

}

2.2.2 RSA 加密

import javax.crypto.Cipher;

import java.security.KeyPair;

import java.security.PublicKey;

import java.util.Base64;

public class RSAEncryption {

    public static String encrypt(String plaintext, PublicKey publicKey) throws Exception {

        Cipher cipher = Cipher.getInstance("RSA");

        cipher.init(Cipher.ENCRYPT_MODE, publicKey);

        byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes("UTF-8"));

        return Base64.getEncoder().encodeToString(encryptedBytes);

    }

    public static void main(String[] args) throws Exception {

        KeyPair keyPair = RSAKeyGenerator.generateKeyPair();

        PublicKey publicKey = keyPair.getPublic();

        String encryptedText = encrypt("Hello, World!", publicKey);

        System.out.println("Encrypted: " + encryptedText);

    }

}

2.2.3 RSA 解密

import javax.crypto.Cipher;

import java.security.KeyPair;

import java.security.PrivateKey;

import java.util.Base64;

public class RSADecryption {

    public static String decrypt(String cipherText, PrivateKey privateKey) throws Exception {

        Cipher cipher = Cipher.getInstance("RSA");

        cipher.init(Cipher.DECRYPT_MODE, privateKey);

        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(cipherText));

        return new String(decryptedBytes, "UTF-8");

    }

    public static void main(String[] args) throws Exception {

        KeyPair keyPair = RSAKeyGenerator.generateKeyPair();

        PrivateKey privateKey = keyPair.getPrivate();

        String encryptedText = RSAEncryption.encrypt("Hello, World!", keyPair.getPublic());

        String decryptedText = decrypt(encryptedText, privateKey);

        System.out.println("Decrypted: " + decryptedText);

    }

}

三、DES 加密与解密

3.1 DES 简介

DES 是一种对称加密算法,即加密和解密使用同一个密钥。尽管其安全性已被认为不够强,但由于其简单性,仍然在一些特定场景下使用。

3.2 DES 加密与解密实现

在 Java 中,可以使用 javax.crypto 包中的类来实现 DES 加密与解密。

3.2.1 生成 DES 密钥

import javax.crypto.KeyGenerator;

import javax.crypto.SecretKey;

public class DESKeyGenerator {

    public static SecretKey generateKey() throws Exception {

        KeyGenerator keyGen = KeyGenerator.getInstance("DES");

        keyGen.init(56); // DES 使用 56 位密钥

        return keyGen.generateKey();

    }

    public static void main(String[] args) throws Exception {

        SecretKey key = generateKey();

        System.out.println("Key: " + bytesToHex(key.getEncoded()));

    }

    private static String bytesToHex(byte[] bytes) {

        StringBuilder sb = new StringBuilder();

        for (byte b : bytes) {

            sb.append(String.format("%02x", b));

        }

        return sb.toString();

    }

}

3.2.2 DES 加密

import javax.crypto.Cipher;

import javax.crypto.SecretKey;

import java.util.Base64;

public class DESEncryption {

    public static String encrypt(String plaintext, SecretKey key) throws Exception {

        Cipher cipher = Cipher.getInstance("DES");

        cipher.init(Cipher.ENCRYPT_MODE, key);

        byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes("UTF-8"));

        return Base64.getEncoder().encodeToString(encryptedBytes);

    }

    public static void main(String[] args) throws Exception {

        SecretKey key = DESKeyGenerator.generateKey();

        String encryptedText = encrypt("Hello, World!", key);

        System.out.println("Encrypted: " + encryptedText);

    }

}

3.2.3 DES 解密

import javax.crypto.Cipher;

import javax.crypto.SecretKey;

import java.util.Base64;

public class DESDecryption {

    public static String decrypt(String cipherText, SecretKey key) throws Exception {

        Cipher cipher = Cipher.getInstance("DES");

        cipher.init(Cipher.DECRYPT_MODE, key);

        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(cipherText));

        return new String(decryptedBytes, "UTF-8");

    }

    public static void main(String[] args) throws Exception {

        SecretKey key = DESKeyGenerator.generateKey();

        String encryptedText = DESEncryption.encrypt("Hello, World!", key);

        String decryptedText = decrypt(encryptedText, key);

        System.out.println("Decrypted: " + decryptedText);

    }

}

四、AES、RSA 和 DES 加密方式的适用场景评价

4.1 AES

优点:

  • 高效:AES 的加密和解密速度非常快。
  • 安全性高:使用 128、192 或 256 位密钥,难以被破解。
  • 适合大数据量的加密。

缺点:

  • 需要安全地管理和传输密钥。

适用场景:

  • 大量数据的加密,如文件加密、数据库加密和网络传输加密。

4.2 RSA

优点:

  • 非对称加密:公钥加密,私钥解密,方便密钥分发。
  • 高安全性:适用于保护敏感信息。

缺点:

  • 加密和解密速度慢,不适合大数据量加密。
  • 公钥和私钥的管理复杂。

适用场景:

  • 小数据量的加密,如数字签名、证书、密钥交换。

4.3 DES

优点:

  • 简单:算法简单易实现。
  • 适用于资源受限的环境。

缺点:

  • 安全性低:密钥长度仅 56 位,容易被暴力破解。
  • 已被更强的算法(如 AES)取代。

适用场景:

  • 低安全性要求的场景,或需要兼容旧系统的场合。

4.4 总结

  • AES:适用于高效加密大量数据,具有高安全性。
  • RSA:适用于高安全性要求的小数据量加密和密钥交换。
  • DES:尽管过时,但在某些特定环境下仍可使用。

根据具体需求选择合适的加密算法,确保数据的安全性和系统的性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张3蜂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值