CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

发一个我写的RSA算法的源码!

楼主WZHS1983()2006-04-11 19:58:16 在 C/C++ / C++ 语言 提问

这个源码的是读取D盘下的一个名为123.txt的文件,然后对其中的内容加密.  
  利用的是RSA的加密算法.  
  #include   <iostream>  
  #include   <fstream>  
  #include   <vector>  
  #include   <iomanip>  
  using   namespace   std;  
  /////////==========读取文件内容并用v向量返回其值========///////  
  void   get_v(vector<char>   &v)  
  {  
  //vector<char>   v;  
  ifstream   in("d:\\123.txt");  
  char   CHAR;  
  if(in.bad())  
  {  
  cout<<"Can't   open   the   file!"<<endl;  
   
  }  
  while(!in.eof())  
  {  
  in.get(CHAR);  
  v.push_back(CHAR);  
  }  
   
  }  
  /////////=========把读取的字符生成数字序列==========///////////  
  void   change_chars_into_numbers(vector<char>   v,vector<int>   &v1)  
  {  
  for(int   i=0;i<v.size();i++)  
  v1.push_back(int(v[i]));  
  }  
  //////////======加密解密的函数======/////////  
  void   converted(vector<int>   v,vector<int>   &v1,vector<char>   &v2,int   a,int   n)  
  {  
  int   b,temp,k;  
  for(int   i=0;i<v.size();i++)  
  {  
  b=a;  
  temp=1;  
  k=v[i];  
  while(b!=1)  
  {  
  if(b%2==1)   temp=temp*k%n;  
  b=b/2;  
  k=k*k%n;  
  }  
  k=temp*k%n;  
  v1.push_back(k);  
  v2.push_back(char(k));  
   
  }  
   
  }  
  template   <typename   T>  
  void   display(vector<T>   v)         //////////==========输出生成后的序列===========////////  
  {  
  for(int   i=0;i<v.size();i++)  
  cout<<v[i];  
  cout<<endl;  
  }  
   
  void   main()  
  {  
  int   p,q,m,n,b;  
  vector<int>   s1;  
  vector<int>   s2,s3;  
  vector<char>   s,s4,s5;  
  cout<<"   输入两个素数p和q:"<<endl;     /////=====提示输入两个素数,也可以  
                                                                /////自己开始的时候就定义素数的值====//  
  cin>>p>>q;                                           //====输入两个素数,比如43和59====//  
  m=(p-1)*(q-1);                                   ////////======秘密计算的m==========//////  
  n=p*q;                                                   ///====计算可以公开的n=========//////  
  cout<<"========输入一个整数b========="<<endl;///选取b,如13  
  cin>>b;  
  for(int   a=1;a<m;a++)                     /////======for循环算出a============////  
  {  
  if(a*b%m==1)  
  {  
  cout<<"由(q-1)*(p-1)的值算出a为:"<<a<<endl;  
  break;  
  }  
  a++;  
  }  
   
  get_v(s);///========调用get_v()函数读取文件内容===========//  
  cout<<"===================转换前的字母为==================="<<endl;  
          display(s);       //=====调用display()函数对取得的字符输出=====//////  
  change_chars_into_numbers(s,s1);     ///===把生成的字符序列转化为数字===//  
  cout<<"=================字母转化为数字的序列为==============="<<endl;  
  display(s1);         ///////=========输出转化后的数字序列==========////////  
          cout<<"====================加密后的明文为======================="<<endl;  
          converted(s1,s2,s4,b,n);         /////=====调用converted()函数加密=====///  
  display(s2);     //////=====输出加密后的明文=============//////  
  cout<<"=========解密后还原文件内容为========="<<endl;  
          converted(s2,s3,s5,a,n);/////=====调用converted()函数解密=====///////  
          display(s5);     //////=========调用display()函数输出解密后的内容===/////  
  }  
   
   
  欢迎大家加入CSDN编程爱好者群!号码是:11763385 问题点数:0、回复次数:17Top

1 楼WZHS1983()回复于 2006-04-11 19:59:50 得分 0

欢迎大家指正,我在VC6.0通过.Top

2 楼defyer007(深入浅出)回复于 2006-04-12 00:49:05 得分 0

mark  
  RSA有这么简单吗?Top

3 楼yuanchuang(元创)回复于 2006-04-12 06:55:55 得分 0

留名Top

4 楼DiabloWalkOnTheEarth(我想到个绝妙的昵称,只是地方太小,写不下)回复于 2006-04-12 09:37:54 得分 0

RSA   你怎么也得   512的   N   吧,   这个   32位的算什么啊....  
  Top

5 楼Beover1984(摇滚人生)回复于 2006-04-12 10:03:04 得分 0

楼上的有点儿打击人了,楼主能把自己的代码贴出来让大家参考和指正是很不错的,并不一定要和实际应用什么的联系起来.Top

6 楼SSS520()回复于 2006-04-12 18:50:26 得分 0

Beover1984(摇滚人生)说得对,楼主可能只是给出思路,至于N是多大那是自己使用的时候再根据实际定义.Top

7 楼WZHS1983()回复于 2006-04-12 19:18:23 得分 0

这是我写的一个简单的RSA程序,  
  至于可靠性可能不是很大,毕竟我们的CPU  
  不是很强,不   可能让素数的位数达到200位以上.  
  如果要加强可靠性就要加大素数的位数.Top

8 楼babyQ(restarting)回复于 2006-11-21 09:54:47 得分 0

MARKTop

9 楼taodm((不能收CSDN社区短信息,请莫浪费精力))回复于 2006-11-21 10:06:23 得分 0

写个长整型数吧,继续练练手。Top

10 楼jianshi051(看到我就给我一点分吧>_<~)回复于 2006-11-21 10:10:47 得分 0

楼主的共享精神可佳~  
   
  有空慢慢看~Top

11 楼C20062222()回复于 2006-11-21 11:12:56 得分 0

原理是实现了,但没有使用价值,  
  大数处理是必须实现的,或者借用现成的,都可以Top

12 楼chai2010(C++/Qt...)回复于 2006-11-21 14:43:01 得分 0

原理差不多了,  
  不过sqrt(2^32)内也就6000多个素数,  
  因式分解n太容易了Top

13 楼chai2010(C++/Qt...)回复于 2006-11-21 14:58:54 得分 0

int   p,   q,   n;  
  n   =   p*q;     //   这里可能会溢出  
  Top

14 楼laiwusheng(风清扬)回复于 2006-11-21 16:11:43 得分 0

MARKTop

15 楼LeadWorld(夕霞孤雁)回复于 2006-11-22 09:51:02 得分 0

markTop

16 楼gapwind()回复于 2006-11-23 14:33:11 得分 0

markTop

17 楼meric(空藏书千册而无一能读,无它,书非借尔.)回复于 2006-11-23 14:38:53 得分 0

mark  
  再贴个椭圆曲线的就好了,这个还没见过Top

相关问题

关键词

得分解答快速导航

  • 帖主:WZHS1983

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo