encryption.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include <aes.h>
  2. #include <md5.h>
  3. #include <string.h>
  4. #include <stdint.h>
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. //static uint64_t seq=1;
  8. static uint8_t zero_iv[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0};//this prog use zero iv,you should make sure first block of data contains a random/nonce data
  9. static uint8_t g_key[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, 0,0,0,0};
  10. static uint8_t buf[65535+100];
  11. static const int disable_all=0;
  12. static const int disable_aes=0;
  13. int my_encrypt(uint8_t *data,uint8_t *output,int &len,uint8_t * key)
  14. {
  15. if(disable_all)
  16. {
  17. memcpy(output,data,len);
  18. return 0;
  19. }
  20. int ori_len=len;
  21. len=len+16;//md5
  22. len+=2;//length
  23. if(len%16!=0)
  24. {
  25. len= (len/16)*16+16;
  26. }
  27. if(len>65535) return -1;
  28. data[len-16-2]=(uint16_t(ori_len))>>8;
  29. data[len-16-1]=((uint16_t(ori_len))<<8)>>8;
  30. //printf("%d %d\n",data[len-16-2],data[len-16-1]);
  31. md5(data,len-16,data+len-16);
  32. //memcpy(buf,data,len); //not thread safe
  33. if(disable_aes)
  34. {
  35. memcpy(output,data,len);
  36. }
  37. else
  38. {
  39. AES_CBC_encrypt_buffer((unsigned char *)output,(unsigned char *)data,len,(unsigned char *)key,(unsigned char *)zero_iv);
  40. //it doesnt allow over lap
  41. }
  42. return 0;
  43. }
  44. int my_decrypt(uint8_t *data,uint8_t *output,int &len,uint8_t * key)
  45. {
  46. if(disable_all)
  47. {
  48. memcpy(output,data,len);
  49. return 0;
  50. }
  51. uint8_t md5_res[16];
  52. if(len>65535) return -1;
  53. if(len<32) return -1;
  54. if(len%16 !=0) return -1;
  55. if(disable_aes)
  56. {
  57. memcpy(output,data,len);
  58. }
  59. else
  60. {
  61. AES_CBC_decrypt_buffer((unsigned char *)output,(unsigned char *)data,len,(unsigned char *)key,(unsigned char *)zero_iv);
  62. }
  63. //printf("%d %d\n",data[len-16-2],data[len-16-1]);
  64. //printf("<<%d>>",len);
  65. md5(output,len-16,md5_res);
  66. if(memcmp(output+len-16,md5_res,16)!=0)
  67. {
  68. return -2;
  69. }
  70. len=output[len-16-2]*256u+output[len-16-1];
  71. return 0;
  72. }