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 阅读(
) 评论(
)
编辑
收藏
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • window git安装步骤_Ubuntu git安装

    window git安装步骤_Ubuntu git安装Windows下安装git超详细图文教程

  • hashmap动态扩容死循环_HashMap扩容

    hashmap动态扩容死循环_HashMap扩容HashMap扩容死循环问题源码分析问题(jdk1.7)一、首先hashmap单线程正常扩容遍历每个数组,依次遍历每个数组的链表,根据头插法由原来的1,2,3变为了3,2,1二、hashmap多线程扩容死循环问题两个线程e1,e2此时线程一先执行,但线程二的指向发生改变,改为线程变换后的具体存储;初始的e2指向0号位的1,但经过线程一的变换指向了2号位的1了,next也发生改变线程二开始在线程一的基础存储,当next2指向空时。e.next=newTable[i],也就

  • weblogic环境,应用上传图片报Could not initialize class sun.awt.X11.XToolkit

    weblogic环境,应用上传图片报Could not initialize class sun.awt.X11.XToolkit

  • C++学习之路——名字空间与模板

    C++学习之路——名字空间与模板例题:把课程当中的函数模板与类模板两个程序自己写一遍并写好注释。代码如下:#include “pch.h”#include<vector>#include<string>#include <iostream>using namespace std;//模板类template<class T> class Stack{publ…

  • idea免费激活码-激活码分享

    (idea免费激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.cn/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~9071407CR5-eyJsaWNlbnNlSWQiOi…

  • 线程的IsBackground属性「建议收藏」

    线程的IsBackground属性「建议收藏」.Net的公用语言运行时(CommonLanguageRuntime,CLR)能区分两种不同类型的线程:前台线程和后台线程。这两者的区别就是:应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。.net环境使用Thread建立的线程默认情况下是前台线程,即线程属性IsBackground=

    2022年10月17日

发表回复

您的电子邮箱地址不会被公开。

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