欢迎访问宙启技术站
智能推送

加密解密:Java中如何实现加密和解密

发布时间:2023-06-23 03:13:07

Java 可以通过很多种方式进行加密和解密操作,本文将会介绍 Java 中一些常用的加密与解密算法,并给出实现示例,让你了解这些算法的基本原理和实际应用。

一、对称加密算法

对称加密算法,是指加密与解密使用相同秘钥的算法,常见的对称加密算法有 DES、AES 和 Blowfish 等。对称加密算法的加密解密速度都很快,特别是 AES,被广泛应用于数据加密传输等领域。

1. DES 加密解密示例

下面是 DES 算法的加密解密示例:

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;

public class DESDemo {
    public static void main(String[] args) {
        String content = "Hello, DES!";
        String password = "123456";

        // 加密
        byte[] encryptResult = encrypt(content, password);
        System.out.println("加密后:" + new String(encryptResult));

        // 解密
        String decryptResult = decrypt(encryptResult, password);
        System.out.println("解密后:" + decryptResult);
    }

    /**
     * DES 加密操作
     *
     * @param content  待加密内容
     * @param password 密钥
     * @return 加密结果
     */
    private static byte[] encrypt(String content, String password) {
        try {
            // 生成密钥
            KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
            SecureRandom secureRandom = new SecureRandom(password.getBytes());
            keyGenerator.init(secureRandom);
            SecretKey secretKey = keyGenerator.generateKey();
            byte[] keyBytes = secretKey.getEncoded();

            // 转换密钥
            SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "DES");

            // 创建 Cipher 对象
            Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);

            // 加密操作
            byte[] byteContent = content.getBytes("utf-8");
            byte[] byteResult = cipher.doFinal(byteContent);

            return byteResult;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * DES 解密操作
     *
     * @param encryptResult 加密结果
     * @param password      密钥
     * @return 解密结果
     */
    private static String decrypt(byte[] encryptResult, String password) {
        try {
            // 生成密钥
            KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
            SecureRandom secureRandom = new SecureRandom(password.getBytes());
            keyGenerator.init(secureRandom);
            SecretKey secretKey = keyGenerator.generateKey();

            // 转换密钥
            SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getEncoded(), "DES");

            // 创建 Cipher 对象
            Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);

            // 解密操作
            byte[] byteResult = cipher.doFinal(encryptResult);

            return new String(byteResult, "utf-8");
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }
}

2. AES 加密解密示例

下面是 AES 算法的加密解密示例:

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
import java.util.Base64;

public class AESDemo {
    public static void main(String[] args) {
        String content = "Hello, AES!";
        String password = "123456";

        // 加密
        String encryptResult = encrypt(content, password);
        System.out.println("加密后:" + encryptResult);

        // 解密
        String decryptResult = decrypt(encryptResult, password);
        System.out.println("解密后:" + decryptResult);
    }

    /**
     * AES 加密操作
     *
     * @param content  待加密内容
     * @param password 密钥
     * @return 加密结果
     */
    private static String encrypt(String content, String password) {
        try {
            // 生成密钥
            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
            SecureRandom secureRandom = new SecureRandom(password.getBytes());
            keyGenerator.init(secureRandom);
            SecretKey secretKey = keyGenerator.generateKey();
            byte[] keyBytes = secretKey.getEncoded();

            // 转换密钥
            SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES");

            // 创建 Cipher 对象
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);

            // 加密操作
            byte[] byteContent = content.getBytes("utf-8");
            byte[] byteResult = cipher.doFinal(byteContent);

            return Base64.getEncoder().encodeToString(byteResult);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * AES 解密操作
     *
     * @param encryptResult 加密结果
     * @param password      密钥
     * @return 解密结果
     */
    private static String decrypt(String encryptResult, String password) {
        try {
            // 生成密钥
            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
            SecureRandom secureRandom = new SecureRandom(password.getBytes());
            keyGenerator.init(secureRandom);
            SecretKey secretKey = keyGenerator.generateKey();

            // 转换密钥
            SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getEncoded(), "AES");

            // 创建 Cipher 对象
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);

            // 解密操作
            byte[] byteResult = cipher.doFinal(Base64.getDecoder().decode(encryptResult));

            return new String(byteResult, "utf-8");
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }
}

二、非对称加密算法

非对称加密算法,是指加密与解密使用不同秘钥的算法,常见的非对称加密算法有 RSA、DSA 和 Diffie-Hellman 等。非对称加密算法相较于对称加密算法,更安全,但加密解密速度较慢,一般用于对数据进行加密传输时使用。

1. RSA 加密解密示例

下面是 RSA 算法的加密解密示例:

`java

import javax.crypto.Cipher;

import java.security.KeyPair;

import java.security.KeyPairGenerator;

import java.security.PrivateKey;

import java.security.PublicKey;

import java.util.Base64;

public class RSADemo {

public static void main(String[] args) {

String content = "Hello, RSA!";

// 生成公私钥对

KeyPair keyPair = generateKeyPair();

// 加密

String encryptResult = encrypt(content, keyPair.getPublic());

System.out.println("加密后:" + encryptResult);

// 解密

String decryptResult = decrypt(encryptResult, keyPair.getPrivate());

System.out.println("解密后:" + decryptResult);

}

/**

* 生成 RSA 公私钥对

*

* @return KeyPair

*/

private static KeyPair generateKeyPair() {

try {

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

keyPairGenerator.initialize(2048);

return keyPairGenerator.generateKeyPair();

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

/**

* RSA 加密操作

*

* @param content 待加密内容

* @param key 公钥

* @return 加密结果

*/

private static String encrypt(String content, PublicKey key) {

try {

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

cipher.init(Cipher.ENCRYPT_MODE, key);

byte[] byteContent = content.getBytes("utf-8");

byte[] byteResult = cipher.doFinal(byteContent);

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

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

/**

* RSA 解密操作

*

* @param encryptResult 加密结果

* @param key 私钥

* @return 解密结果

*/

private static String decrypt(String encryptResult, PrivateKey key) {

try {

Cipher cipher