?? rsa.cpp
字號(hào):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "vlong.h"
#include "rsa.h"
//生成大奇數(shù)及 e m
void MakePrime(long Level)
{
private_key pkey;
char prand[2][128],vername[5],tc;
DWORD i,j,nn, nCount;
vlong *tmp[4];
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]); //計(jì)算生成兩個(gè)大奇數(shù) p, q
tmp[0] = &pkey.p;
tmp[1] = &pkey.q;
tmp[2] = &pkey.e;
tmp[3] = &pkey.m;
strcpy(vername, "pqem");
fp = fopen("RSAVar.txt", "w");
for(j=0; j<4; j++)
{
nn=tmp[j]->value->n;
fprintf(fp, "[%c]\nLen = %d\n", vername[j], nn);
for(i=0; i<nn; i++)
{
fprintf(fp,"%c[%ld] = 0X%08lX;\n", vername[j],i, tmp[j]->value->a[i]);
}
}
fclose(fp);
}
//以下p,q,e,m可由 本程序的 參數(shù) p0生成,可任意改變
#define VL 8
// p, q 僅在加密程序中用
DWORD p[VL/2] = {0Xb2ab9d39, 0X8e53d98d, 0X77dd8ec1,0X995283d6};
DWORD q[VL/2] = {0Xc7e37a29, 0X7fb7c168, 0Xea61d2a3,0Xcaab6cd8};
// e, m 在加解密程序中都要
DWORD e = 0X00010001;
DWORD m[VL] = {0X1ef45821,0X71a30c63,0Xe3a16b86,0Xce0e1e51
,0X462d92c1,0X4ac42393,0X04749e17,0X7961c756};
//加密
void Encrypt()
{
// 準(zhǔn)備p.q.m.e
private_key pkey; //私匙類,數(shù)據(jù)保密
pkey.p.load(p,VL/2);
pkey.q.load(q,VL/2);
pkey.e = e;
pkey.m.load(m, VL);
DWORD a[VL];
//準(zhǔn)備要加密的數(shù),這里,只對(duì)兩個(gè)DWORD值加密,卡號(hào)和計(jì)算機(jī)標(biāo)識(shí)符
//讀入卡號(hào)和標(biāo)識(shí)符框中的當(dāng)前值
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 中就保存有要加密的數(shù)
//計(jì)算加密后的數(shù)c
vlong c = pkey.decrypt(m);
c.store(a, VL);
//以下只是對(duì) VL == 8的情況的處理
//由于pkey中的成員m,是一小于8個(gè)DWORD值的數(shù),加密后的 c < pkey.m
//所以,a[7]的高位總為0, 以防a[6],a[7]過多的高位為0,對(duì)a[7]變換處理一下
a[7] ^= (a[1]+a[2]+a[3]+a[4]);
a[6] ^= (a[0]+a[5]);
//加密后的結(jié)果就是 a[0]-a[7]
FILE *fp = fopen("nwnb.txt", "w");
if(fp != NULL)
{
fprintf(fp,"%08lX-%08lX-%08lX-%08lX-%08lX-%08lX-%08lX-%08lX\n",
a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
fclose(fp);
}
printf("Encrypt Data:\n");
printf("%08lX-%08lX-%08lX-%08lX-%08lX-%08lX-%08lX-%08lX\n",
a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
}
void Decrypt()
{
//準(zhǔn)備 [m] [e], 解密只用到 m,e
public_key pkey; //公匙類,數(shù)據(jù)公開
pkey.e = e;
pkey.m.load(m, VL);
DWORD a[VL];
//讀入加密后的VL個(gè)DWORD值到a可
memset(a,0,VL*sizeof(long));
FILE *fp = fopen("nwnb.txt", "r");
if(fp != NULL)
{
fscanf(fp,"%08lX-%08lX-%08lX-%08lX-%08lX-%08lX-%08lX-%08lX\n",
&a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7]);
fclose(fp);
}
//還原a[6],a[7]
a[7] ^= (a[1]+a[2]+a[3]+a[4]);
a[6] ^= (a[0]+a[5]);
//加密的數(shù)據(jù)保存到m中
vlong m;
m.load(a,8);
//計(jì)算加密前的數(shù)據(jù),保存在c中
vlong c = pkey.encrypt(m);
memset(a,0,8*sizeof(long));
c.store(a,2);
// a[0], a[1]就是加密前的數(shù)據(jù)
printf("Decrypt Data:\n");
printf("%08lX-%08lX\n", a[0], a[1]);
}
void Help()
{
printf("歡迎訪問亂站 -- http://com.6to23.com/ \n");
printf("By: Seraph Chutium 2001.7.21 \n");
printf("Usage: Work P0 準(zhǔn)備256位的加解密\n");
printf("Usage: Work P1 準(zhǔn)備512位的加解密\n");
printf("Usage: Work P2 準(zhǔn)備1024位的加解密\n");
printf("Usage: Work E 加密\n");
printf("Usage: Work D 解密\n");
}
void main(int nArg, char **sArg)
{
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();
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -