• 【非对称加密算法】RSA算法


    一、非对称加密算法 

    非对称加密算法使用了两个不同的密钥:公钥和私钥。公钥是公开的,可以被任何人使用,而私钥是只有特定的人能够使用的。这种算法的加密和解密过程使用不同的密钥,因此称为非对称加密算法。

    在非对称加密算法中,使用公钥进行加密,私钥进行解密。因此,它的主要优点是可以实现安全的通信,因为即使公钥被攻击者获得,攻击者也无法破解消息,因为只有使用私钥才能解密。

    非对称加密算法常用于网络安全、电子邮件通信、电子支付和数字签名等领域。其中最常见的非对称加密算法是RSA算法。

    二、RSA算法 

    该算法的基本思想是将要加密的数据转化为一个数字,然后通过公钥进行加密。只有私钥才能解密这个加密后的数字,将其转化为原始的数据。加密和解密采用的是不同的密钥,公钥可以由任何人获得,而私钥只能由算法的使用者获得。

    RSA算法的应用场景包括:身份验证、加密通信、数字签名、SSL/TLS证书、VPN等。

     (1)具体使用

    1. public class Demo04 {
    2. public static void main(String[] args) throws Exception {
    3. // 明文:
    4. byte[] plain = "Hello, encrypt use RSA".getBytes("UTF-8");
    5. // 创建公钥/私钥对
    6. Human hong = new Human("小红");
    7. Human ming = new Human("小明");
    8. // 小明使用小红的公钥进行加密
    9. // 1.获取小红的公钥
    10. PublicKey hongPublicKey = hong.getPublicKey();
    11. System.out.println(String.format("小红的public key(公钥): %x", new BigInteger(1, hongPublicKey.getEncoded())));
    12. // 2.使用公钥加密
    13. byte[] encrypted = ming.encrypt(plain, hongPublicKey);
    14. System.out.println(String.format("encrypted(加密): %x", new BigInteger(1, encrypted)));
    15. // 小红使用自己的私钥解密:
    16. // 1.获取小红的私钥,并输出
    17. PrivateKey hongPrivateKey = hong.getPrivateKey();
    18. System.out.println(String.format("小红的private key(私钥): %x", new BigInteger(1, hongPrivateKey.getEncoded())));
    19. // 2.使用私钥解密
    20. byte[] decrypted = hong.decrypt(encrypted);
    21. System.out.println("decrypted(解密): " + new String(decrypted, "UTF-8"));
    22. }
    23. }
    24. //用户类
    25. class Human {
    26. // 姓名
    27. String name;
    28. // 私钥:
    29. PrivateKey privatekey;
    30. // 公钥:
    31. PublicKey publickey;
    32. // 构造方法
    33. public Human(String name) throws GeneralSecurityException {
    34. // 初始化姓名
    35. this.name = name;
    36. // 生成公钥/私钥对:
    37. KeyPairGenerator kpGen=KeyPairGenerator.getInstance("RSA");
    38. kpGen.initialize(1024);
    39. KeyPair kp=kpGen.generateKeyPair();
    40. this.privatekey=kp.getPrivate();
    41. this.publickey=kp.getPublic();
    42. }
    43. // 把私钥导出为字节
    44. public PrivateKey getPrivateKey() {
    45. return this.privatekey;
    46. }
    47. // 把公钥导出为字节
    48. public PublicKey getPublicKey() {
    49. return this.publickey;
    50. }
    51. // 用公钥加密
    52. public byte[] encrypt(byte[] message,PublicKey publickey) throws GeneralSecurityException {
    53. // 使用公钥进行初始化
    54. Cipher cipher=Cipher.getInstance("RSA");
    55. cipher.init(Cipher.ENCRYPT_MODE, publickey); //使用公钥进行初始化
    56. return cipher.doFinal(message);
    57. }
    58. // 用私钥解密:
    59. public byte[] decrypt(byte[] input) throws GeneralSecurityException {
    60. // 使用私钥进行初始化
    61. Cipher cipher=Cipher.getInstance("RSA");
    62. cipher.init(Cipher.DECRYPT_MODE,this.privatekey); //使用私钥进行初始化
    63. return cipher.doFinal(input);
    64. }
    65. }

     只用使用同一个公钥-私钥对才能正常加解密!!!

     

  • 相关阅读:
    操作users表的CRUD(增、查、删、改)
    【我的C/C++语言学习进阶之旅】C/C++编程笔记:C语言使用宏定义#define来处理通用的可抽取的代码块
    HTML网页设计【足球科普】学生DW静态网页设计
    yolov5和yolov7之实例分割训练
    在R中使用python虚拟环境
    es6 -- promise笔记记录
    从零玩转系列之微信支付实战PC端支付微信取消接口搭建 | 技术创作特训营第一期
    2-8:Http响应头content-type内容详解
    网工方向基本常识(持续更新)
    MySQL 5与MySQL 8版本差异及MySQL 8的新功能
  • 原文地址:https://blog.csdn.net/m0_63216218/article/details/132908860