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

火影  金牌会员 | 2024-11-15 10:21:14 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 851|帖子 851|积分 2553

目次
一、对称加密和非对称加密 
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位。
  1. // 生成密钥
  2. KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
  3. keyGenerator.init(128); // 128位密钥长度(可选128,192或256位)
  4. SecretKey secretKey = keyGenerator.generateKey();
复制代码
2.加密数据



  • 利用Cipher类并指定AES算法。
  • 初始化Cipher对象为加密模式(Cipher.ENCRYPT_MODE)。
  • 利用密钥初始化Cipher对象。
  • 加密数据
  1. Cipher cipher = Cipher.getInstance("AES");
  2. cipher.init(Cipher.ENCRYPT_MODE, secretKey);
  3. byte[] encryptedData = cipher.doFinal(dataToEncrypt.getBytes());
  4. // 编码加密数据:将加密后的字节数据编码为Base64字符串,以便存储或传输
  5. String encryptedDataBase64 = Base64.getEncoder().encodeToString(encryptedData);
  6. System.out.println("加密后的数据 (经Base64编码): " + encryptedDataBase64);
复制代码
3.解密数据



  • 利用相同的Cipher对象举行解密。
  • 初始化Cipher对象为解密模式(Cipher.DECRYPT_MODE)。
  • 利用相同的密钥初始化Cipher对象。
  1. cipher.init(Cipher.DECRYPT_MODE, secretKey);
  2. byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedDataBase64));
  3. System.out.println("解密后的数据:" + new String(decryptedData));
复制代码
完整代码

  1. package com.lz.encryption;
  2. import javax.crypto.*;
  3. import java.security.InvalidKeyException;
  4. import java.security.NoSuchAlgorithmException;
  5. import java.util.Base64;
  6. public class SymmetricEncryption {
  7.     public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
  8.         // 对字符串数据进行加密
  9.         // 待加密的数据
  10.         String dataToEncrypt = "Hello World";
  11.         // 1.生成密钥:
  12.         //  使用KeyGenerator类生成一个AES密钥
  13.         //  指定密钥长度,例如128位、192位或256位
  14.         KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
  15.         keyGenerator.init(128); // 128位密钥长度(可选128,192或256位)
  16.         SecretKey secretKey = keyGenerator.generateKey();
  17.         // 2.加密数据
  18.         //  初始化Cipher对象:
  19.         //      使用Cipher类并指定AES算法
  20.         //      初始化Cipher对象为加密模式(Cipher.ENCRYPT_MODE)。
  21.         //      使用密钥初始化Cipher对象。
  22.         Cipher cipher = Cipher.getInstance("AES");
  23.         cipher.init(Cipher.ENCRYPT_MODE, secretKey);
  24.         byte[] encryptedData = cipher.doFinal(dataToEncrypt.getBytes());
  25.         // 编码加密数据:将加密后的字节数据编码为Base64字符串,以便存储或传输
  26.         String encryptedDataBase64 = Base64.getEncoder().encodeToString(encryptedData);
  27.         System.out.println("加密后的数据 (经Base64编码): " + encryptedDataBase64);
  28.         // 3.解密数据:
  29.         //  使用相同的Cipher对象进行解密。
  30.         //  初始化Cipher对象为解密模式(Cipher.DECRYPT_MODE)。
  31.         //  使用相同的密钥初始化Cipher对象。
  32.         cipher.init(Cipher.DECRYPT_MODE, secretKey);
  33.         byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedDataBase64));
  34.         System.out.println("解密后的数据:" + new String(decryptedData));
  35.     }
  36. }
复制代码

三、RSA(非对称加密)

1.天生RSA密钥对



  • 利用KeyPairGenerator类天生RSA密钥对。
  • 指定密钥长度,例如2048位、3072位或4096位。
  1. // 生成RSA密钥对
  2. KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
  3. keyPairGenerator.initialize(2048);
  4. KeyPair keyPair = keyPairGenerator.generateKeyPair();
  5. // 公钥
  6. PublicKey publicKey = keyPair.getPublic();
  7. // 私钥
  8. PrivateKey privateKey = keyPair.getPrivate();
复制代码
2.加密数据



  • 利用公钥初始化Cipher对象为加密模式(Cipher.ENCRYPT_MODE)。
  • 利用公钥加密数据。
  1. // 公钥加密数据
  2. Cipher cipher = Cipher.getInstance("RSA");
  3. cipher.init(Cipher.ENCRYPT_MODE, publicKey);
  4. byte[] encryptedBytes = cipher.doFinal(dataToEncrypt.getBytes());
  5. // 将加密数据编码为Base64字符串
  6. String encryptedDataBase64 = Base64.getEncoder().encodeToString(encryptedBytes);
  7. System.out.println("加密后的数据 (经Base64编码): " + encryptedDataBase64);
复制代码
3.解密数据



  • 利用私钥初始化Cipher对象为解密模式(Cipher.DECRYPT_MODE)。
  • 利用私钥解密数据。
  1. cipher.init(Cipher.DECRYPT_MODE, privateKey);
  2. byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedDataBase64));
复制代码
完整代码

  1. package com.lz.encryption;
  2. import javax.crypto.BadPaddingException;
  3. import javax.crypto.Cipher;
  4. import javax.crypto.IllegalBlockSizeException;
  5. import javax.crypto.NoSuchPaddingException;
  6. import java.security.*;
  7. import java.util.Base64;
  8. public class RasEncryption {
  9.     public static void main(String[] args) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
  10.         // 待加密的数据
  11.         String dataToEncrypt = "Hello World";
  12.         // 1.生成RSA密钥对
  13.         KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
  14.         keyPairGenerator.initialize(2048); // 2048位密钥长度
  15.         KeyPair keyPair = keyPairGenerator.generateKeyPair();
  16.         //公钥
  17.         PublicKey publicKey = keyPair.getPublic();
  18.         //私钥
  19.         PrivateKey privateKey = keyPair.getPrivate();
  20.         // 公钥加密数据
  21.         Cipher cipher = Cipher.getInstance("RSA");
  22.         cipher.init(Cipher.ENCRYPT_MODE, publicKey);
  23.         byte[] encryptedBytes = cipher.doFinal(dataToEncrypt.getBytes());
  24.         // 将加密数据编码为Base64字符串
  25.         String encryptedDataBase64 = Base64.getEncoder().encodeToString(encryptedBytes);
  26.         System.out.println("加密后的数据 (经Base64编码): " + encryptedDataBase64);
  27.         // 私钥解密数据
  28.         cipher.init(Cipher.DECRYPT_MODE, privateKey);
  29.         byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedDataBase64));
  30.         // 将解密后的字节数据转换为字符串
  31.         System.out.println("解密后的数据:" + new String(decryptedData));
  32.     }
  33. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

火影

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表