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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Python可视化库

    现如今大数据已人尽皆知,但在这个信息大爆炸的时代里,空有海量数据是无实际使用价值,更不要说帮助管理者进行业务决策。那么数据有什么价值呢?用什么样的手段才能把数据的价值直观而清晰的表达出来?答案是要提供像人眼一样的直觉的、交互的和反应灵敏的可视化环境。数据可视化将技术与艺术完美结合,借助图形化的手段,清晰有效地传达与沟通信息,直观、形象地显示海量的数据和信息,并进行交互处理。数据可视化的应用…

    2022年4月5日
  • 猴子摘香蕉问题c语言_c语言人工智能算法

    猴子摘香蕉问题c语言_c语言人工智能算法问题说明:房间内有一只猴子,一个箱子和一个挂在天花板上的香蕉。三者的位置如下图所示:初始状态:三者在输入的初始位置,猴子手上无香蕉,猴子不在箱子上。目标状态:三者均在香蕉对应的位置,猴子手上有香蕉,且在箱子上。实现步骤:猴子走到箱子处猴子将箱子推到香蕉处猴子爬上箱子猴子摘香蕉程序内容:本程序主要实现猴子摘香蕉的过程,即从初始状态到目标状态。程序运行后,根据用户输入的三者的位置,按照实现步骤更新每一过程后的状态变量,并将过程输出。本程序使用以下函数:main():主函数

    2022年9月26日
  • MySQL密码忘了怎么办?MySQL重置root密码方法

    MySQL密码忘了怎么办?MySQL重置root密码方法

    2021年10月8日
  • bootcamp您的磁盘未能分区_bootcamp无法调整分区大小

    bootcamp您的磁盘未能分区_bootcamp无法调整分区大小朋友把macbookpro拿来让我帮删除下用bootcamp安装的win10系统,于是就打开mac进入实用工具->磁盘工具->点击左侧磁盘列表中的MacintoshHD根目录,右侧选择分区,然后点击右侧分区布局列表中的BOOTCAMP,点下面的『-』号,再点移除,系统提示『您的磁盘不能恢复为单一的分区』。    遇到问题找度娘,结果查询出来的结果是,需要重新安装MAC系统,『NT

    2022年8月11日
  • linux命令大全网址https://www.linuxcool.com/

    linux命令大全网址https://www.linuxcool.com/linux命令大全网址https://www.linuxcool.com/

    2022年7月1日
  • MOS管电平转换电路学习

    MOS管电平转换电路学习一个MOSFET电平转换电路引发的问题

    2022年10月19日

发表回复

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

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