RSA密码算法C++实现

简介: 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可用

相关文章
|
5月前
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
114 2
|
6月前
|
存储 算法 C++
Windows共享文件:探秘C++实现的B树索引算法奇境
在数字化时代,Windows共享文件的高效管理至关重要。B树算法以其自平衡多路搜索特性,在文件索引与存储优化中表现出色。本文探讨B树在Windows共享文件中的应用,通过C++实现具体代码,展示其构建文件索引、优化数据存储的能力,提升文件检索效率。B树通过减少磁盘I/O操作,确保查询高效,为企业和个人提供流畅的文件共享体验。
|
3月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
86 0
|
4月前
|
存储 机器学习/深度学习 算法
基于 C++ 的局域网访问控制列表(ACL)实现及局域网限制上网软件算法研究
本文探讨局域网限制上网软件中访问控制列表(ACL)的应用,分析其通过规则匹配管理网络资源访问的核心机制。基于C++实现ACL算法原型,展示其灵活性与安全性。文中强调ACL在企业与教育场景下的重要作用,并提出性能优化及结合机器学习等未来研究方向。
102 4
|
5月前
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
146 17
|
4月前
|
机器学习/深度学习 存储 算法
基于 C++ 布隆过滤器算法的局域网上网行为控制:URL 访问过滤的高效实现研究
本文探讨了一种基于布隆过滤器的局域网上网行为控制方法,旨在解决传统黑白名单机制在处理海量URL数据时存储与查询效率低的问题。通过C++实现URL访问过滤功能,实验表明该方法可将内存占用降至传统方案的八分之一,查询速度提升约40%,假阳性率可控。研究为优化企业网络管理提供了新思路,并提出结合机器学习、改进哈希函数及分布式协同等未来优化方向。
92 0
|
6月前
|
存储 监控 算法
基于 C++ 哈希表算法的局域网如何监控电脑技术解析
当代数字化办公与生活环境中,局域网的广泛应用极大地提升了信息交互的效率与便捷性。然而,出于网络安全管理、资源合理分配以及合规性要求等多方面的考量,对局域网内计算机进行有效监控成为一项至关重要的任务。实现局域网内计算机监控,涉及多种数据结构与算法的运用。本文聚焦于 C++ 编程语言中的哈希表算法,深入探讨其在局域网计算机监控场景中的应用,并通过详尽的代码示例进行阐释。
119 4
|
7月前
|
存储 算法 安全
企业员工数据泄露防范策略:基于 C++ 语言的布隆过滤器算法剖析[如何防止员工泄密]
企业运营过程中,防范员工泄密是信息安全领域的核心议题。员工泄密可能致使企业核心数据、商业机密等关键资产的流失,进而给企业造成严重损失。为应对这一挑战,借助恰当的数据结构与算法成为强化信息防护的有效路径。本文专注于 C++ 语言中的布隆过滤器算法,深入探究其在防范员工泄密场景中的应用。
118 8
|
10天前
|
存储 编解码 算法
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
|
12天前
|
传感器 机器学习/深度学习 算法
【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)
【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)