一篇文章轻松实现RSA加密解密(C++版)

RSA算法的描述

1、选取长度相等的两个大素数p和q,计算其乘积:

 n = pq

然后随机选取加密密钥e,使e和(p–1)(q–1)互素。
最后用欧几里德扩展算法计算解密密钥d,以满足

 ed = 1(mod(p – 1)(q – 1)) 即 d = e–1 mod((p – 1)(q – 1))

e和n是公钥,d是私钥
2、加密公式如下:

  ci = mi^e(mod n)

3、解密时,取每一密文分组 ci 并计算:

mi = ci^d(mod n)
Ci^d =(mi^e)^d = mi^(ed) = mi^[k(p–1)(q–1+1 ]
     = mi mi^[k(p–1)(q–1] = mi *1 = mi 

4、消息也可以用d加密用e解密

#include <iostream>
#include <stdio.h>
#define p 43
#define q 59
#define e 13

int candp(int a,int b,int c);    //数据处理函数,实现幂的取余运算
int fun(int x,int y);			   //公钥e 与 t的互素判断
int main()
{
  int d, m, n, t, c, r;
  int m_t = 0, m_i = 0, m_j = 0;
  int ciphertext[100];             //存放密文的数组
  int proclaimedtext[100];         //存放明文的数组
  n = p * q;
  t = (p - 1) * (q - 1);							  //求n的欧拉数
  d = 1;
  while(((e * d) % t) != 1) d++;//由公钥e求出私钥d

  while(1)
  {
      printf("加密请输入 1  解密请输入 2\n");   //加密或解密选择
      scanf("%d",&r);
      switch(r)
      {
         case 1: 
               printf("请输入密文 m: ");       
               scanf("%d",&m);
               while(m / 100)
               {
                   m_t = m % 100;
                   ciphertext[m_i] = m_t;
                   proclaimedtext[m_i] = candp(m_t, e, n);
                   m /= 100;
                   m_i++;
               }
               ciphertext[m_i] = m;
               proclaimedtext[m_i] = candp(m, e, n);
               printf("明文为: \n");
               for(int i = 0 ; i <= m_i ;i++)
               {
                   printf("%d",proclaimedtext[i]);
               }
               printf("\n");
               break;
        case 2: 
               printf("明文为 c: ");         
               for(int i = 0 ; i <= m_i ;i++)
               {
                   printf("%d",proclaimedtext[i]);
               }
               printf("\n");
               while(m_i--)
               {
                  ciphertext[m_j] = candp(proclaimedtext[m_j], d, n);
                  m_j++;
               }
               printf("密文为: \n");
               for(int i = m_j ; i >= 0 ;i--)
               {
                   printf("%d",ciphertext[i]);
               }
               printf("\n");
               break;
      }
    }
}

int candp(int a, int b, int c)		//数据处理函数,实现幂的取余运算
{ 
   int r = 1;
   while(b-- != 0)
      r = (r * a) % c;
   return r;
}

int fun(int x, int y)			   //公钥e 与t 的互素判断
{
   int t;
   while(y)
   {
      t = x;
      x = y;
      y = t % y;
   }
   return x == 1 ? 0: 1;
}


测试俩组数据
第一组,密文为123456789,得出的明文485 2044 1570 2475 1
通过明文485 2044 1570 2475 1得出密文为123456789
第二组,密文为987456123,得出的明文41 1438 1570 560 1864
通过明文41 1438 1570 560 1864 得出密文为987456123

图片参考:

这里写图片描述

总结:

加密算法通常分为对称性加密算法和非对称性加密算法:
对于对称性加密算法,信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行 加解密了。
非对称算法与之不同,发送双方A,B事先均生成一堆密匙,然后A将自己的公有密匙发送给B,B将自己的公有密匙发送给A,如果A要给B发送消息,则先需要用B的公有密匙进行消息加密,然后发送给B端,此时B端再用自己的私有密匙进行消息解密,B向A发送消息时为同样的道理。
RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。RSA可以实现的功能:
1.机密性:通讯报文采用rsa算法加密,不可读,加密的消息只要收方能够解密
2.防篡改:收方验证消息签名,能够发先任何更改
3.防抵赖:收方收到到的消息签名由发方的私钥运算生成,其他人无法生成对应信息
4.身份认证:收方能够解密信息,发方默认收方身份合法
RSA数字签名机制:用私钥进行签名,用公钥进行验签。认为私钥只有可信任对方一家有,所以保证身份认证和防止抵赖。
RSA加密解密机制:用公钥进行加密,用私钥进行解密。认为只有我的私钥可以解密,所以保证数据机密性不被别人偷窥、篡改。

  • 14
    点赞
  • 112
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值