📄 keygen.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 + -