当前位置: 首页 > article >正文

Java安全——AES(对称加密)和 RSA(非对称加密)的实现

目录

一、对称加密和非对称加密 

1.对称加密

常见算法

2.非对称加密

常见算法

3.对称加密和非对称加密的对比

二、AES(对称加密)

1.生成AES密钥

2.加密数据

3.解密数据

完整代码

三、RSA(非对称加密)

1.生成RSA密钥对

2.加密数据

3.解密数据

完整代码


一、对称加密和非对称加密 

1.对称加密

对称加密使用相同的密钥进行加密和解密。这意味着发送方和接收方必须共享同一个密钥,并且必须安全地存储和传输该密钥。

常见算法

  • AES(高级加密标准)
  • DES(数据加密标准)
  • 3DES(三重数据加密标准)
  • RC4

2.非对称加密

非对称加密使用一对密钥:公钥和私钥。公钥用于加密数据,私钥用于解密。公钥可以公开,而私钥必须保密。

常见算法

  • RSA(Rivest-Shamir-Adleman)
  • DSA(数字签名算法)
  • ECC(椭圆曲线加密)

3.对称加密和非对称加密的对比

特性对称加密非对称加密
密钥数量只有一个密钥(加密和解密相同)一对密钥(公钥和私钥)
加密速度较快较慢
安全性密钥管理复杂,密钥泄露风险高公钥可以公开,私钥保密确保安全
适用场景大量数据加密密钥交换、身份验证、数字签名

二、AES(对称加密)

1.生成AES密钥

  • 使用KeyGenerator类生成AES密钥。
  • 指定密钥长度,例如128位、192位或256位。
// 生成密钥 
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128); // 128位密钥长度(可选128,192或256位)
SecretKey secretKey = keyGenerator.generateKey();

2.加密数据

  • 使用Cipher类并指定AES算法。
  • 初始化Cipher对象为加密模式(Cipher.ENCRYPT_MODE)。
  • 使用密钥初始化Cipher对象。
  • 加密数据
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedData = cipher.doFinal(dataToEncrypt.getBytes());

// 编码加密数据:将加密后的字节数据编码为Base64字符串,以便存储或传输
String encryptedDataBase64 = Base64.getEncoder().encodeToString(encryptedData);
System.out.println("加密后的数据 (经Base64编码): " + encryptedDataBase64);

3.解密数据

  • 使用相同的Cipher对象进行解密。
  • 初始化Cipher对象为解密模式(Cipher.DECRYPT_MODE)。
  • 使用相同的密钥初始化Cipher对象。
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedDataBase64));
System.out.println("解密后的数据:" + new String(decryptedData));

完整代码

package com.lz.encryption;

import javax.crypto.*;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

public class SymmetricEncryption {
    public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
        // 对字符串数据进行加密
        // 待加密的数据
        String dataToEncrypt = "Hello World";

        // 1.生成密钥:
        //  使用KeyGenerator类生成一个AES密钥
        //  指定密钥长度,例如128位、192位或256位
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(128); // 128位密钥长度(可选128,192或256位)
        SecretKey secretKey = keyGenerator.generateKey();

        // 2.加密数据
        //  初始化Cipher对象:
        //      使用Cipher类并指定AES算法
        //      初始化Cipher对象为加密模式(Cipher.ENCRYPT_MODE)。
        //      使用密钥初始化Cipher对象。
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encryptedData = cipher.doFinal(dataToEncrypt.getBytes());

        // 编码加密数据:将加密后的字节数据编码为Base64字符串,以便存储或传输
        String encryptedDataBase64 = Base64.getEncoder().encodeToString(encryptedData);
        System.out.println("加密后的数据 (经Base64编码): " + encryptedDataBase64);

        // 3.解密数据:
        //  使用相同的Cipher对象进行解密。
        //  初始化Cipher对象为解密模式(Cipher.DECRYPT_MODE)。
        //  使用相同的密钥初始化Cipher对象。
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedDataBase64));
        System.out.println("解密后的数据:" + new String(decryptedData));
    }
}

三、RSA(非对称加密)

1.生成RSA密钥对

  • 使用KeyPairGenerator类生成RSA密钥对。
  • 指定密钥长度,例如2048位、3072位或4096位。
// 生成RSA密钥对
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048); 
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// 公钥
PublicKey publicKey = keyPair.getPublic();
// 私钥
PrivateKey privateKey = keyPair.getPrivate();

2.加密数据

  • 使用公钥初始化Cipher对象为加密模式(Cipher.ENCRYPT_MODE)。
  • 使用公钥加密数据。
// 公钥加密数据
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedBytes = cipher.doFinal(dataToEncrypt.getBytes());

// 将加密数据编码为Base64字符串
String encryptedDataBase64 = Base64.getEncoder().encodeToString(encryptedBytes);
System.out.println("加密后的数据 (经Base64编码): " + encryptedDataBase64);

3.解密数据

  • 使用私钥初始化Cipher对象为解密模式(Cipher.DECRYPT_MODE)。
  • 使用私钥解密数据。
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedDataBase64));

完整代码

package com.lz.encryption;

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

public class RasEncryption {
    public static void main(String[] args) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
        // 待加密的数据
        String dataToEncrypt = "Hello World";

        // 1.生成RSA密钥对
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048); // 2048位密钥长度
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        //公钥
        PublicKey publicKey = keyPair.getPublic();
        //私钥
        PrivateKey privateKey = keyPair.getPrivate();

        // 公钥加密数据
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedBytes = cipher.doFinal(dataToEncrypt.getBytes());

        // 将加密数据编码为Base64字符串
        String encryptedDataBase64 = Base64.getEncoder().encodeToString(encryptedBytes);
        System.out.println("加密后的数据 (经Base64编码): " + encryptedDataBase64);

        // 私钥解密数据
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedDataBase64));

        // 将解密后的字节数据转换为字符串
        System.out.println("解密后的数据:" + new String(decryptedData));
    }
}


http://www.kler.cn/news/364715.html

相关文章:

  • YOLOv11改进策略【卷积层】| ECCV-2024 小波卷积WTConv 增大感受野,降低参数量计算量,独家创新助力涨点
  • 报表系统-连接数据库操作
  • 【Conda】Conda 超时设置及优化指南:提升包管理效率的关键
  • 大家都在用的HR招聘管理工具:国内Top5排名
  • 位运算挑战:通过最少位翻转实现 a OR b == c【逐位处理与右移操作】
  • 高翔【自动驾驶与机器人中的SLAM技术】学习笔记(十二)拓展图优化库g2o(一)框架
  • Failed to fetch dynamically imported module
  • react18中的jsx 底层渲染机制相关原理
  • 基于SpringBoot的“高校校园点餐系统”的设计与实现(源码+数据库+文档+PPT)
  • 任务间通信(1)
  • 使用GDAL库的ogr2ogr将GeoJSON数据导入到PostgreSql中
  • 分布式ID多种生成方式
  • 用docker Desktop 下载使用thingsboard/tb-gateway
  • Docker快速安装Grafana
  • Ubuntu清理空间
  • Vite 前端开发的超级加速器 - 从入门到精通
  • 【面试常考】Redis大key问题产生的影响及解决方案
  • 【Java】SpringBoot实现MySQL数据库的增删查改
  • 【记录】VSCode|自用设置项
  • 安徽对口高考Python试题选:输入一个正整数,然后输出该整数的3的幂数相加形式。
  • Linux运维实战100讲练习:第9集
  • OPPO携手比亚迪共同探索手机与汽车互融新时代
  • 如何制作一个自己的网站?
  • 文本中句子的重要性排名——TextRank算法
  • Linux 6种查看日志方法
  • 物联网智能项目综述