CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  基础类

求RSA的C++简明实例。

楼主knf(CTO-首席打字员)2001-12-09 23:13:43 在 C++ Builder / 基础类 提问

看了很多RSA的例子,总是要么不明不白,要么又很多c文件和头文件,有没有简明一点的实例阿。  
  我们可以假设公钥E,私钥d,2个大数p,q,摸数n都是已知的,怎么实现加密和解密? 问题点数:100、回复次数:6Top

1 楼zzzsssccc(今天正为明天后悔)回复于 2001-12-10 09:35:30 得分 0

什么是RSATop

2 楼bugn(unknown& whoami)回复于 2001-12-10 09:48:56 得分 20

肯定要用第三方库的   :)  
   
  加密   coded_text   =   message_text^E   mod   n  
  解密   message_text   =   coded_text^d   mod   n  
   
  简单算术?Top

3 楼knf(CTO-首席打字员)回复于 2001-12-10 23:16:51 得分 0

不会吧?  
  加密用公钥,解密用私钥?Top

4 楼knf(CTO-首席打字员)回复于 2001-12-11 01:14:00 得分 0

下面这个例子仅供学习,没有别的意思,里面关于RSA算法的有些东西好象不太明白什么意思,哪位大虾给注释一下,最好把解密部分也添上:)  
   
  Windows优化大师v3.0-v3.4的注册机源代码    
   
  时空幻影于2001年3月15日  
   
  我在《Windows优化大师》这个软件开始使用某种加密算法时就在破解时有点摸不着头脑,不知道这个算法是RSA加密算法。自从几个月前拜读了《论坛精华Ⅱ》中的《Windows优化大师v2.9+的注册码加密算法》一文后我就开始按照该文所讲的方法编写注册机,从此噩梦开始......  
   
  我先把n=0x0000000069AAA0E3进行因子分解求出p=0x80BD和q=0xD21F,于是就求得f=0x0000000069A53372,然后又按照第四条规则很辛苦地编程求出d=0x000000003E0877FD。至此我想应该可以顺利地编写出注册机了吧,然而作出来的注册机不但算出来的注册码不对,而且用加密算法算出来的结果不能用解密算法还原成原来输入的两个数值。这个问题一直弄得我头大,直到最近我从别人那弄的一个注册申请码和正确的注册码,我才算出解密密钥d不是0x000000003E0877FD,而是0x00000000002C86F9,于是我终于写成了注册机。  
   
  源代码如下:(C++   Builder   5.0编译通过)  
   
  //---------------------------------------------------------------------------  
   
  #include   <vcl.h>  
  #pragma   hdrstop  
   
  #include   "Unit1.h"  
  //---------------------------------------------------------------------------  
  #pragma   package(smart_init)  
  #pragma   resource   "*.dfm"  
  TForm1   *Form1;  
  //---------------------------------------------------------------------------  
  __fastcall   TForm1::TForm1(TComponent*   Owner)  
  :   TForm(Owner)  
  {  
  }  
  //---------------------------------------------------------------------------  
   
  unsigned   __int64   __fastcall   Encrypt_Decrypt(unsigned   __int64   m,unsigned   __int64   e,unsigned   __int64   n)  
  {  
  unsigned   __int64   a,b,c;  
   
  a=m;  
  b=e;  
  c=1;  
   
  while(b)  
  {  
  if   ((b%2)==0)  
  {  
  b=b/2;  
  a=(a*a)%n;  
  }  
  else  
  {  
  b=b-1;  
  c=(c*a)%n;  
  }  
  }  
  return   (c);  
  }  
  //---------------------------------------------------------------------------  
   
   
  void   __fastcall   TForm1::Button2Click(TObject   *Sender)  
  {  
  Application->MessageBox("时空幻影于2001年3月12日,如有什么问题请E-MAIL:shikonghuanying@sina.com","关于",MB_OK);  
  }  
  //---------------------------------------------------------------------------  
   
   
  void   __fastcall   TForm1::Button1Click(TObject   *Sender)  
  {  
  unsigned   __int32   s[4]={0x20756f59,0x20657261,0x20676962,0x2e676970};//"You   are   big   pig."的内存表示  
  unsigned   __int32   t1=0,t2=0,esi=0x9e3779b9,temp;  
  unsigned   __int64   n=0x69aaa0e3,d=0x002c86f9,m1,m2,n1,n2,t;  
  int   i,j;  
  AnsiString   Buffer=Edit1->Text;  
  if   (Edit1->Text.IsEmpty())  
  {  
  Application->MessageBox("请输入注册申请码!","提示",MB_OK);  
  return;  
  }  
  Buffer=Buffer+"1234567";  
  Buffer.SetLength(8);  
  i=4;  
  while   (i>0)  
  {  
  t1=0x100*t1+(StrToInt(Buffer[i])+0x30);  
  i--;  
  }  
  i=8;  
  while   (i>4)  
  {  
  t2=0x100*t2+(StrToInt(Buffer[i])+0x30);  
  i--;  
  }  
  for   (j=0;j<32;j++)  
  {  
  temp=t2<<4;  
  t1=t1+temp+(s[0]^t2);  
  temp=t2>>5;  
  t1=t1+(temp^esi)+s[1];  
  temp=t1<<4;  
  t2=t2+temp+(s[2]^t1);  
  temp=t1>>5;  
  t2=t2+(temp^esi)+s[3];  
  esi=esi+0x9e3779b9;  
  }  
  t1=t1+2;  
  i=0;  
  j=0;  
  temp=t1;  
  if   (t1>0x3fffffff)  
  {  
  temp=t1&0x0fffffff;  
  s1:  
  ;  
  if   (temp<=0x3fffffff)  
  {  
  j=1;  
  while   (j<=4)  
  {  
  t=j*0x100000000+(temp<<2);  
  if   ((t>>2)%0x100000000==t1)   goto   s2;  
  else   j++;  
  }  
  i=i+0x10000000;  
  temp=temp+0x10000000;  
  if   (i<0x40000000)   goto   s1;  
  }  
  }  
  s2:  
  ;  
  m1=temp;  
  m2=(0x50|j)+2;  
  n1=Encrypt_Decrypt(m1,d,n);  
  n2=Encrypt_Decrypt(m2,d,n);  
  Edit2->Text=IntToHex((__int64)n1,8);  
  Edit3->Text=IntToHex((__int64)n2,8);  
  }  
  Top

5 楼bugn(unknown& whoami)回复于 2001-12-11 12:28:41 得分 80

>   不会吧?  
  >   加密用公钥,解密用私钥?    
  这才叫公开密钥技术;  
   
  你的注册机为什么要用私钥是因为注册机本来是拥有私钥的人用的.  
  发行的程序里只有公钥,当然用公钥来检查你的注册码对不对了.  
  这是利用RSA的一个对称性的:  
   
  coded_text   =   origin_text^d   mod   n   (this   is   done   by   the   software   publisher)  
  origin_text   =   coded_text^E   mod   n   (this   is   done   in   the   released   public   software)  
   
  这个反过来的过程一般叫做数字签名,因为只有拥有私钥的人才做得出来;跟加密过程不一样  
  Top

6 楼knf(CTO-首席打字员)回复于 2001-12-12 09:04:12 得分 0

哦!!原来如此!!!Top

相关问题

  • C#实例使用---求救!~~
  • 求visual c++mfc编程实例的随书实例源码
  • 《C++ Builder 5编程实例与技巧》
  • ······麻烦推荐C#实例书籍·······
  • 哪位有C#开发的COM实例
  • C++Builder多线程编程实例
  • 求助:《VISUAL C++MFC编程实例》中的实例哪里有下的?
  • Visual C++中使用OLE DB读写SQL Server简明指南
  • 谁有机工出版的<<VISUAL C++MFC编程实例>>和<<VISUAL C++MFC编程实例>>上的源代码?
  • 300分求《Visual C++ MFC编程实例》和《Visual C++ MFC扩展编程实例》的源码

关键词

  • 解密
  • 注册
  • rsa
  • 加密算法
  • 算法
  • 优化
  • 加密
  • 注册机
  • tform
  • 注册码

得分解答快速导航

  • 帖主:knf
  • bugn
  • bugn

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

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