【加密】常用加密算法

非对称加密

非对称加密是一种加密技术,也称为公钥加密。它使用一对密钥:公钥和私钥。公钥可以向任何人公开,用于加密信息,而私钥则是保密的,用于解密信息。这种加密方法确保了数据的安全传输,因为只有拥有对应私钥的人才能解密通过公钥加密的信息。

非对称加密的一个主要特点是,即使公钥被他人获取,他们也无法解密密文,因为缺乏与之配对的私钥。常见的非对称加密算法包括RSA、椭圆曲线加密(ECC)和数字签名算法(DSA)。

RAS算法

常用于HTTPS协议、数字证书、SSH登录等,保障数据传输安全。由于非对称加密计算量大,实际中常与对称加密(如AES)结合使用。

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.security.*;
import java.util.Base64;

/**
 * @author cx
 */
public class RSAExample {

    public static void main(String[] args) throws Exception {
        // 明文消息
        String originalMessage = "Hello, RSA Encryption! 你好,RSA加密!";

        // 1. 生成RSA密钥对
        KeyPair keyPair = generateKeyPair(2048);
        
        // 获取公钥和私钥
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();
        
        // 打印密钥信息(Base64编码)
        System.out.println("Public Key: " + encodeBase64(publicKey.getEncoded()));
        System.out.println("Private Key: " + encodeBase64(privateKey.getEncoded()));
        System.out.println();

        // 2. 加密
        String encryptedMessage = encrypt(originalMessage, publicKey);
        System.out.println("Encrypted: " + encryptedMessage);

        // 3. 解密
        String decryptedMessage = decrypt(encryptedMessage, privateKey);
        System.out.println("Decrypted: " + decryptedMessage);
    }

    /**
     * 生成RSA密钥对
     * @param keySize 密钥长度(推荐2048或以上)
     */
    public static KeyPair generateKeyPair(int keySize) throws NoSuchAlgorithmException {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(keySize);
        return keyPairGenerator.generateKeyPair();
    }

    /**
     * RSA加密
     * @param plainText 明文
     * @param publicKey 公钥
     * @return Base64编码的密文
     */
    public static String encrypt(String plainText, PublicKey publicKey) throws NoSuchPaddingException,
            NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
        return encodeBase64(encryptedBytes);
    }

    /**
     * RSA解密
     * @param encryptedText Base64编码的密文
     * @param privateKey 私钥
     * @return 解密后的明文
     */
    public static String decrypt(String encryptedText, PrivateKey privateKey) throws NoSuchPaddingException,
            NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        byte[] encryptedBytes = decodeBase64(encryptedText);
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
        return new String(decryptedBytes);
    }

    // Base64编码工具方法
    private static String encodeBase64(byte[] data) {
        return Base64.getEncoder().encodeToString(data);
    }

    // Base64解码工具方法
    private static byte[] decodeBase64(String data) {
        return Base64.getDecoder().decode(data);
    }
}

你可能感兴趣的:(java,开发语言)