RSA加密算法c++实现

RSA加密算法c++实现RSA加密算法c++实现 先码个代码:/*************************************************************************>FileName:RSA.cpp>Author:YB>E-mail:134…

大家好,又见面了,我是你们的朋友全栈君。

RSA加密算法c++实现

先码个代码:

/*************************************************************************

    > File Name: RSA.cpp

    > Author: YB

    > E-mail: 1348756432@qq.com

    > Created Time: 2019年03月05日 星期二

 ************************************************************************/
#include<bits/stdc++.h>
using namespace std;
int Euler(int n)//欧拉函数 求1到n中有多少个整数与n互质
{
    int rs=1;
    for(int i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            rs*=(i-1);
            n/=i;
            while(n%i==0)
            {
                rs*=(i-1);
                n/=i;
            }
        }
    }
    if(n>1)
        rs*=(n-1);
    return rs;
}
int gcd(int a,int b)//求a,b的最大公约数
{
    if(b==0)
        return a;
    return gcd(b,a%b);
}
int check(int n)//判断n是不是素数
{
    if(n==1)
        return 0;
    if(n==2)
        return 1;
    for(int i=3;i*i<=n;i=i+2)
    {
        if(n%i==0)
            return 0;
    }
    return 1;
}
int gnerating_primes(int n)//产生小于等于n的第一个素数
{
    if(n%2==0)
        n--;
    for(int i=n;i>1;i=i-2)
    {
        if(check(i)==1)
            return i;
    }
    return -1;//表示没有小于等于n的素数
}
int multiplicative_inverse_element(int a,int r)//求a对于r的乘法逆元
{
    int rs=1;
    if(check(r)==1)//r是素数 采用费马小定理
    {
        for(int i=1;i<=r-2;i++)
            rs*=a,rs%=r;
    }else //r不是素数,采用欧拉定理的推论
    {
        int k=Euler(r)-1;
        for(int i=1;i<=k;i++)
            rs*=a,rs%=r;
    }
    return rs;
}
int get_pk(int w)
{
    int pk=2;
    for(pk=2;pk<w;pk++)
    {
        if(gcd(w,pk)==1)
            return pk;
    }
    return pk;
}
int square_multiplication(int x,int c,int r)//平方乘算法,x的c次方%r
{
    string str="";
    while(c)
    {
        str=(char)(c%2+'0')+str;
        c/=2;
    }
    int rs=x;
    int l=str.length();
    for(int i=1;i<l;i++)
    {
        if(str[i]=='0')
            rs=((rs%r)*(rs%r))%r;
        else
            rs=(((rs%r)*(rs%r))%r*x)%r;
    }
    return rs;
}
int main()
{
    int p=47;
    int q=61;

    int r=p*q;//公开模数
    cout<<"r="<<r<<endl;

    int w=Euler(r);//1到r中与r互质的数的个数

    //求得公钥
    int pk=get_pk(w);
    //pk=167;
    cout<<"公钥(pk,r):("<<pk<<","<<r<<")"<<endl;

    //求得私钥
    int sk=multiplicative_inverse_element(pk,w);
    cout<<"私钥(sk,r):("<<sk<<","<<r<<")"<<endl;

    int M=123456789;//明文
    int K=3;//K位一组

    int temp=1;
    for(int k=1;k<=K;k++)
        temp*=10;
    cout<<"密文:";
    for(int i=1;i<=K;i++)
    {
         cout<<square_multiplication(M%temp,pk,r)<<" ";
         M/=temp;
    }
    cout<<endl;

    return 0;
}

 

posted @
2019-03-06 11:40
Y先森0.0 阅读(
) 评论(
)
编辑
收藏
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143698.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 基于MQTTnet 3.0.12实现MQTT服务器和客户端「建议收藏」

    基于MQTTnet 3.0.12实现MQTT服务器和客户端「建议收藏」基于MQTTnet3.0.12实现MQTT服务器和客户端概述-可看可不看的废话MQTT是啥MQTTnet正文MQTTServer/Broker实现MQTTServer/Broker创建MQTTServer/Broker发布消息MQTTClient实现MQTTClient创建MQTTClient发布消息MQTTClien订阅消息MQTTClien取消订阅消息概述-可看可不看的废话公司基于制造业客户的数据采集需求,在布局自己的数据中台。现在物联网的概念很火,辣条从业7年来一直号称是“自动化

    2022年6月25日
    33
  • 免费 UML 工具

    免费 UML 工具选取了四款UML工具:astah经常看到网上的黄色背景就是这个软件画的,最后一个免费的社区版本是:astahcommunity7.2安装包大小50M以下三个均为免费版本:SoftwareIdeasModeler可以画序列图,安装包很小,只有十几兆,而且提供便携版下载Modelio这是一个大型的软件,安装包300+MBModelio是由位于法国巴黎的Modeliosoft开发的开源UML工具。它支持UML2和BPMN标准。BOUML看起来…

    2022年7月12日
    14
  • idea中edit configuration_pycharm和vim哪个好

    idea中edit configuration_pycharm和vim哪个好keyconflictswithIDEIDEmenu:file->settings->othersettings->VimEmulationconfigfile~/.ideavimrcusesystemclipboardasunnamedregister~/.ideavimrc:setclipboard^=unnamed,unnamedplus

    2022年10月1日
    5
  • AllinOne安装OpenStack

    AllinOne安装OpenStack1.虚拟机的配置准备内存:8G+CPU:2|2网络设置:NAT硬盘设置:100G+2.启动虚拟机3.网络配置vi/etc/sysconfig/network添加内容:NETWORKING=yes

    2025年7月28日
    7
  • spring 4 泛型注入

    spring 4 泛型注入最近对系统进行改造,发现在泛型实例初始化的时候,得不到想要的泛型。或者需要强制转换。spring4开始支持泛型对象初始化,初始化方法如下:注:使用配置文件的方法暂时还没有发现,下面是使用javaannotation的方法:packagecom.mitchz..toolkit.chain;importjava.util.List;importjava.util.M

    2022年7月25日
    10
  • Python数组切片_python print数组

    Python数组切片_python print数组文章目录numpy数组切片操作一维数组1、一个参数:a[i]2、两个参数:b=a[i:j]3、三个参数:格式b=a[i:j:s]二维数组numpy数组切片操作通过冒号分隔切片参数start:stop:step来进行切片操作:一维数组importnumpyasnpa=[1,2,3.4,5]print(a)[12345]1、一个参数:a[i]如[2],将…

    2025年11月24日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号