RSA密码算法C++实现

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: RSA密码算法C++实现

文章目录

1. RSA非对称加密原理

网上一大把,这里推荐一篇比较好的博客

2. C++ 随机生成密钥版本

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include<string.h>
#include <math.h>
#include<algorithm>
using namespace std;
typedef long long ll;
// e是公钥
// d是私钥
ll e, d, n;
ll gcd(ll a, ll b)  //求最大公约数
{
    ll c = 0;
    if(a<b) swap(a,b);
    c = b;
    do
    {
        b = c;
        c = a%b;
        a = b;
    }
    while (c != 0);
    return b;
}
// 0不是 1是 
ll isPrime(ll i) //判断i是否是素数
{
    ll flag=0;
    for(ll a=2; a<i; a++)
    {
        if(i%a==0)
        {
            flag=1;
            break;
        }
    }
    if(flag==1) return 0;
    else return 1;
}
ll myPow(ll a, ll b, ll n)  //求a^b mod n
{
    ll y;
    /*使用二进制平方乘法计算 pow(a,b) % n*/
    y=1;
    while(b != 0)
    {
        /*对于b中的每个1,累加y*/
        if(b & 1)
            y = (y*a) % n;
        /*对于b中的每一位,计算a的平方*/
        a = (a*a) % n;
        /*准备b中的下一位*/
        b = b>>1;
    }
    return y;
}
void extgcd(ll a,ll b,ll& d,ll& x,ll& y) 
{
    if(!b)
    {
        d=a;
        x=1;
        y=0;
    }
    else
    {
        extgcd(b,a%b,d,y,x);
        y-=x*(a/b);
    }
}
ll ModularInverse(ll a,ll b)  //获取(1/a)mod b的结果
{
    ll d,x,y;
    extgcd(a,b,d,x,y);
    return d==1?(x+b)%b:-1;
}
void KeyGeneration()  //获取公钥密钥
{
    ll p, q;
    ll phi_n;
    do
    {
        do
            p = rand();
        while (p % 2 == 0);
    }
    while (!isPrime(p));  // 得到素数 p 
    do
    {
        do
            q = rand();
        while (q % 2 == 0);
    }
    while (!isPrime(q));  // 得到素数q 
    n = p * q;
    phi_n = (p - 1) * (q - 1);
    do
        e = rand() % (phi_n - 2) + 2; // 1 < e < phi_n
    while (gcd(e, phi_n) != 1);
    d = ModularInverse(e,phi_n);
}
// 一位一位地输出加密的结果 
ll Encryption(ll value)  //加密
{
    ll cipher;
    cipher = myPow(value, e, n);
    cout<<cipher;
    return cipher;
}
// 一位一位地输出解 密的结果 
void Decryption(ll value)  //解密
{
    ll decipher;
    decipher = myPow(value, d, n);
    cout<<decipher;
}
int main()
{
  /******
  对6位的数字进行稳定加密 
  ******/
  ll num;
  cout<<"请输入要加密的明文数字,ctrl+c结束"<<endl;
  while(cin>>num){
    ll de;
    cout<<"输入的明文为"<<num<<endl; 
      KeyGeneration();  //获取公钥密钥
      cout<<"加密密钥:"<<e<<endl; 
      cout<<"加密结果为:";
    de = Encryption( num );
    cout<<"\n私钥为:"<<d;
//    cout<<"de="<<de<<endl;
    cout<<"\n解密结果"; 
    Decryption(de); 
    cout<<"\n-------------"<<endl;
  }
    return 0;
}

3. 密钥固定e=13版本

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include<string.h>
#include <math.h>
#include<algorithm>
using namespace std;
typedef long long ll;
char map[30] = {
  'a', 'b', 'c', 'd', 'e','f','g',
  'h', 'i', 'j', 'k', 'l', 'm', 'n',
  'o', 'p', 'q', 'r', 's', 't', 
  'u', 'v', 'w', 'x', 'y', 'z'
  };
//cp存密文, ep存明文 
char cp[1000], ep[1000];
int lcp , lep ;
ll getNum(char a, char b){
  int aa,bb;
  for(int i=0; i<30; i++){
    if(map[i]==a){
      aa = i;
    }
    if(map[i]==b){
      bb = i;
    }
  }
  return aa*100+bb;
}
// flag = 1, 解密转换得到的是明文
// flag = 2 加密转换得到的是密文 
void toChar(ll num, int flag = 1){
  int a = num/100;
  int b = num%100;
  a %= 26;
  b %= 26; 
  cout<<map[a]<<map[b]<<" "<<endl;
  if(flag==1){
    ep[lep++] = map[a];
    ep[lep++] = map[b];
  } 
  else if(flag==2){
    cp[lcp++] = map[a];
    cp[lcp++] = map[b];
  }
}
// e是公钥
// d是私钥
ll e, d, n;
ll gcd(ll a, ll b)  //求最大公约数
{
    ll c = 0;
    if(a<b) swap(a,b);
    c = b;
    do
    {
        b = c;
        c = a%b;
        a = b;
    }
    while (c != 0);
    return b;
}
// 0不是 1是 
ll isPrime(ll i) //判断i是否是素数
{
    ll flag=0;
    for(ll a=2; a<i; a++)
    {
        if(i%a==0)
        {
            flag=1;
            break;
        }
    }
    if(flag==1) return 0;
    else return 1;
}
ll myPow(ll a, ll b, ll n)  //求a^b mod n
{
    ll y;
    /*使用二进制平方乘法计算 pow(a,b) % n*/
    y=1;
    while(b != 0)
    {
        /*对于b中的每个1,累加y*/
        if(b & 1)
            y = (y*a) % n;
        /*对于b中的每一位,计算a的平方*/
        a = (a*a) % n;
        /*准备b中的下一位*/
        b = b>>1;
    }
    return y;
}
void extgcd(ll a,ll b,ll& d,ll& x,ll& y) 
{
    if(!b)
    {
        d=a;
        x=1;
        y=0;
    }
    else
    {
        extgcd(b,a%b,d,y,x);
        y-=x*(a/b);
    }
}
ll ModularInverse(ll a,ll b)  //获取(1/a)mod b的结果
{
    ll d,x,y;
    extgcd(a,b,d,x,y);
    return d==1?(x+b)%b:-1;
}
void KeyGeneration()  //获取公钥密钥
{
    ll p, q;
    ll phi_n;
  p = 43; q = 59, e=13;
    n = p * q;
    phi_n = (p - 1) * (q - 1);
    d = ModularInverse(e,phi_n);
}
// 一位一位地输出加密的结果 
ll Encryption(ll value)  //加密
{
    ll cipher;
    cipher = myPow(value, e, n);
    cout<<"加密得到的数字="<<cipher<<"\t加密得到的字母=";
  toChar(cipher, 2);
    return cipher;
}
// 一位一位地输出解 密的结果 
void Decryption(ll value)  //解密
{
    ll decipher;
    decipher = myPow(value, d, n);
    cout<<"解密得到的数字="<<decipher<<"\t解密得到的字母=";
  toChar(decipher, 1);
}
int main()
{
  lcp = 0, lep = 0;
  char st[] = "cybergreatwall";
  KeyGeneration();
  cout<<"e="<<e<<" d="<<d<<" n="<<n <<endl;
  int len = strlen(st);
//  cout<<st<<" "<<len<<endl;
  for(int i=0; i<len; i+=2){
    cout<<"加密的明文="<<st[i]<<st[i+1]<<endl;
    ll num = getNum(st[i], st[i+1]);
    cout<<"明文对应的数字"<<num<<endl;
    ll de = Encryption( num );
    Decryption(de); 
  }
  cp[lcp] = '\0';
  ep[lep] = '\0';
  cout<<"加密的结果为"<<cp<<endl;
  cout<<"解密的结果为:"<<ep<<endl;
    return 0;
}

完结撒花,cv可用

相关文章
|
1月前
|
存储 算法 C++
高精度算法(加、减、乘、除,使用c++实现)
高精度算法(加、减、乘、除,使用c++实现)
459 0
高精度算法(加、减、乘、除,使用c++实现)
|
1月前
|
算法 安全 Go
RSA加密算法详解与Python和Go实现
RSA加密算法详解与Python和Go实现
94 1
|
1月前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
22 0
|
1月前
|
存储 算法 决策智能
【算法】博弈论(C/C++)
【算法】博弈论(C/C++)
|
1月前
|
存储 算法 C++
【算法】哈希映射(C/C++)
【算法】哈希映射(C/C++)
|
1月前
|
机器学习/深度学习 人工智能 算法
【算法】最长公共子序列(C/C++)
【算法】最长公共子序列(C/C++)
|
1月前
|
人工智能 算法 BI
一篇带你速通差分算法(C/C++)
一篇带你速通差分算法(C/C++)
|
1月前
|
人工智能 算法 C++
一篇带你速通前缀和算法(C/C++)
一篇带你速通前缀和算法(C/C++)
|
1月前
|
存储 算法 C++
弗洛伊德(Floyd)算法(C/C++)
弗洛伊德(Floyd)算法(C/C++)
|
1月前
|
存储 算法 程序员
迪杰斯特拉(Dijkstra)算法(C/C++)
迪杰斯特拉(Dijkstra)算法(C/C++)