⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 常用的密码算法
💻 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 + -