?? rsa.c
字號:
/*-------------------------------------------------------
/* 《加密與解密》 第6章 加密算法
/* RSA算法應用
/* (c) www.PEDIY.com by 段鋼 2002.12
-------------------------------------------------------*/
/*-----------------------------------------------------------*/
/* 本程序調用了MIRACL v4.74 大數運算庫,編譯前請參考MIRACL目 */
/* 錄里的說明文件MSVISUAL.TXT安裝 MIRACL 。 */
/* MIRACL官方主頁:http://indigo.ie/~mscott/ */
/* 在實際應用中,建議模數至少為512位,并與SHA、MD5等算法結合 */
/* 起來。 */
/*-----------------------------------------------------------*/
////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <windows.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_OK:
SetFocus (GetDlgItem(hDlg,IDC_TXT1));
if(GenRegCode(hDlg)) // GenRegCode(hDlg)為序列號計算子程序
{
MessageBoxA (NULL, TEXT ("注冊成功!!"), TEXT ("恭喜!"), 0) ;
}
else
{
MessageBoxA (NULL, TEXT ("注冊失敗!!"), TEXT ("錯誤!"), 0) ;
}
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))); // 顯示圖標
break;
}
return 0;
}
/*-------------------------------------------------------------*/
/* GenRegCode - RSA算法計算主函數 */
/*-------------------------------------------------------------*/
BOOL GenRegCode( HWND hWnd)
{
int i;
big n,e,c,m; // 定義MIRACL的大數類型
miracl *mip=mirsys(100,0);
TCHAR szName[MAXINPUTLEN]= {0};
TCHAR szSerial[MAXINPUTLEN]= {0};
TCHAR szBuffer[MAXINPUTLEN]= {0}; // 初始化0很重要,否則big_to_bytes(0,C,&szBuffer,0)函數得到結果可能不正確
GetDlgItemText(hWnd, IDC_TXT0, szName, sizeof(szName)/sizeof(TCHAR)+1); // 取姓名
if (strlen(szName)==0)
{
return FALSE;
}
GetDlgItemText(hWnd, IDC_TXT1, szSerial, sizeof(szName)/sizeof(TCHAR)+1); // 取序列號
for(i=0;szSerial[i]!=0;i++) // 檢查輸入的序列號是否為16進制數,為cinstr(M,szSerial)使用做準備
{
if(isxdigit(szSerial[i])==0)
return FALSE;
}
// MIRACL大數運算庫運算
//===================================================================================
// p=C75CB54BEDFA30AB
// q=A554665CC62120D3
// n=80C07AFC9D25404D6555B9ACF3567CF1
// d=651A40B9739117EF505DBC33EB8F442D
// e=10001
// 128 bit
mip->IOBASE=16; // 設定16進制模式
n=mirvar(0); // 初始化變量
e=mirvar(0);
m=mirvar(0); // m 放明文:注冊碼
c=mirvar(0); // c 放密文
cinstr(m,szSerial); // 將輸入的序列號轉換成大數 ,這里szSerial
cinstr(n,"80C07AFC9D25404D6555B9ACF3567CF1"); // 初始化模數n
cinstr(e,"10001"); // 初始化公鑰e
if(compare(m,n) ==-1) // m < n ,才能對消息m加密
{
powmod(m,e,n,c); // 計算明文 c= m ^ e mod n
big_to_bytes(0,c,&szBuffer,0); // 將 c 從大數轉換成字節數組
mirkill(n);
mirkill(e);
mirkill(m);
mirkill(c);
mirexit();
if(lstrcmp(szName, szBuffer)!=0) // 比較姓名與序列號加密后數據的是否相等?
{
return FALSE;
}
else
{
return TRUE;
}
}
else
{
return FALSE;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -