非对称加密算法之RSA算法实现

本文详细介绍了非对称加密的基本概念,并深入探讨了公钥与私钥的工作原理,特别是RSA算法背后的数学原理,包括如何生成公钥与私钥以及加密解密的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对称加密,非对称加密,公钥,私钥,RSA这些常常听到的,到底是怎么回事

有个同事问我公钥私钥到底为什么能互相解开,一时语塞,平时都只是知道怎么用,但很少去了解的更细,现在做个整理,记个笔记

非对称加密简述

公钥加密后的密文,只有私钥才能解密
简单来说,A和B要互相通信,A生成一个公钥和一个私钥,
A将公钥传给B,
此时B将公钥和真正的数据M加密,生成密文是N,
B再将N通过网络传给A,
A再通过秘钥将N解密,得到真正的数据M

公钥私钥原理(特指RSA算法)

网上抄的,但要理解
RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

 算法描述:
(1)选择两个不同的大素数p和q;
// p=3,q=11

(2)计算乘积n=pq和Φ(n)=(p-1)(q-1);
//n=33,Φ(n)=20

(3)选择大于1小于Φ(n)的随机整数e,使得gcd(e,Φ(n))=1;//gcd即最大公约数。
//e和Φ(n)的最大公约数为1,也就是e只要不被Φ(n)整除就行,假如取e=3

(4)计算d使得d*e=1mod Φ(n);注:即d*e mod Φ(n) =1。//mod是求余函数
//d*e与1关于Φ(n)同余,1除以20余数是1,那么说明d*3除以20,余数也是1
//即3d=20k+1,k是整数,可取得d=7

(5)对每一个密钥k=(n,p,q,d,e),定义加密变换为Ek(x)=xe mod n,
解密变换为Dk(x)=yd mod n,这里x,y∈Zn;

(6)p,q销毁,以{e,n}为公开密钥,{d,n}为私有密钥。

实例:
1. 假设p = 3、q = 11(p,q都是素数即可。),则N = pq = 33;
2. r =Φ(n)= (p-1)(q-1) = (3-1)(11-1) = 20;
3. 根据gcd(e,Φ(n))=1,即gcd(e,20)=1,令e=3,则,d = 7。
(两个数交换一下也可以。)

到这里,公钥和密钥已经确定。公钥为(N, e) = (33, 3),密钥为(N, d) = (33, 7)。

扩展:
1.RSA详解
2.RSA算法原理一
3.RSA算法原理二


java代码简约版实现:

package com.rsa;

/**
 * Created by zhangshuai on 2018/7/31.
 */
public class RsaTest {
    /**
     * RSA算法
     * @param baseNum 基数
     * @param key 公钥或密钥
     * @param message 加密或者解密的数据
     * @return
     */
    public static long rsa(int baseNum, int key, long message){
        if(baseNum < 1 || key < 1){
            return 0L;
        }
        //加密或者解密之后的数据
        long rsaMessage = 0L;
        double pow = Math.pow(message, key);
        System.out.println("pow="+pow);
        long round = Math.round(pow);
        System.out.println("roud="+round);
        //核心算法
        rsaMessage = Math.round(Math.pow(message, key)) % baseNum;
        return rsaMessage;
    }

    public static void main(String[] args){
        //基数
        int baseNum = 3 * 11;
        //公钥
        int keyPublic = 3;
        //密钥
        int keyPrivate = 7;
        //未加密的数据
        long msg = 24L;
        //获得公钥加密后的数据
        long encodeMsg = rsa(baseNum, keyPublic, msg);
        //获得私钥解密后的数据
        long decodeMsg = rsa(baseNum, keyPrivate, encodeMsg);

        System.out.println("加密前:" + msg);
        System.out.println("加密后:" + encodeMsg);
        System.out.println("解密后:" + decodeMsg);
    }
}

结果:

pow=13824.0
roud=13824
pow=2.187E10
roud=21870000000
加密前:24
加密后:30
解密后:24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值