📄 main.c
字号:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "global.h"
#include "md5.h"
#include "rsaref.h"
#include "rsa.h"
#include "des.h"
int Digest_MD5_File(char * FileName,unsigned char *digest)
{
MD5_CTX md5Context;
unsigned char inBuf[100];
int inLen=0;
FILE *fp;
fp = fopen(FileName,"rb");
if (fp == NULL)
{
printf("Open file error !\n");
return -1;
}
MD5Init(&md5Context);
do{
inLen = 0;
inLen = fread(inBuf,1,100,fp);
MD5Update(&md5Context,inBuf,inLen);
}while(feof(fp));
fclose(fp);
MD5Final(digest,&md5Context);
return 0;
}
int Digest_Encode(unsigned char *digestInfo,int *digestInfoLen,
unsigned char *digest,int digestAlgorithm)
{
/* DigestInfo encoding is DIGEST_INFO_A, then 2 or 5 (for MD2/MD5),
then DIGEST_INFO_B, then 16-byte message digest.
*/
static unsigned char DIGEST_INFO_A[] = {
0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7,
0x0d, 0x02
};
int DIGEST_INFO_A_LEN = sizeof (DIGEST_INFO_A);
static unsigned char DIGEST_INFO_B[] = { 0x05, 0x00, 0x04, 0x10 };
int DIGEST_INFO_B_LEN = sizeof (DIGEST_INFO_B);
int DIGEST_INFO_LEN = DIGEST_INFO_A_LEN + 1 + DIGEST_INFO_B_LEN + 16;
memcpy(digestInfo,DIGEST_INFO_A,DIGEST_INFO_A_LEN);
digestInfo[DIGEST_INFO_A_LEN] = (unsigned char)digestAlgorithm;
memcpy(digestInfo+DIGEST_INFO_A_LEN+1,DIGEST_INFO_B,DIGEST_INFO_B_LEN);
memcpy(digestInfo+DIGEST_INFO_A_LEN+1+DIGEST_INFO_B_LEN,digest,16);
*digestInfoLen = DIGEST_INFO_LEN;
return 0;
}
int Sign_MD5_File(char * FileName,R_RSA_PRIVATE_KEY *privateKey,
unsigned char *signature,int *signatureLen)
{
unsigned char digest[16],digestInfo[100];
int digestInfoLen,rv;
if(rv = Digest_MD5_File(FileName,digest))
return rv;
if (rv = Digest_Encode(digestInfo,&digestInfoLen,digest,5))
return rv;
if (rv = RSAPrivateEncrypt
(signature, signatureLen, digestInfo, digestInfoLen, privateKey))
return rv;
return 0;
}
int Generate_Rsa_KeyPair(R_RSA_PUBLIC_KEY *rsaPubKey,R_RSA_PRIVATE_KEY *rsaPriKey)
{
R_RSA_PROTO_KEY rsaProKey;
R_RANDOM_STRUCT randStruct;
int rv,i;
unsigned char randBytes[256];
rsaProKey.bits = 1024;
rsaProKey.useFermat4 = 65537;
for (i=0;i<256;i++)
randBytes[i] = 0xff * rand();
R_RandomInit(&randStruct);
R_RandomUpdate(&randStruct,randBytes,256);
rv = R_GeneratePEMKeys(rsaPubKey,rsaPriKey,&rsaProKey,&randStruct);
R_RandomFinal(&randStruct);
if (rv)
return rv;
else
return 0;
}
int MACGenerate(unsigned char *pKey,int nKeyLen,unsigned char *pInData,int nInLen,unsigned char *pMac)
{
int i,j;
unsigned char pOutBuf[8],pEncData[8];
DES_CBC_CTX descontext;
memset(pOutBuf,0x0,8);//IV = 0
if (nKeyLen != 8)
return -1;
if (nInLen%8)
return -1;
DES_CBCInit(&descontext,pKey,pOutBuf,1);
// DES_CBCUpdate(&descontext,pOutBuf,pInData,8);
for (i=0;i<nInLen/8;i++)
{
for(j=0;j<8;j++)
pEncData[j] = pOutBuf[j] ^ *(pInData + i*8 +j);
DES_CBCUpdate(&descontext,pOutBuf,pEncData,8);
DES_CBCRestart(&descontext);
}
memcpy(pMac,pOutBuf,8);
return 0;
}
void main()
{
DES3_CBC_CTX des3context;
DES_CBC_CTX descontext;
int i;
unsigned char mkey1[] = {0xfc,0x08,0xf2,0x61,0x20,0x67,0x48,0x0c};
unsigned char iv0[] = {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};
unsigned char iv1[] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
unsigned char mkey5[] = {0xC6,0xF1,0x95,0x44,0x6E,0xF2,0x41,0xD1,
0xC6,0xF1,0x95,0x44,0x6E,0xF2,0x41,0xD1,
0xC6,0xF1,0x95,0x44,0x6E,0xF2,0x41,0xD1};
unsigned char key5[] = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
unsigned char key3[] = {0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10,
0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11};
unsigned char key2[] = {0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22};
unsigned char key1[] = {0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11};
unsigned char mk[] = {0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11};
unsigned char mmmk[] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
unsigned char mmk[] = {0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,
0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,
0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31};
unsigned char mkc1[] = {0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11};
unsigned char mkc2[] = {0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22};
unsigned char mkc3[] = {0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,
0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,
0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44};
unsigned char mmk1[] = {0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,
0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44};
unsigned char nmkc1[] = {0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,
0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,
0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa};
unsigned char nmkc2[] = {0xbb,0xbb,0xbb,0xbb,0xbb,0xbb,0xbb,0xbb,
0xbb,0xbb,0xbb,0xbb,0xbb,0xbb,0xbb,0xbb,
0xbb,0xbb,0xbb,0xbb,0xbb,0xbb,0xbb,0xbb};
unsigned char nmkc3[] = {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,
0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,
0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef};
unsigned char nmkc4[] = {0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10,
0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11};
unsigned char mmk2[] = {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,
0xbb,0xbb,0xbb,0xbb,0xbb,0xbb,0xbb,0xbb,
0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa};
unsigned char tmpkey[] = {0x82,0xE1,0x36,0x65,0xb4,0x62,0x4d,0xf5};
unsigned char pan[] = {0x0,0x0,0x24,0x20,0x13,0x78,0x05,0x01};
unsigned char pin[] = {0x06,0x12,0x34,0x56,0xff,0xff,0xff,0xff};
unsigned char tmpbuf1[24];
unsigned char tmpbuf2[24];
unsigned char checkv[24];
unsigned char rv[8];
unsigned char plain128[128];
char macstring1[] = "123456789ABCDEFGHIJKLMNOPQRSTUVWXVZ abcdefghijklmnopqrstuvw结束0123456789ABCDEFGHIJKLMNOPQRSTUVWXVZ abcdefghijklmnopqrstuvw结束0123456789ABCDEFGHIJKLMNOPQRSTUVWXVZ abcdefghijklmnopqrstuvw结束0123456789ABCDEFGHIJKLMNOPQRSTUVWXVZ abcdefghijklmnopqrstuvw结束0123456789ABCDEFGHIJKLMNOPQRSTUVWXVZ abcdefghijklmnopqrstuvw结束0123456789ABCDEFGHIJKLMNOPQRSTUVWXVZ abcdefghijklmnopqrstuvw结束0123456789ABCDEFGHIJKLMNOPQRSTUVWXVZ abcdefghijklmnopqrstuvw结束0123456789ABCDEFGHIJKLMNOPQRSTUVWXVZ abcdefghijklmnopqrstuvw结束";
unsigned char macdata1[512];
unsigned char macdata[] = {0x31,0x31,0x1c,0x39,0x31,0x38,0x32,0x37,
0x33,0x36,0x34,0x35,0x1c,0x1c,0x35,0x38,
0x31,0x34,0x33,0x32,0x37,0x36,0x1c,0x1c,
0x3b,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
0x38,0x39,0x30,0x31,0x32,0x33,0x34,0x35,
0x36,0x3d,0x39,0x39,0x31,0x32,0x31,0x30,
0x30,0x30,0x30,0x3f,0x1c,0x30,0x30,0x30,
0x31,0x32,0x35,0x30,0x30,0x1c,0x39,0x37,
0x38,0x36,0x35,0x33,0x34,0x31,0x32,0x34,
0x38,0x37,0x36,0x39,0x32,0x33,0x1c,0x00};
unsigned char keymac[] = {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef};
unsigned char pad[] = {0x00,0x0,0x0,0x0,0x0,0x0,0x0,0x0};
unsigned char pkey2[] = {0x10,0x14,0x4e,0x8f,0xd6,0xc1,0xea,0x0f};
unsigned char testkey[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
// 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17};
// 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
unsigned char kkk[] = {0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30};
unsigned char ddd[] = {0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,
0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31};
for(i=0;i<8;i++)
mmk[i] = nmkc3[i] ^ nmkc2[i] ^ nmkc1[i];
// memset(plain128,0x1,128);
// memset(testkey,0x2,24);
DES3_CBCInit(&des3context,testkey,pkey2,1);
DES3_CBCUpdate(&des3context,plain128,testkey,16);
for(i=0;i<8;i++)
printf("0x%x ",plain128[i]);
printf("\n");
for(i=0;i<8;i++)
printf("0x%x ",plain128[i+8]);
DES_CBCInit(&descontext,testkey,iv0,0);
DES_CBCUpdate(&descontext,plain128,plain128,16);
printf("hello world!");
DES_CBCInit(&descontext,keymac,keymac,1);
DES_CBCUpdate(&descontext,plain128,testkey,16);
DES_CBCRestart(&descontext);
DES_CBCUpdate(&descontext,nmkc2,mkc2,8);
DES_CBCRestart(&descontext);
DES_CBCUpdate(&descontext,nmkc3,mkc3,8);
memcpy(mmk,nmkc1,8);
memcpy(mmk+8,nmkc2,8);
memcpy(mmk+16,nmkc3,8);
memcpy(macdata1,macstring1,511);
macdata1[511] = 0x0;
if(MACGenerate(key5,8,macdata1,512,pad))
printf("Generate MAC Error!\n");
printf("Generate MAC Ok!\n");
memcpy(macdata,macstring1,64);
memcpy(macdata+64,pad,8);
for(i=0;i<8;i++)
rv[i] = pan[i] ^ pin[i];
DES_CBCInit(&descontext,key1,iv0,1);
DES_CBCUpdate(&descontext,tmpbuf1,key1,8);
DES_CBCInit(&descontext,key1,iv0,0);
DES_CBCUpdate(&descontext,tmpbuf2,tmpbuf1,8);
DES_CBCInit(&descontext,key1,iv0,1);
DES_CBCUpdate(&descontext,tmpbuf1,tmpbuf2,8);
for(i=0;i<8;i++)
checkv[i] = tmpbuf1[i] ^ key1[i];
printf("ok");
return ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -