⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keygen.c

📁 ELGmal可视化程序
💻 C
字号:
/*-------------------------------------------------------
/*  《加密与解密》 第6章 加密算法   
/*   ElGamal算法,签名算法在序列保护中的应用
/*  (c) www.PEDIY.com  by 段钢 2002.12
-------------------------------------------------------*/
/*-----------------------------------------------------------*/
/* 本程序调用了MIRACL v4.74 大数运算库,编译前请参考MIRACL目 */
/* 录里的说明文件MSVISUAL.TXT安装 MIRACL 。                  */
/* 各命令用法参考MIRACL目录里的MANUAL.DOC                    */
/* MIRACL官方主页:http://indigo.ie/~mscott/                 */
/*-----------------------------------------------------------*/

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

#include <stdio.h>
#include <windows.h>
#include "md5c.c"
#include "global.h"
#include <miracl.h>
#include "resource.h"

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

/*-------------------------------------------------------------*/
/*  函数声明                                                   */
/*-------------------------------------------------------------*/
BOOL    CALLBACK MainDlg   (HWND, UINT, WPARAM, LPARAM) ;
BOOL    CALLBACK AboutDlgProc (HWND, UINT, WPARAM, LPARAM) ;
BOOL    GenRegCode( 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;
}

/*-------------------------------------------------------------*/
/* AboutDlgProc - 关于窗口                                    */
/*-------------------------------------------------------------*/

BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message, 
                            WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
		case  WM_LBUTTONDOWN:
			PostMessage(hDlg, WM_NCLBUTTONDOWN, HTCAPTION, 0);
			return TRUE ;
        
		case WM_COMMAND :
			switch (LOWORD (wParam))  		            
			{
				case IDOK :
				case IDCANCEL :
				EndDialog (hDlg, 0) ;
				return TRUE ;
			}
			 break ;
	 }
     return FALSE ;
}


/*-------------------------------------------------------------*/
/*  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_TXT0:			
			GenRegCode(hDlg);                           
			break;

		case IDC_ABOUT :
		case IDM_HELP_ABOUT :
			DialogBox (hInst, MAKEINTRESOURCE (IDD_ABOUT), hDlg, AboutDlgProc) ;
			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,50, 0);   
		                                                             

		break;
	}
     return 0;
}


/*-------------------------------------------------------------*/
/* GenRegCode - 注册算法主函数                                */
/*-------------------------------------------------------------*/
BOOL GenRegCode( HWND hWnd) 
{
	MD5_CTX context;
	int i,dtLength;
	big M,p,y,a,b,x,temp;
	miracl *mip=mirsys(100,0);

	TCHAR szName[MAXINPUTLEN]={0};
	TCHAR szHash[MAXINPUTLEN]={0};
	TCHAR szSerial[33]="92AFA3B6E8889333"; // 因为k=1,所以直接给Serial1赋值

	dtLength=GetDlgItemText(hWnd, IDC_TXT0, szName, sizeof(szName)/sizeof(TCHAR)+1);  //取用户名
	if (strlen(szName)==0)//检查是否输入了用户名
	{
		return FALSE;
	}
	MD5Init(&context);//调用MD5运行库
	MD5Update(&context, szName, dtLength);
	MD5Final(szHash, &context);//szHash中就是用户名的MD5散列值


// MIRACL大数运算库运算 
//===================================================================================	
	mip->IOBASE=16;
	M=mirvar(0);
	p=mirvar(0);
	y=mirvar(0);
	x=mirvar(0);
	a=mirvar(0);
	b=mirvar(0);
	temp=mirvar(0);		

	bytes_to_big(16,&szHash,M);
	cinstr(temp,"0D06FB1D728E01403"); 
    power(M,3,temp,M);  // M = m ^ 3 mod p  ;缩小szHash位数
	// MANUAL.DOC 文档如下定义:
 	// Function: void power(x,n,z,w)
	// long n;
	// big x,z,w;
   	// Two big numbers x and z, and an integer n. On exit w=xn . If w and z are distinct, then w=x^n mod z
	
	//上面的计算过程为:M = md5hash^3 mod (D06FB1D728E01403)   

    cinstr(p,"0AE6F8E3B6399D3A3");
	cinstr(x,"081BC15BBB48350D3");
	cinstr(y,"02E646151C7E5A00F");
	cinstr(a,"092AFA3B6E8889333");

	// 下面计算b
	// 随机数k取1
	// 因为b(签名)满足: M = ( xa + kb )mod(p-1)

	decr(p,1,p);     //  p = p-1
	mad(a,x,a,p,p,temp);  // temp=xa mod p

	// 根据模运算的性质“和的模 = 模的和再求模”,有关系式:
	// M 
	// = (xa + b) mod p
	// = ((xa mod p) + (b mod p)) mod p
	// = (temp +(b mod p)) mod p
	// 即M = (temp +(b mod p)) mod p

	// 所以如果M > temp,则 M = temp + b,即b = M - temp
	// (实际上b可以取很多个值,但最小的那个值就是M-temp)
	// M < temp时,应当有M + p = (temp + b),即b = M + p - temp = M -(temp -p)

	dtLength=compare(M,temp);
	// 如果M>temp : b=M-temp
	// 如果M<temp : b=M-(temp-p)
	if (dtLength<0){
		subtract(temp,p,temp);
		}
	subtract(M,temp,b);  

	big_to_bytes(0,b,&szName,0);// 将大数转换成字节数放到szName字符数组里

	for(i=0; i < 8; i++)//将szName[]数组里字符的转换成16进制放到szSerial[16]起始的数组里
	{
		wsprintf(&szSerial[i*2+16], "%02X", *(byte*)(szName+i)); // 最后szSerial[]=ab
	}
	SetDlgItemText(hWnd, IDC_TXT1, szSerial);

	mirkill(M);
	mirkill(p);
	mirkill(y);
	mirkill(x);
	mirkill(a);
    mirkill(b);
	mirkill(temp);
	mirexit();	

return TRUE;		
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -