首页
社区
课程
招聘
角落里找到篇RSA的基础知识灌灌水
发表于: 2005-12-13 20:59 17913

角落里找到篇RSA的基础知识灌灌水

2005-12-13 20:59
17913
今年冬天比较冷,感觉最近论坛也比较冷清,主要缺少热点话题和活跃的牛人。
所以在角落里找了篇RSA文章放上来灌灌水,代码写的比较乱,还望各位指正。

RSA介绍



演示实例

加密代码:

/*-------------------------------------------------------
/*  RSA 1024 演示  
/*  (c) code by kanxue www.pediy.com 2005.9
-------------------------------------------------------*/
/*-----------------------------------------------------------*/
/* 本程序调用了MIRACL 大数运算库                           */
/*-----------------------------------------------------------*/

////////////////////////////////////////////////////////////////////

#include <windows.h>
#include "resource.h"

#include "miracl.h"
#include "mirdef.h"

#pragma comment( lib, "ms32.lib") 

/*-------------------------------------------------------------*/
/* 定义子程序与全局变量、常量                                  */
/*-------------------------------------------------------------*/
HINSTANCE	hInst;
#define MAXINPUTLEN 1200

/*-------------------------------------------------------------*/
/*  函数声明                                                   */
/*-------------------------------------------------------------*/
BOOL    CALLBACK MainDlg   (HWND, UINT, WPARAM, LPARAM) ;
BOOL    crypt( HWND) ;

/*-------------------------------------------------------------*/
/* WinMain - 基于WIN32的程序的入口                            */
/*-------------------------------------------------------------*/

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
	hInst=hInstance;
	DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_MAINDLG), NULL, (DLGPROC)MainDlg,0);
	return 0;
}



/*-------------------------------------------------------------*/
/*  MainDlg - 主对话窗口                                      */
/*-------------------------------------------------------------*/
BOOL CALLBACK MainDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{	

	switch (message)
	{    
	case WM_CLOSE:
		EndDialog(hDlg,0);
		break;
	case WM_COMMAND:
		switch (LOWORD(wParam))
		{ 
		case IDC_OK:
			SetFocus (GetDlgItem(hDlg,IDC_TXT0));
			crypt(hDlg);

			break;


		case IDC_EXIT:
			PostQuitMessage(0);
		}
		break;
	case WM_INITDIALOG:
		SendMessage(hDlg,WM_SETICON,(WPARAM) 1,(LPARAM) LoadIconA(hInst,MAKEINTRESOURCE(IDI_ICON)));
		SendDlgItemMessage(hDlg, IDC_TXT0, EM_LIMITTEXT,128, 0);      //初始化edit控件IDC_TXT0字符长度
		                                                             //要保证szData<=128,这样生成szBuffer才能比n小

		break;
	}
     return 0;
}


BOOL crypt( HWND hWnd) 
{
	int  len;	
	big n,e,c,m;
	miracl *mip=mirsys(100,0);

	TCHAR szData[MAXINPUTLEN]={0};
	TCHAR szBuffer[MAXINPUTLEN]={0};

	len=GetDlgItemText(hWnd, IDC_TXT0, szData, sizeof(szData)/sizeof(TCHAR)+1); 
	if (strlen(szData)==0)
	{
		SetDlgItemText(hWnd, IDC_TXT1, "请输入字符");
		return FALSE;
	}
									
// MIRACL大数运算库运算 
//===================================================================================
// p=0xCA8A8D7BA04B5D799CFCDFAA687F85ED1D988E2DB3DA02383C160F3722EADAFB7967C272AAF8A66A92DF6EEE79C2A9E4ADC9E0E0591000F7F89838E5D94F97B1
// q=0xDB016D3633816DA63EB9ABEA98CAC6735C3CAAEEB9C6B7FE7B207ACD7870471DA51EE7AEBEE772C7D058A1009B2883ED6AB895B102460F0D04F4F7AD7D08A7FD
// n=0xAD45A7FB2FD39557BF690F3E230ECDB52AA90BBFAD7F21AD490C9B432DBB08FF6D900D9B2F50BEA69D9D5FA364FCF537998CF07ECEFA35F83EE3CB60BB5914ABCAFFB114605B6EF3EF2110C2AC5DCBBEB3417AE3D791CBABF32064B39BCD0318E19538FD4DF41B9AB143CDAB57F6AACC3BD6B7EDD12579FDFCB21D15DA2560ED
// d=0x65ECBD2A585E57D9436AF9E850DB881037364325751D9B56DFAD10096631C90EB8EB534C39F342F898F32932F01C5402968F240E5BA23DDD522BA4CF7D437591433501DF9DF98D8BCF2F99A264A20EAFE58AF9845C6FAFEA9BB6BCDF69AC663C1862EA9F771AD43D5B15F72372BB76B141F5539FCCD45C7459D97C1089C3F571
// e=0x11
// 1024 bit RSA
	   	
	mip->IOBASE=16;                                // 16进制模式
	c=mirvar(0);                                   // MIRACL的大数类型
	n=mirvar(0);
	e=mirvar(0);
	m=mirvar(0);

	bytes_to_big(len,szData,m);                    // 将数据转换成大数
	cinstr(n,"AD45A7FB2FD39557BF690F3E230ECDB52AA90BBFAD7F21AD490C9B432DBB08FF6D900D9B2F50BEA69D9D5FA364FCF537998CF07ECEFA35F83EE3CB60BB5914ABCAFFB114605B6EF3EF2110C2AC5DCBBEB3417AE3D791CBABF32064B39BCD0318E19538FD4DF41B9AB143CDAB57F6AACC3BD6B7EDD12579FDFCB21D15DA2560ED");  // 初始化模数n	 
	cinstr(e,"11");                              // 公用密钥e
    powmod(m,e,n,c);                              // 计算c = (m ^ e) mod n
	
	cotstr(c,szBuffer);                            // 将c的16进制串表示写入szBuffer中

	mirkill(c);
	mirkill(n);
	mirkill(e);
	mirkill(m);
	mirexit();
 	SetDlgItemText(hWnd, IDC_TXT1,szBuffer);       // 显示密文的十六进制

	return TRUE;
}


=============================================

解密代码:
/*-------------------------------------------------------
/*  RSA 1024 演示  
/*  (c) code by kanxue www.pediy.com 2005.9
-------------------------------------------------------*/
/*-----------------------------------------------------------*/
/* 本程序调用了MIRACL 大数运算库                              */
////////////////////////////////////////////////////////////////////

#include <windows.h>
#include "resource.h"
 


#include "miracl.h"
#include "mirdef.h"

#pragma comment( lib, "ms32.lib") 



//RSA 计算
BOOL Decrypt( HWND hWnd) 
{
	int  len;	
	big n,d,c,m;
	miracl *mip=mirsys(100,0);

	TCHAR szData[MAXINPUTLEN]={0};
	TCHAR szDecryptText[MAXINPUTLEN]={0};
	TCHAR szBuffer[MAXINPUTLEN]={"0"};

	len=GetDlgItemText(hWnd, IDC_TXT0, szData, sizeof(szData)/sizeof(TCHAR)+1); 
	if (strlen(szData)==0)
	{
		SetDlgItemText(hWnd, IDC_TXT1, "请输入字符");
		return FALSE;
	}

	


// MIRACL大数运算库运算 
//===================================================================================
// p=0xCA8A8D7BA04B5D799CFCDFAA687F85ED1D988E2DB3DA02383C160F3722EADAFB7967C272AAF8A66A92DF6EEE79C2A9E4ADC9E0E0591000F7F89838E5D94F97B1
// q=0xDB016D3633816DA63EB9ABEA98CAC6735C3CAAEEB9C6B7FE7B207ACD7870471DA51EE7AEBEE772C7D058A1009B2883ED6AB895B102460F0D04F4F7AD7D08A7FD
// n=0xAD45A7FB2FD39557BF690F3E230ECDB52AA90BBFAD7F21AD490C9B432DBB08FF6D900D9B2F50BEA69D9D5FA364FCF537998CF07ECEFA35F83EE3CB60BB5914ABCAFFB114605B6EF3EF2110C2AC5DCBBEB3417AE3D791CBABF32064B39BCD0318E19538FD4DF41B9AB143CDAB57F6AACC3BD6B7EDD12579FDFCB21D15DA2560ED
// d=0x65ECBD2A585E57D9436AF9E850DB881037364325751D9B56DFAD10096631C90EB8EB534C39F342F898F32932F01C5402968F240E5BA23DDD522BA4CF7D437591433501DF9DF98D8BCF2F99A264A20EAFE58AF9845C6FAFEA9BB6BCDF69AC663C1862EA9F771AD43D5B15F72372BB76B141F5539FCCD45C7459D97C1089C3F571
// e=0x11
// 1024 bit RSA
	   	
	mip->IOBASE=16;                                // 16进制模式
	c=mirvar(0);                                   // MIRACL的大数类型
	n=mirvar(0);
	d=mirvar(0);
	m=mirvar(0);

	cinstr(c,szData);
	cinstr(n,"AD45A7FB2FD39557BF690F3E230ECDB52AA90BBFAD7F21AD490C9B432DBB08FF6D900D9B2F50BEA69D9D5FA364FCF537998CF07ECEFA35F83EE3CB60BB5914ABCAFFB114605B6EF3EF2110C2AC5DCBBEB3417AE3D791CBABF32064B39BCD0318E19538FD4DF41B9AB143CDAB57F6AACC3BD6B7EDD12579FDFCB21D15DA2560ED");  // 初始化模数n	 
	cinstr(d,"65ECBD2A585E57D9436AF9E850DB881037364325751D9B56DFAD10096631C90EB8EB534C39F342F898F32932F01C5402968F240E5BA23DDD522BA4CF7D437591433501DF9DF98D8BCF2F99A264A20EAFE58AF9845C6FAFEA9BB6BCDF69AC663C1862EA9F771AD43D5B15F72372BB76B141F5539FCCD45C7459D97C1089C3F571");  // 初始化私钥d
	powmod(c,d,n,m);	         	               // 计算m = (c ^ d) mod n
	big_to_bytes(0,m,szDecryptText,0); 

	mirkill(c);
	mirkill(n);
	mirkill(d);
	mirkill(m);
	mirexit();
 	SetDlgItemText(hWnd, IDC_TXT1,szDecryptText);       // 显示

	return TRUE;
}



编译好的实例下载:附件:RSAtest.rar

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
这个还是需要支持啊.
2005-12-13 21:23
0
雪    币: 109
活跃值: (2163)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
已经知道用cinstr,为啥还用什么strhash2byte?
2005-12-13 21:29
0
雪    币: 260
活跃值: (81)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
支持老大!
2005-12-13 21:47
0
雪    币: 44229
活跃值: (19965)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
5
最初由 TeLeMan 发布
已经知道用cinstr,为啥还用什么strhash2byte?


谢谢!
真不知当时脑袋怎么犯晕了
现在代码己修正。
2005-12-13 21:56
0
雪    币: 153
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
帮老大顶
2005-12-13 22:12
0
雪    币: 450
活跃值: (552)
能力值: ( LV9,RANK:690 )
在线值:
发帖
回帖
粉丝
7
顶,支持看雪
2005-12-13 22:26
0
雪    币: 277
活跃值: (312)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
8
老大的,顶!
2005-12-14 16:36
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
我也写了一个用RSA加密文件的小程序。
由于所有源代码都是我自己写的,而且还要加入到某个项目中,
所以就不便公开了:-)
附件:rsa.zip
2005-12-14 20:11
0
雪    币: 1334
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我也来个RSA吧,我这个有点新各位慢慢看吧,
由于有些数学符号问题,我挂个PDF附件附件:rsa.zip
2005-12-14 20:54
0
雪    币: 44229
活跃值: (19965)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
11
最初由 dwing 发布
我也写了一个用RSA加密文件的小程序。
由于所有源代码都是我自己写的,而且还要加入到某个项目中,
所以就不便公开了:-)
附件:rsa.zip


工具不错。

最初由 Ivanov 发布
我也来个RSA吧,我这个有点新各位慢慢看吧,
由于有些数学符号问题,我挂个PDF附件附件:rsa.zip


Ivanov 来篇中文密码学教学就好了
2005-12-14 21:49
0
雪    币: 236
活跃值: (35)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
密码算法!!喜欢现在正在学习中!!
2005-12-14 22:01
0
雪    币: 202
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13

怎么用 MIRACL 生成随机的 p q
2005-12-15 09:40
0
雪    币: 44229
活跃值: (19965)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
14
最初由 snowshow 发布

怎么用 MIRACL 生成随机的 p q


那你得用miracl这个大数运算库自己写个随机生成器了。
一些现成的计算器:
http://www.pediy.com/tools/Cryptography.htm
2005-12-15 21:45
0
雪    币: 202
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15

老大,我知道RSATool之类的工具可以生成  p q
我想程序中生成p q
我找到了个例子用MIRACL 生成素数的,可是太慢了
比tE!的那个慢多了

我找到的例子

void GenPrimes(big a, big b, int BITS)
{
   csprng RNG;
   strong_init(&RNG,1,"a",GetTickCount());
   //Generate Prime 1
   strong_bigdig(&RNG,BITS,10,a);
   if(subdivisible(a,2))
   {
      incr(a,1,a);
   }
   while(!isprime(a))
   {
      incr(a,2,a);
      //cotnum(a,stdout);
   }
   //Generate Prime 2
   strong_bigdig(&RNG,BITS,10,b);
   if(subdivisible(b,2))
   {
      incr(b,1,b);
   }
   while(!isprime(b))
   {
      incr(b,2,b);
   }
}
哪位能帮忙指点一下,提高速度
2005-12-16 01:26
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
16
先顶了再看
2005-12-16 09:29
0
雪    币: 242
活跃值: (163)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
17

收藏了,好好学,顶上去别人也好看!
2005-12-16 11:30
0
雪    币: 389
活跃值: (912)
能力值: ( LV9,RANK:770 )
在线值:
发帖
回帖
粉丝
18
老大,偶编译了一下不知道有没有误.

附件:rsae.rar

附件:rsae.rar
2005-12-26 18:49
0
游客
登录 | 注册 方可回帖
返回
//