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