?? main.cpp
字號:
//***************************************************************
//
// 這是RSA一個比較完整的版本,包含有生成密鑰和加、解密
// 這個程序經過了Hoohoo的改造,由BC3.1編譯通過
// 雖然可以運行,不過本人覺得還是效率比較低,可能是vlong
// 的問題吧!
// 2003.3.27
//***************************************************************
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <conio.h>
#include "vlong.h"
#include "rsa.h"
char *Key_file="rsavar.txt";
int VL;
//*****************************************************************
//生成密鑰對,包括公鑰e,m和私鑰d,m ,生成的數據放在同一個文件里面
//我現在還沒有考慮密鑰發行的問題
//如果你覺得有必要,就改一下,放到兩個文件里面去吧
//至于level起什么作用,麻煩你看看程序
//*****************************************************************
void MakePrime(long Level)
{
private_key pkey;
char prand[2][128],vername[3],tc;
DWORD i,j,nn, nCount;
vlong *tmp[3];
FILE *fp;
srand((unsigned)time(NULL)); //產生隨機數,當然設個種子先
if(Level == '1') //生成512位
nCount = 32;
else if(Level == '2') //生成1024位
nCount = 64;
else //生成256位
nCount = 16;
//先產生兩個大的隨機數
for(i=0; i<2; i++)
{
for(j=0; j<nCount; j++)
{
tc = (char)(0x41+rand()%0xAF); //這是什么意思
prand[i][j] = tc;
}
prand[i][j]=0;
}
pkey.create(prand[0], prand[1]); //公鑰、私鑰一次搞掂
tmp[1] = &pkey.e; //把他們寫到一個文件里面去
tmp[2] = &pkey.d;
tmp[0] = &pkey.m;
strcpy(vername, "med");
fp = fopen(Key_file, "w");
for(j=0; j<3; j++)
{
nn=tmp[j]->value->n;
fprintf(fp, "[%c]\n%d\n", vername[j], nn);
for(i=0; i<nn; i++)
{
fprintf(fp,"%08lX\n",tmp[j]->value->a[i]);
}
}
fclose(fp); //打完收工!
}
//*************************************************
// 不知道叫什么名字好:)
// 功能就是到密鑰文件中間去找你要的密鑰
// 返回密鑰長度并將文件指針指向數據開始的地方
//*************************************************
int find_string_head(unsigned char c,FILE *fp)
{
unsigned char tc;
int len;
tc=' ';
while(1)
{
while(tc!='[' && !feof(fp)) tc=fgetc(fp);
if(feof(fp)) return 0;
tc=fgetc(fp);
if(tc==c) break;
}
while(tc!=0x0a) tc=fgetc(fp);
fscanf(fp,"%d\n",&len);
return len;
}
//***********************************************
// 從密鑰文件中間讀取指定的密鑰,并返回密鑰長度
// c就是指定的密鑰標志
// 返回的密鑰在nu里面
//***********************************************
int get_vlong(char c,vlong *nu)
{
FILE *fp;
char tc;
int len,i;
DWORD temp[64];
fp=fopen(Key_file,"r");
len=find_string_head(c,fp);
if(len==0) {fclose(fp);return 0;}
for(i=0;i<len;i++)
{
fscanf(fp,"%8lx\n",temp+i);
}
nu->load(temp,len);
return len;
}
//***********************************************
// 這個就是用私鑰編碼
// 不要去看名字,認為是編碼就對了
//***********************************************
vlong _Encrypt(vlong m)
{
private_key pkey;
VL=get_vlong('m',&pkey.m);
get_vlong('d',&pkey.d);
return pkey.decrypt(m);
}
//***********************************************
// 這個是用公鑰編碼
//***********************************************
vlong _Decrypte(vlong c)
{
public_key pkey;
VL=get_vlong('m',&pkey.m);
get_vlong('e',&pkey.e);
return pkey.encrypt(c);
}
//**********************************************
// 下面的東東都是怎么用的演示了
//**********************************************
void Encrypt()
{
int i;
DWORD a[64];
public_key pkey;
VL=get_vlong('m',&pkey.m); //取得密鑰的長度
memset(a,0,VL*sizeof(DWORD));
printf("Please Input CardNo & PCID (Fmt %%X-%%X):\n");
scanf("%lX-%lX",&a[0], &a[1]);
vlong m;
m.load(a, 2); //這樣 m 中就保存有要加密的數
vlong c = _Encrypt(m);
c.store(a, VL);
FILE *fp = fopen("nwnb.txt", "w");
if(fp != NULL)
{
for(i=0;i<VL;i++)
{
fprintf(fp,"%08lX\n",a[i]);
}
fclose(fp);
}
}
void Decrypt()
{
int i;
public_key pkey;
VL=get_vlong('m',&pkey.m);
DWORD a[64];
memset(a,0,VL*sizeof(long));
FILE *fp = fopen("nwnb.txt", "r");
if(fp != NULL)
{
for(i=0;i<VL;i++)
{
fscanf(fp,"%08lX\n",&a[i]);
}
fclose(fp);
}
//加密的數據保存到m中
vlong m;
m.load(a,VL);
//計算加密前的數據,保存在c中
vlong c=_Decrypte(m);
//下面兩句話僅僅是特定的情況,其實長度不應該是2的
memset(a,0,8*sizeof(long));
c.store(a,2);
// a[0], a[1]就是加密前的數據
printf("Decrypt Data:\n");
printf("%08lX-%08lX\n", a[0], a[1]);
}
void Help()
{
printf("Usage: Work P0 準備256位的加解密\n");
printf("Usage: Work P1 準備512位的加解密\n");
printf("Usage: Work P2 準備1024位的加解密\n");
printf("Usage: Work E 加密\n");
printf("Usage: Work D 解密\n");
}
void main(int nArg, char **sArg)
{
vlong num;
int len;
MakePrime('2');
Encrypt();
printf("\nok\n");
Decrypt();
getch();
/*
if(nArg < 2)
{
Help();
return;
}
if(sArg[1][0] == 'P' || sArg[1][0] == 'p')
{
MakePrime(sArg[1][1]);
return;
}
else if(sArg[1][0] == 'E' || sArg[1][0] == 'e')
Encrypt();
else if(sArg[1][0] == 'D' || sArg[1][0] == 'd')
Decrypt();
else
Help();
*/
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -