公钥私钥?一文搞懂非对称加密

非对称加密

非对称加密:

  • 通信双方分别创建公钥和私钥,
  • 并且保证公钥所加密的信息,只有配对的私钥可以解密,
  • 接下来,双方公开交换公钥,通信时,使用对方的公钥进行加密,
  • 如此,就能确保对方能够通过自己的私钥解密
    在这里插入图片描述

在这里插入图片描述

加密算法RSA

按RSA的固定步骤:
在这里插入图片描述

  1. 选择素数

    • 随机选择两个大素数,通常表示为p和q。
  2. 计算乘积

    • 计算两个素数的乘积n,即n = p * q。
  3. 计算欧拉函数

    • 计算n的欧拉函数φ(n),其中φ(n) = (p-1) * (q-1)。
  4. 选择公钥

    • 选择一个整数e,满足1 < e < φ(n),并且e与φ(n)互质。通常,公钥是一个包含两个部分的数对(e, n)。
  5. 计算私钥

    • 计算私钥d,使得e * d ≡ 1 (mod φ(n))。通常,私钥是一个包含两个部分的数对(d, n)。
  6. 加密数据

    • 使用接收者的公钥(e, n),对要传输的数据进行加密。加密操作通常是将明文m的e次方,然后取模n,得到密文c:c = m^e mod n。
  7. 解密数据

    • 接收者使用自己的私钥(d, n)对密文进行解密。解密操作通常是将密文c的d次方,然后取模n,得到明文m:m = c^d mod n。
/**
 * RSA非对称加密算法客户端
 */
@Slf4j
public class RSAClient {

    /**
     * 生成两个质数
     */
    public List<Integer> getTwoPrime() {

        List<Integer> primes = new ArrayList<>();

        int len=0;

        while (len<2) {
            Random random = new Random();
            int num = random.nextInt(500);

            if (isPrime(num)) {
                primes.add(num);
                len++;
            }
        }

        log.info("(1)生成两个质数:{}", primes);

        return primes;
    }

    private boolean isPrime(int num) {

        for (int i = 2; i < Math.sqrt(num); i++) {
            if (num % i == 0) {
                return false;
            }
        }

        return true;
    }

    /**
     * 计算n,m
     */
    public Map<String, Integer> getNAndM(List<Integer> primes) {

        if (primes.size() != 2) {
            throw new IllegalArgumentException("只接受两个质数");
        }

        Integer prime1 = primes.get(0);
        Integer prime2 = primes.get(1);

        Map<String, Integer> map = new HashMap<>();

        //核心算法
        map.put("n", prime1 * prime2);
        map.put("m", (prime1 - 1) * (prime2 - 1));

        log.info("n,m:{}", map);

        return map;
    }

    /**
     * 随机选出m的一个质数,该质数为正且小于m
     */
    public Integer getPrime(Integer m) {

        while (true) {
            Random random = new Random();
            int e = random.nextInt(m);
            while (e == 0) {
                e = random.nextInt(m);
            }
            if (getGCD(e, m) == 1) {
                return e;
            }
        }

    }

    /**
     * 欧几里得算法:a,b最大公因数等于b,a%b的最大公因数,当两数的最大公因数是1时,两数互质,初始时,a<b
     */
    private int getGCD(int a, int b) {
        if (b == 0) {
            return a;
        }
        return getGCD(b, a % b);
    }

    /**
     * 通过扩展欧几里得算法获得d,d满足:(d * e) % m =1
     */
    public int getD(int e, int m) {
        int d = 1;
        while (true) {
            if ((d * e) % m == 1) {
                break;
            }
            d++;
        }
        return d;
    }

    /**
     * 加密
     */
    public byte[] encrypt(String content,Integer n,Integer e) {

        //2.利用公钥加密
        //2.1原文转成数字串
        List<Integer> integers = new ArrayList<>();
        for (byte b : content.getBytes()) {
            integers.add(((int) b ^e) % n);
        }

        Byte[] bytes = integers.stream().map(integer -> (byte) integer.intValue()).toArray(Byte[]::new);
        byte[] result = new byte[bytes.length];
        for (int i = 0; i < bytes.length; i++) {
            result[i]= bytes[i];
        }

        return result;
    }

    /**
    * 解密
    * */
    public String decrypt(byte[] bytes,Integer n,Integer m,Integer e){

        //获取私钥
        int d = getD(e, m);
        log.info("私钥:({},{})",d,n);

        byte[] result = new byte[bytes.length];

        for (int i = 0; i < bytes.length; i++) {
            int num = bytes[i];
            result[i]= (byte) ((num^e)%n);
        }

        return new String(result);
    }

    public static void main(String[] args) {

        RSAClient rsaClient = new RSAClient();
        //计算公钥
        Map<String, Integer> nAndM = rsaClient.getNAndM(rsaClient.getTwoPrime());
        Integer n = nAndM.get("n");
        Integer m = nAndM.get("m");
        Integer e = rsaClient.getPrime(m);
        log.info("公钥:({},{})", e, n);

        //加密
        byte[] bytes = rsaClient.encrypt("hello world",n,e);
        log.info("密文:{}", new String(bytes));
        //解密
        String decrypt = rsaClient.decrypt(bytes, n, m, e);
        log.info("解密:{}",decrypt);

    }

}

效果:

2024-05-07 13:52:17 INFO  [main] c.e.p.RSAClient.(): [信息] (1)生成两个质数:[4, 127]
2024-05-07 13:52:17 INFO  [main] c.e.p.RSAClient.(): [信息] n,m:{m=378, n=508}
2024-05-07 13:52:17 INFO  [main] c.e.p.RSAClient.(): [信息] 公钥:(85508)
2024-05-07 13:52:17 INFO  [main] c.e.p.RSAClient.(): [信息] 密文:=099:u":'91
2024-05-07 13:52:17 INFO  [main] c.e.p.RSAClient.(): [信息] 私钥:(169,508)
2024-05-07 13:52:17 INFO  [main] c.e.p.RSAClient.(): [信息] 解密:hello world

RSA原理

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/598456.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于51单片机无线恒温箱恒温控制系统

基于51单片机无线恒温箱恒温控制 &#xff08;程序&#xff0b;原理图&#xff0b;PCB&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.DS18B20温度传感器测温。 2.按键可以设定温度上下限及温度刷新时间间隔。 3.使用NRF24L01无线模块传输数据 4.温度…

flask网站开发计划

我想写一个flask开发网站的合集文章&#xff0c;该网站主要是采集网络上的文章&#xff08;不同站点&#xff0c;用Python识别出正文内容&#xff09;&#xff0c;然后做成长图形式&#xff0c;发布到flask站点&#xff0c;并提供“下载”按钮&#xff0c;点击下载按钮&#xf…

第3章 WebServer重构

3.1 重构原生Web服务框架 3.1.1 分析原生Web服务框架 在服务端代码的 ClientHandler 中&#xff0c;请求解析、处理请求、返回响应的代码混杂在一起&#xff0c;这样的设计会导致代码难以维护和理解。为了提高代码的可读性、可维护性和可扩展性&#xff0c;我们需要对这些代码…

快速掌握Redis优化要点,告别性能瓶颈!

大家好!我是小米,今天和大家分享一下在Redis中如何进行优化,以提升系统性能。Redis作为一种流行的内存数据库,因其高性能、高可用和数据持久性而受到广泛应用。然而,在实际应用中,我们仍需对Redis进行优化,以满足各种业务需求。接下来,我将从读写方式、KV size、Key数量…

VALSE 2024主旨报告内容解析:以深度学习框架为牵引促进自主AI生态发展

2024年视觉与学习青年学者研讨会&#xff08;VALSE 2024&#xff09;于5月5日到7日在重庆悦来国际会议中心举行。本公众号将全方位地对会议的热点进行报道&#xff0c;方便广大读者跟踪和了解人工智能的前沿理论和技术。欢迎广大读者对文章进行关注、阅读和转发。文章是对报告人…

探秘Flex布局下子元素宽度超出的那些烦心事

嘿&#xff0c;小伙伴们&#xff01;你们有没有遇到过用Flex布局的时候&#xff0c;子元素的宽度莫名其妙地超出了父元素的情况&#xff1f;别着急&#xff0c;今天我就来给大家揭秘这个问题的来龙去脉&#xff0c;以及一些解决方案。让我们一起来深入探讨&#xff01; 发现问…

【Gaea+UE5】创建基本的大型世界场景

目录 效果 步骤 一、在Gaea中生成地形 二、确定导出的地形规模 三、在UE中创建地形 四、验证UE创建的地形规模是否正确 五、使用M4自动地形材质 效果 步骤 一、在Gaea中生成地形 1. 打开Gaea官网下载软件 2. 打开Gaea软件&#xff0c;我们可以选择一个预设的山体 创…

Git === Git概述 Git安装

第1章 Git概述 Git是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的各种项目。 Git易于学习&#xff0c;占地面积小&#xff0c;性能极快。 它具有廉价的本地库&#xff0c;方便的暂存区域和多个工作流分支等特性。其性能优于Subversion…

汇凯金业:通货膨胀对能源行业有何影响

通货膨胀对能源行业有几方面的影响&#xff0c;具体取决于通货膨胀的原因、规模以及持续时间。以下是一些可能的效应&#xff1a; 成本增加&#xff1a;通货膨胀导致能源行业的运营成本上升。这包括原材料、设备、维护和人力成本。如果企业不能完全将成本转嫁给消费者&#xf…

Pytorch入门实战 P09-YOLOv5里面的Backbone模块搭建网络

目录 1、YOLOv5的模型图。 2、BackBone简单介绍。 3、YOLOv5的Backbone文件。 4、YOLOv5Backbone的code部分 5、完整的code部分 6、结果展示 &#xff08;1&#xff09;Adam优化器 &#xff08;2&#xff09;SGD优化器 &#x1f368; 本文为&#x1f517;365天深度学习…

linux系统下产生Segmentation fault 与 Segmentation fault (core dumped)!!!

最近在学习的过程中&#xff0c;遇到了Segment fault&#xff08;段错误&#xff09;的问题&#xff0c;经过一番查找资料&#xff0c;学到了一些相关知识&#xff0c;这里做一个梳理&#xff0c;以防以后在遇到类似的问题&#xff0c;并且希望能够帮助到大家一丝丝&#xff01…

华为AI全栈生态布局:中国科技巨头加速创新

华为AI芯片生态全栈深度分析 2024 一、引言 1.1 华为AI芯片发展背景&#xff1a; 华为&#xff0c;通信和消费电子巨头&#xff0c;以其技术创新和远见著称。2013年&#xff0c;华为率先布局人工智能&#xff08;AI&#xff09;&#xff0c;并专注于全栈AI解决方案的开发。华…

骨传导耳机哪个品牌值得入手?精选五款高性能骨传导耳机,闭眼入都不踩雷!

随着健康生活的日益普及&#xff0c;运动健身逐渐成为人们生活中的重要组成部分。在这一背景下&#xff0c;骨传导耳机作为一种新型蓝牙耳机&#xff0c;凭借其不堵塞耳道、防水性能强等特性&#xff0c;受到了广大运动爱好者的喜爱。然而&#xff0c;骨传导耳机的热销也吸引了…

一次性邮箱API发送邮件的方法?如何配置?

一次性邮箱API发送邮件有哪些注意事项&#xff1f;怎么安全发信&#xff1f; 随着网络安全问题的日益凸显&#xff0c;如何安全、高效地发送邮件成为了一个亟待解决的问题。一次性邮箱API的出现&#xff0c;为我们提供了一种新的解决方案。那么&#xff0c;如何使用一次性邮箱…

白酒:白酒香型的国际化推广与市场接受度分析

云仓酒庄的豪迈白酒一直有在白酒香型的国际化推广。随着中国白酒市场的不断扩大和国际化的趋势&#xff0c;了解白酒香型的国际接受度和推广策略对于酒厂和整个行业都具有重要意义。 首先&#xff0c;国际化推广需要深入了解国际市场的需求和消费者偏好。不同国家和地区的消费者…

长难句打卡5.7

In December 2010 America’s Federal Trade Commission (FTC) proposed adding a “do not track” (DNT) option to Internet browsers, so that users could tell advertisers that they did not want to be followed. 2010年12月&#xff0c;美国美国联邦贸易委员会(FTC)提…

020、Python+fastapi,第一个Python项目走向第20步:ubuntu 24.04 docker 安装mysql8集群+redis集群(一)

系列文章 pythonvue3fastapiai 学习_浪淘沙jkp的博客-CSDN博客https://blog.csdn.net/jiangkp/category_12623996.html 前言 docker安装起来比较方便&#xff0c;不影响系统整体&#xff0c;和前面虚拟环境有异曲同工之妙&#xff0c;今天把老笔记本T400拿出来装了个ubuntu24…

Spring AOP(3)

目录 Spring AOP原理 代理模式 代理模式中的主要角色 静态代理 动态代理 总结:面试题 什么是AOP? Spring AOP实现的方式有哪些? Spring AOP实现原理 Spring使用的是哪种代理方式? JDK和CGLIB动态代理的区别? Spring AOP原理 代理模式 代理模式, 也叫委托模式. …

CUDA C编程:第一个程序 向量相加

我的电脑没有装CUDA&#xff0c;所以使用租了带GPU的云服务器&#xff0c;然后使用vscode SSH远程连接云服务器。云GPU使用的是智星云&#xff0c;0.8元/h。 智星云 可以使用nvcc --version查看系统中安装的CUDA版本。 然后写第一个CUDA程序&#xff0c;两个向量相加结果给到…

绝地求生:季后赛名额确定!NH战队总积分榜排名第一!

2024年5月5日&#xff0c;PCL春季赛常规赛第五阶段第三天比赛结束&#xff0c;今天打完春季赛常规赛结束&#xff0c;16个战队进入季后赛的名额已确定。NH战队总积分506分&#xff0c;总积分榜排名第一&#xff01;&#xff01;NH战队也是唯一一支总积分超过500分的队伍。今天最…