www.pudn.com > CryptoAlgorithm.rar > main.c


#include  
#include  
#include  
 
#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