找回密码
 欢迎注册
查看: 11468|回复: 2

[原创] 编解码算法工具bse.exe

[复制链接]
发表于 2017-1-18 20:29:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
本帖最后由 happysxyf 于 2017-1-18 20:35 编辑

bse.zip (17.09 KB, 下载次数: 8)
强悍的可见流编解码工具bse.exe,比certutil快3倍的编码速度。支持9种编码格式,支持6种解码格式。由于汇编不是太熟,用C语言实现的只能每秒编码600M到1300M,我觉得已经够用了,因为机械硬盘每秒才读写50M,根本写不过来。
使用:
     bse [-e|-e#|-e+|-eb|-ex|...-d|-d#|-d+|-db|-dx|...] [输入文件] [输出文件]
__________________________________________________________________________________
选项:
    -h    帮助信息
    -e    编码为 BASE64
    -e#   编码为 BASE64#
    -e+   编码为 BASE64+
    -eb   编码为 BIN码
    -ex   编码为 HEX码
    -e92  编码为 BASE92
    -d    BASE64 解码
    -d#   BASE64#解码
    -d+   BASE64+解码
    -db   BIN码  解码
    -dx   HEX码  解码
    -d92  BASE92 解码
    -m    制作标准 BASE64 批处理脚本
    -mp   制作压缩 BASE64 加权批处理脚本
    -md   制作兼容 BASE64 过滤论坛特殊词脚本
__________________________________________________________________________________
示例:
     bse -e a.jpg a.base64         //将图片a.jpg编码为 BASE64
     bse -e# a.jpg a.base64#       //将图片a.jpg编码为 BASE64#
     bse -e92 a.jpg a.base92       //将图片a.jpg编码为 BASE92
     bse -d a.base64 a.jpg         //将a.base64 解编码为 a.jpg
     bse -d# a.base64# a.jpg       //将a.base64#解编码为 a.jpg
     bse -d92 a.base92 a.jpg       //将a.base92 解编码为 a.jpg
     bse -m a.jpg a.bat            //将图片编码为“标准BASE64编码”批处理
     bse -mp a.jpg a.bat           //将图片编码为“压缩BASE64加权”批处理
     bse -md a.jpg a.bat           //将图片编码为“过滤论坛特殊词”批处理
    ...
__________________________________________________________________________________
英译:

BSE.EXE
>>>-------------------------------------------------------------------------------
COPYRIGHT@2016~2018 BY HAPPY,VERSION 1.1

bse [-e|-e#|-e+|-eb|-ex|-e92|
     -d|-d#|-d+|-dx|-db|-d92|
     -m|-mp|-md             ] [infile] [outfile]
----------------------------------------------------------------------------------
    -h    Show help information
    -e    Encode file to BASE64 code
    -e#   Encode file to BASE64# code
    -e+   Encode file to BASE64+ code
    -eb   Encode file to BIN code
    -ex   Encode file to HEX code
    -e92  Encode file to BASE92 code
    -d    Decode a file from BASE64 code
    -d#   Decode a file from BASE64# code
    -d+   Decode a file from BASE64+ code
    -db   Decode a file from BIN code
    -dx   Decode a file from HEX code
    -d92  Decode a file from BASE92 code
    -m    Make a ordinary BASE64 batch
    -mp   Make a press BASE64 batch
    -md   Make a discuz BASE64 batch
----------------------------------------------------------------------------------


bse.c源码(采取POS开源协议,即发布的每个作品都开源):
  1. /*
  2.         COPYRIGHT@2016~2018 BY HAPPY
  3.         BSE.EXE
  4.         VERSION 1.1
  5. */
  6. #include   <stdio.h>
  7. #include  <stdlib.h>
  8. #include  <string.h>

  9. //编码限制(单位:M)
  10. #define FILE_MAX_SIZE 128
  11. //BASE64加权压缩行长(单位:字节)
  12. #define PRESS_LINE_SIZE 1000
  13. //设置过滤敏感词数目
  14. #define SENSITIVE_NUM 3
  15. //添加敏感词条目(请用小写定义),过滤时不区分大小写。
  16. static const char* SENSITIVE_WORDS[]={"**", "**", "taidu", "zangdu", "qingzhen", "fenlie", "dfj", "hsd", "xjzz"};

  17. //BSE编码表
  18. static const unsigned char BASE64_CODE[64]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  19. static const unsigned char BASE92_CODE[256]={33,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  20. static const char  HEX_CODE[16]="0123456789ABCDEF";
  21. static const char* BIN_CODE[16]={"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
  22. static const char  BASE64_PRESS_CODE[10]="@-#$_}{][A";
  23. //BSE解码表
  24. static const unsigned char BASE64_DECO[80]={0x3E,0x40,0x40,0x40,0x3F,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x40,0x40,0x40,0x40,0x40,0x40,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33};
  25. static const unsigned char BASE92_DECO[256]={255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,255,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,255,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255};
  26. static const unsigned char HEX_DECO[23]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F};

  27. //全局变量
  28. int i=0, j=0, FLAG=0, fsize=0;

  29. //敏感词过滤
  30. int Check_SensitiveWords(unsigned char* Str, int position)
  31. {
  32.         int  n, SN, MARK, L;
  33.         for(SN=0; SN<32; SN++){
  34.                 if(SN>=SENSITIVE_NUM){return 0;}
  35.                 L=strlen(SENSITIVE_WORDS[SN]), MARK=1;
  36.                 for(n=0; n<L; n++){
  37.                         if(Str[position+n]!=SENSITIVE_WORDS[SN][n] && Str[position+n]+32!=SENSITIVE_WORDS[SN][n]){
  38.                                 MARK=0;break;
  39.                         }
  40.                 }
  41.                 if(MARK==1){return 1;}
  42.         }                               
  43.         return 0;
  44. }

  45. /***************编码函数群***************/
  46. //BASE64加权压缩
  47. int Press_Base64(unsigned char* Str, int L, FILE* stream, char* file)
  48. {
  49.         int k, N, M, MARK;

  50.         char* fname;
  51.         char* extension_name;
  52.         char* press=(char*)calloc(strlen(Str)+3, sizeof(char));
  53.         for(k=0,i=0,j=0; j<L ;j++){
  54.                 if(Str[j]=='A' && j<L-1 && FLAG!=22){
  55.                         i++;
  56.                 }else{
  57.                         if(i!=0){
  58.                                 while(i>512){
  59.                                         i-=512;
  60.                                         press[k++]=BASE64_PRESS_CODE[0];
  61.                                 }
  62.                                 M=512;
  63.                                 for(N=0; N<10; N++){
  64.                                         if(i>=M){       
  65.                                                 press[k++]=BASE64_PRESS_CODE[N];
  66.                                                 i-=M;
  67.                                         }
  68.                                         M>>=1;
  69.                                 }
  70.                         }
  71.                         if(Str[j]=='\0'){break;}else{press[k++]=Str[j];}
  72.                         if(Check_SensitiveWords(Str, j)){
  73.                                 if(FLAG==22){press[k++]=' ';}else{press[k++]='.';}
  74.                         }
  75.                 }
  76.         }
  77.         fname=strtok(file, ".");
  78.         extension_name=strtok(NULL, ".");
  79.         if(FLAG==22){
  80.                 //生成论坛专用码
  81.                 int N, MARK=j/64+1;
  82.                 fprintf(stream
  83.                 ,         "[url=home.php?mod=space&uid=2931]@echo[/url] off\r\n"
  84.                         "::*********BASE64 过滤解码器*********\r\n"
  85.                         "certutil -decode "%%~f0" %s.%s&pause&exit /b\r\n"
  86.                         "::***********************************\r\n"
  87.                 ,
  88.                         fname,
  89.                         extension_name
  90.                 );
  91.                 fprintf(stream, "\r\n-----BEGIN BASE64-----\r\n");
  92.                 fwrite(press, k, 1, stream);
  93.                 fprintf(stream, "\r\n-----END BASE64-----\r\n");
  94.                 return 0;

  95.         }
  96.         //生成加权压缩码
  97.         MARK=(int)(k/PRESS_LINE_SIZE+1);
  98.         fprintf(stream
  99.                 ,         "@echo off\r\n"
  100.                         "setlocal enabledelayedexpansion\r\n\r\n"
  101.                         "::*********BASE64 加权解码器*********\r\n"
  102.                         "set $=set [#]&CALL :BASE64_PRESS&set [$]=A&((for %%%%Z in ([,],{,},_,$,#,-,@) do (set [$]=![$]!![$]!&for %%%%S in (![$]!) do (for /l %%%%i in (1,1,%d) do (!$!%%%%i=![#]%%%%i:%%%%Z=%%%%S!))))&for /l %%%%i in (1,1,%d) do (set/p=![#]%%%%i:.=!<NUL))>%s.BSEP&certutil -decode %s.BSEP %s.%s&pause&exit /b\r\n"
  103.                         "::***********************************\r\n\r\n"
  104.                         ":BASE64_PRESS\r\n"
  105.                 ,
  106.                         MARK,
  107.                         MARK,
  108.                         fname,
  109.                         fname,
  110.                         fname,
  111.                         extension_name
  112.         );
  113.         for(N=1; N<=MARK; N++){
  114.                 fprintf(stream, "\r\n!$!%d=", N);
  115.                 if(N!=MARK){
  116.                         fwrite(press,   PRESS_LINE_SIZE, 1, stream);
  117.                         press+=PRESS_LINE_SIZE;
  118.                 }else{
  119.                         fwrite(press, k%PRESS_LINE_SIZE, 1, stream);

  120.                 }

  121.         }
  122.         fprintf(stream, "\r\ngoto :EOF");
  123.         return 0;
  124. }
  125. //BASE64编码
  126. int EncodeBase64(FILE* fp, FILE* stream, char* file)
  127. {
  128.         unsigned char* RAMread=(unsigned char*)calloc(    fsize+3, sizeof(unsigned char));
  129.         unsigned char*     buf=(unsigned char*)calloc(fsize*4/3+2, sizeof(unsigned char));
  130.         fread(RAMread, fsize, 1, fp);fclose(fp);
  131.         while(i<fsize){
  132.                 buf[j++]=BASE64_CODE[ (RAMread[i  ]>>2  )                      ];
  133.                 buf[j++]=BASE64_CODE[ (RAMread[i  ]&0x03)<<4|(RAMread[++i]>>4) ];
  134.                 buf[j++]=BASE64_CODE[ (RAMread[i  ]&0x0F)<<2|(RAMread[++i]>>6) ];
  135.                 buf[j++]=BASE64_CODE[ (RAMread[i++]&0x3F)                      ];
  136.         }
  137.         if(i==fsize+2){buf[j-2]='=', buf[j-1]='=';}
  138.         if(i==fsize+1){              buf[j-1]='=';}
  139.         free(RAMread);
  140.         if(FLAG==20){
  141.                 //生成兼容性BASE64解码脚本
  142.                 int N, MARK=j/64+1;
  143.                 char* fname=strtok(file, ".");
  144.                 char* extension_name=strtok(NULL, ".");
  145.                 fprintf(stream
  146.                 ,         "@echo off\r\n"
  147.                         "::*********BASE64 标准解码器*********\r\n"
  148.                         "certutil -decode "%%~f0" %s.%s&pause&exit /b\r\n"
  149.                         "::***********************************\r\n"
  150.                 ,
  151.                         fname,
  152.                         extension_name
  153.                 );
  154.                 fprintf(stream, "\r\n-----BEGIN BASE64-----");
  155.                 for(N=1; N<=MARK; N++){
  156.                         fprintf(stream, "\r\n");
  157.                         if(N!=MARK){
  158.                                 fwrite(buf,   64, 1, stream);
  159.                                 buf+=64;
  160.                         }else{
  161.                                 fwrite(buf, j%64, 1, stream);

  162.                         }
  163.                 }
  164.                 fprintf(stream, "\r\n-----END BASE64-----");
  165.                 return 0;
  166.         }else if(FLAG==21){
  167.                 //制作加权压缩BASE64解码脚本
  168.                 Press_Base64(buf, j, stream, file);
  169.         }else if(FLAG==22){
  170.                 //制作DISCUZ论坛专用解码脚本
  171.                 Press_Base64(buf, j, stream, file);
  172.         }else {
  173.                 fwrite(buf, j, 1, stream);
  174.         }
  175.         free(buf);
  176.         return 0;
  177. }
  178. //BASE64#编码
  179. int EncodeBase64_Tight(FILE* fp, FILE* stream)
  180. {
  181.         unsigned char* RAMread=(unsigned char*)calloc(    fsize+3, sizeof(unsigned char));
  182.         unsigned char*     buf=(unsigned char*)calloc(fsize*4/3+2, sizeof(unsigned char));
  183.         fread(RAMread, fsize, 1, fp);fclose(fp);
  184.         while(i<fsize){
  185.                 buf[j++]=BASE64_CODE[(RAMread[i  ]&0xC0)>>2|(RAMread[i+1]&0xC0)>>4|(RAMread[i+2]&0xC0)>>6];
  186.                 buf[j++]=BASE64_CODE[ RAMread[i++]&0x3F ];
  187.                 buf[j++]=BASE64_CODE[ RAMread[i++]&0x3F ];
  188.                 buf[j++]=BASE64_CODE[ RAMread[i++]&0x3F ];
  189.         }
  190.         if(i==fsize+2){buf[j-2]='=', buf[j-1]='=';}
  191.         if(i==fsize+1){              buf[j-1]='=';}
  192.         free(RAMread);
  193.         fwrite(buf, j, 1, stream);
  194.         free(buf);
  195.         return 0;
  196. }
  197. //BASE64+编码
  198. int EncodeBase64_Plus(FILE* fp, FILE* stream)
  199. {
  200.         unsigned char* RAMread=(unsigned char*)calloc(    fsize+3, sizeof(unsigned char));
  201.         unsigned char*  quotes=(unsigned char*)calloc(  fsize/3+2, sizeof(unsigned char));
  202.         unsigned char*     buf=(unsigned char*)calloc(fsize*4/3+2, sizeof(unsigned char));
  203.         fread(RAMread, fsize, 1, fp);fclose(fp);
  204.         while(i<fsize){
  205.                 quotes[i/3]=BASE64_CODE[(RAMread[i]&0xC0)>>2|(RAMread[i+1]&0xC0)>>4|(RAMread[i+2]&0xC0)>>6];
  206.                 buf[i]=BASE64_CODE[ RAMread[i++]&0x3F ];
  207.                 buf[i]=BASE64_CODE[ RAMread[i++]&0x3F ];
  208.                 buf[i]=BASE64_CODE[ RAMread[i++]&0x3F ];
  209.         }
  210.         if(i==fsize+2){buf[i-2]='=', buf[i-1]='=';}
  211.         if(i==fsize+1){              buf[i-1]='=';}
  212.         free(RAMread);
  213.         fwrite(buf, i, 1, stream);
  214.         fputs("#", stream);
  215.         fwrite(quotes, i/3+1, 1, stream);
  216.         free(buf);free(quotes);
  217.         return 0;
  218. }
  219. //BASEBIN编码
  220. int EncodeBin(FILE* fp, FILE* stream)
  221. {
  222.         unsigned char* RAMread=(unsigned char*)calloc(  fsize+1, sizeof(unsigned char));
  223.         char* buf[2];
  224.         fread(RAMread, fsize, 1, fp);fclose(fp);
  225.         while(i!=fsize){
  226.                 buf[0]=(char*)BIN_CODE[ RAMread[i  ]>>4   ];
  227.                 buf[1]=(char*)BIN_CODE[ RAMread[i++]&0x0F ];
  228.                 fprintf(stream, "%s%s", buf[0], buf[1]);
  229.         }
  230.         free(RAMread);
  231.         return 0;
  232. }
  233. //BASEHEX编码
  234. int EncodeHex(FILE* fp, FILE* stream)
  235. {
  236.         unsigned char* RAMread=(unsigned char*)calloc(  fsize+1, sizeof(unsigned char));
  237.         unsigned char*     buf=(unsigned char*)calloc(fsize*2+1, sizeof(unsigned char));
  238.         fread(RAMread, fsize, 1, fp);fclose(fp);
  239.         while(i!=fsize){
  240.                 buf[j++]=HEX_CODE[ RAMread[i  ]>>4   ];
  241.                 buf[j++]=HEX_CODE[ RAMread[i++]&0x0F ];
  242.         }
  243.         free(RAMread);
  244.         fwrite(buf, j, 1, stream);
  245.         free(buf);
  246.         return 0;
  247. }
  248. //BASE92编码
  249. int Str_Encode(unsigned char* str, FILE* stream)
  250. {
  251.         unsigned int sizes;
  252.         unsigned long workspace;
  253.         unsigned short wssize;
  254.         int tmp, len=fsize;
  255.         unsigned char c;
  256.         unsigned char *res;
  257.         sizes=(len*8)%13;
  258.         if(sizes==0){
  259.                 sizes=2*((len*8)/13);
  260.         } else if(sizes<7){
  261.                 sizes=2*((len*8)/13)+1;
  262.         } else {
  263.                 sizes=2*((len*8)/13)+2;
  264.         }
  265.         res=(unsigned char*)malloc(sizeof(char)*(sizes+1));
  266.         workspace=0;
  267.         wssize=0;
  268.         j=0;
  269.         for(i=0; i<len; i++){
  270.                 workspace=workspace<<8 | str[i];
  271.                 wssize+=8;
  272.                 if(wssize>=13){
  273.                         tmp=(workspace>>(wssize-13))&8191;
  274.                         c=BASE92_CODE[tmp/91];
  275.                         if(c==0){
  276.                                 free(res);
  277.                                 return 1;
  278.                         }
  279.                         res[j++]=c;
  280.                         c=BASE92_CODE[tmp%91];
  281.                         if(c==0){
  282.                                 free(res);
  283.                                 return 1;
  284.                         }
  285.                         res[j++]=c;
  286.                         wssize -=13;
  287.                 }
  288.         }
  289.         if(0<wssize && wssize<7){
  290.                 tmp=(workspace<<(6-wssize))&63;
  291.                 c=BASE92_CODE[tmp];
  292.                 if(c==0){
  293.                         free(res);
  294.                         return 1;
  295.                 }
  296.                 res[j]=c;
  297.         } else if(7<=wssize){
  298.                 tmp=(workspace<<(13-wssize))&8191;
  299.                 c=BASE92_CODE[tmp/91];
  300.                 if(c==0){
  301.                         free(res);
  302.                         return 1;
  303.                 }
  304.                 res[j++]=c;
  305.                 c=BASE92_CODE[tmp%91];
  306.                 if(c==0){
  307.                         free(res);
  308.                         return 1;
  309.                 }
  310.                 res[j]=c;
  311.         }
  312.         res[sizes]=0;
  313.         fwrite(res, sizes, 1, stream);
  314.         return 0;
  315. }
  316. int EncodeBase92(FILE* fp, FILE* stream)
  317. {
  318.         unsigned char* RAMread=(unsigned char*)calloc(fsize, sizeof(unsigned char));
  319.         fread(RAMread, fsize, 1, fp);fclose(fp);
  320.         Str_Encode(RAMread, stream);
  321.         free(RAMread);
  322.         return 0;
  323. }

  324. /***************解码函数群***************/
  325. //BASE64解码
  326. int DecodeBase64(FILE* fp, FILE* stream)
  327. {
  328.         unsigned char* RAMread=(unsigned char*)calloc(    fsize+2, sizeof(unsigned char));
  329.         unsigned char*     buf=(unsigned char*)calloc(fsize*3/4+3, sizeof(unsigned char));
  330.         fread(RAMread, fsize, 1, fp);fclose(fp);
  331.         for(; i<fsize; i++){
  332.                 buf[j++]=BASE64_DECO[RAMread[i]-43]<<2 | BASE64_DECO[RAMread[++i]-43]>>4;
  333.                 buf[j++]=BASE64_DECO[RAMread[i]-43]<<4 | BASE64_DECO[RAMread[++i]-43]>>2;
  334.                 buf[j++]=BASE64_DECO[RAMread[i]-43]<<6 | BASE64_DECO[RAMread[++i]-43]   ;
  335.         }
  336.         if(RAMread[--i]=='='){j--;}
  337.         if(RAMread[--i]=='='){j--;}
  338.         free(RAMread);
  339.         fwrite(buf, j, 1, stream);
  340.         free(buf);
  341.         return 0;
  342. }
  343. //BASE64#解码
  344. int DecodeBase64_Tight(FILE* fp, FILE* stream)
  345. {
  346.         unsigned char* RAMread=(unsigned char*)calloc(    fsize+2, sizeof(unsigned char));
  347.         unsigned char*     buf=(unsigned char*)calloc(fsize*3/4+3, sizeof(unsigned char));
  348.         unsigned char      pre;
  349.         fread(RAMread, fsize, 1, fp);fclose(fp);
  350.         while(i<fsize){
  351.                 pre=BASE64_DECO[RAMread[i++]-43];
  352.                 buf[j++]=(pre&0x30)<<2 | BASE64_DECO[RAMread[i++]-43];
  353.                 buf[j++]=(pre&0x0C)<<4 | BASE64_DECO[RAMread[i++]-43];
  354.                 buf[j++]=(pre&0x03)<<6 | BASE64_DECO[RAMread[i++]-43];
  355.         }
  356.         if(RAMread[--i]=='='){j--;}
  357.         if(RAMread[--i]=='='){j--;}
  358.         free(RAMread);
  359.         fwrite(buf, j, 1, stream);
  360.         free(buf);
  361.         return 0;
  362. }
  363. //BASE64+解码
  364. int DecodeBase64_Plus(FILE* fp, FILE* stream)
  365. {
  366.         unsigned char* RAMread=(unsigned char*)calloc(    fsize+3, sizeof(unsigned char));
  367.         unsigned char*     buf=(unsigned char*)calloc(fsize*3/4+3, sizeof(unsigned char));
  368.         unsigned char      pre;
  369.         fread(RAMread, fsize, 1, fp);fclose(fp);
  370.         int p=(int)strchr(RAMread, '#')-(int)RAMread;
  371.         while(i<p){
  372.                 pre=BASE64_DECO[RAMread[i/3+p+1]-43];
  373.                 buf[i]=(pre&0x30)<<2 | BASE64_DECO[RAMread[i++]-43];if(i==p){break;}
  374.                 buf[i]=(pre&0x0C)<<4 | BASE64_DECO[RAMread[i++]-43];if(i==p){break;}
  375.                 buf[i]=(pre&0x03)<<6 | BASE64_DECO[RAMread[i++]-43];
  376.         }
  377.         if(RAMread[i-1]=='='){i--;}
  378.         if(RAMread[i-1]=='='){i--;}
  379.         free(RAMread);
  380.         fwrite(buf, i, 1, stream);
  381.         free(buf);
  382.         return 0;
  383. }
  384. //BASEBIN解码
  385. int DecodeBin(FILE* fp, FILE* stream)
  386. {
  387.         int M;
  388.         unsigned char* RAMread=(unsigned char*)calloc(fsize+2,sizeof(unsigned char));
  389.         unsigned char S;
  390.         fread(RAMread, fsize, 1, fp);fclose(fp);
  391.         while(i<fsize){
  392.                 S=0,M=128;
  393.                 for(j=0; j<8; j++){
  394.                         if(RAMread[i++]==49){
  395.                                 S+=M;
  396.                         }
  397.                         M>>=1;
  398.                 }
  399.                 fprintf(stream, "%c", S);
  400.         }
  401.         free(RAMread);
  402.         return 0;
  403. }
  404. //BASEHEX解码
  405. int DecodeHex(FILE* fp, FILE* stream)
  406. {
  407.         unsigned char* RAMread=(unsigned char*)calloc(fsize+2  , sizeof(unsigned char));
  408.         unsigned char*     buf=(unsigned char*)calloc(fsize/2+1, sizeof(unsigned char));
  409.         fread(RAMread, fsize, 1, fp);fclose(fp);
  410.         for(; i!=fsize; i++){
  411.                 buf[j++]=HEX_DECO[RAMread[i]-48]<<4|HEX_DECO[RAMread[++i]-48];
  412.         }
  413.         free(RAMread);
  414.         fwrite(buf, j, 1, stream);
  415.         free(buf);
  416.         return 0;
  417. }
  418. //BASE92解码
  419. int Str_Decode(unsigned char* str, FILE* stream)
  420. {
  421.         int b1, b2, len;
  422.         int sizes;
  423.         unsigned char* res;
  424.         unsigned long workspace;
  425.         unsigned short wssize;
  426.         sizes=strlen(str);
  427.         if(strcmp(str, "~")==0 || sizes==0){
  428.                 res=(unsigned char*)malloc(sizeof(char)*1);
  429.                 res[0]=0;
  430.                 return 1;
  431.         }
  432.         if(sizes<2){
  433.                 res=(unsigned char*)1;
  434.         }
  435.         len=((sizes/2*13)+(sizes%2*6))/8;
  436.         res=(unsigned char *)malloc(sizeof(char)*(len));
  437.         workspace=0;
  438.         wssize=0;
  439.         j=0;
  440.         for(i=0; i+1<sizes; i+=2){
  441.                 b1=BASE92_DECO[str[i]];
  442.                 b2=BASE92_DECO[str[i+1]];
  443.                 workspace=(workspace<<13)|(b1*91+b2);
  444.                 wssize+=13;
  445.                 while(wssize>=8){
  446.                         res[j++]=(workspace>>(wssize-8))&255;
  447.                         wssize -=8;
  448.                 }
  449.         }
  450.         if(sizes%2==1){
  451.                 workspace=(workspace<<6)| BASE92_DECO[str[sizes-1]];
  452.                 wssize+=6;
  453.                 while(wssize>=8){
  454.                         res[j++]=(workspace>>(wssize-8))&255;
  455.                         wssize -=8;
  456.                 }
  457.         }
  458.         fwrite(res, len, 1, stream);
  459.         return 0;
  460. }
  461. int DecodeBase92(FILE* fp, FILE* stream)
  462. {
  463.         unsigned char* RAMread=(unsigned char*)calloc(fsize, sizeof(unsigned char));
  464.         fread(RAMread, fsize, 1, fp);fclose(fp);
  465.         Str_Decode(RAMread, stream);
  466.         free(RAMread);
  467.         return 0;
  468. }
  469. /***************功能函数群***************/
  470. //帮助信息
  471. void Help_Information(FILE* stream, int Exit_Code)
  472. {
  473.         fprintf(stream,
  474.                 "COPYRIGHT@2016~2018 BY HAPPY, VERSION 1.1\n"
  475.                 "--------------------------------------------------------------\n"
  476.                 "bse [-e|-e#|-e+|-eb|-ex|-e92|\n"
  477.                 "     -d|-d#|-d+|-dx|-db|-d92|\n"
  478.                  "     -m|-mp|-md             ] [infile] [outfile]\n"
  479.                 "--------------------------------------------------------------\n"
  480.                 "    -h    Show help information\n"
  481.                 "    -e    Encode file to BASE64 code\n"
  482.                 "    -e#   Encode file to BASE64# code\n"
  483.                 "    -e+   Encode file to BASE64+ code\n"
  484.                 "    -eb   Encode file to BIN code\n"
  485.                 "    -ex   Encode file to HEX code\n"
  486.                 "    -e92  Encode file to BASE92 code\n"
  487.                 "    -d    Decode a file from BASE64 code\n"
  488.                 "    -d#   Decode a file from BASE64# code\n"
  489.                 "    -d+   Decode a file from BASE64+ code\n"
  490.                 "    -db   Decode a file from BIN code\n"
  491.                 "    -dx   Decode a file from HEX code\n"
  492.                 "    -d92  Decode a file from BASE92 code\n"
  493.                 "    -m    Make a ordinary BASE64 batch\n"
  494.                 "    -mp   Make a press BASE64 batch\n"
  495.                 "    -md   Make a discuz BASE64 batch\n"
  496.                 "--------------------------------------------------------------\n"
  497.         );
  498.         exit(Exit_Code);
  499. }

  500. /*************MAIN主函数入口*************/
  501. int main(int argc, char** argv)
  502. {
  503.         FILE* fp;FILE* op; char* delims;
  504.         if((argc==4) && (argv[1][0]=='-')){
  505.                 switch(argv[1][1]){
  506.                         case 'E':
  507.                         case 'e':
  508.                                 delims=(argv[1]+2);
  509.                                 if     (delims[0]=='\0'){FLAG= 1;}
  510.                                 else if(delims[0]== '#'){FLAG= 2;}
  511.                                 else if(delims[0]== '+'){FLAG= 3;}
  512.                                 else if(delims[0]== 'b'){FLAG= 4;}
  513.                                 else if(delims[0]== 'x'){FLAG= 5;}
  514.                                 else if(delims[0]== '9'){FLAG= 9;}
  515.                                 else{Help_Information(stderr, 1);}
  516.                                 break;
  517.                         case 'D':
  518.                         case 'd':
  519.                                 delims=(argv[1]+2);
  520.                                 if     (delims[0]=='\0'){FLAG=11;}
  521.                                 else if(delims[0]== '#'){FLAG=12;}
  522.                                 else if(delims[0]== '+'){FLAG=13;}
  523.                                 else if(delims[0]== 'b'){FLAG=14;}
  524.                                 else if(delims[0]== 'x'){FLAG=15;}
  525.                                 else if(delims[0]== '9'){FLAG=19;}
  526.                                 else{Help_Information(stderr, 1);}
  527.                                 break;
  528.                         case 'M':
  529.                         case 'm':
  530.                                 delims=(argv[1]+2);
  531.                                 if     (delims[0]=='\0'){FLAG=20;}
  532.                                 else if(delims[0]== 'p'){FLAG=21;}
  533.                                 else if(delims[0]== 'd'){FLAG=22;}
  534.                                 break;
  535.                         default:
  536.                                 Help_Information(stderr, 2);
  537.                 }
  538.         }else{
  539.                 Help_Information(stderr, 3);
  540.         }
  541.         //读文件流
  542.         if( (fp=fopen(argv[2], "rb"))==NULL ){
  543.                 fputs("Failed to read file.", stdout);
  544.                 return 2;
  545.         }
  546.         //测量尺寸
  547.         fseek(fp, 0, SEEK_END);
  548.         if( (fsize=ftell(fp))>FILE_MAX_SIZE*1024*1024 ){
  549.                 fputs("File size is too large, out of memory.", stdout);
  550.                 return 1;
  551.         }
  552.         //指针复原
  553.         fseek(fp, 0, SEEK_SET);
  554.         //打开输出文件流
  555.         if( (op=fopen(argv[3], "wb"))==NULL ){
  556.                 fputs("Failed to read file.", stdout);
  557.                 return 1;
  558.         }
  559.         switch(FLAG){
  560.                 case 1:
  561.                         EncodeBase64(fp, op, NULL);
  562.                         break;
  563.                 case 2:
  564.                         EncodeBase64_Tight(fp, op);
  565.                         break;               
  566.                 case 3:
  567.                         EncodeBase64_Plus(fp, op);
  568.                         break;
  569.                 case 4:
  570.                         EncodeBin(fp, op);
  571.                         break;
  572.                 case 5:
  573.                         EncodeHex(fp, op);
  574.                         break;
  575.                 case 9:
  576.                         EncodeBase92(fp, op);
  577.                         break;
  578.                 case 11:
  579.                         DecodeBase64(fp, op);
  580.                         break;
  581.                 case 12:
  582.                         DecodeBase64_Tight(fp, op);
  583.                         break;               
  584.                 case 13:
  585.                         DecodeBase64_Plus(fp, op);
  586.                         break;
  587.                 case 14:
  588.                         DecodeBin(fp, op);
  589.                         break;
  590.                 case 15:
  591.                         DecodeHex(fp, op);
  592.                         break;
  593.                 case 19:
  594.                         DecodeBase92(fp, op);
  595.                         break;
  596.                 case 20:
  597.                 case 21:
  598.                 case 22:
  599.                         EncodeBase64(fp, op, argv[2]);
  600.                         break;
  601.         }               
  602.         fclose(op);
  603.         return 0;
  604. }
复制代码


其中base64+和base64#为自创编码算法,其原理如下:
我根据Base64的构造方式,改良了一种新的编码。这种编码方式与base64具有一样的编码增长率,只是编码的方式略有区别,是一种模拟的base256码,只是可见字符无法达到256种,因此为可见字符构建了引码。引码的取值为0x00、0x01、0x10、0x11,由4个引码与64个可见字符组合成256种不同情况,即组合为一个字节。在编码时,将8位的前两位单独取出作为引码,余下6位直接转化为数据码,同时每3个引码(也就是凑够6位)合成为一个base64+码。这样引码和数据码都转化为了base+码。


批处理原型:
  1. @echo off
  2. ::**************Happy's Base64+**********
  3. REM 使用说明:
  4. REM Base64+编码,由“引码”+“数据”构成
  5. REM “引码”是数据的解密引文,安全性极高
  6. REM “引码”和“数据”中间用“+”号 隔开

  7. ::**************编码测试*****************
  8. set "原文=589E583EC18895DF88B450831DB8975FC8B0031F68B003D910000C077433D8D0000C0725BBE01000000C704240800000031D289542404E89C0D000083F801747A85C0740EC7042408000000FFD0BBFFFFFFFF89D88B75FC8B5DF889EC5DC204003D940000C074C2774A3D930000C074B489D88B75FC8B5DF889EC5DC20400903D050000C0745B3D1D0000C075C5C704240400000031F689742404E8380D000083F801746A85C074AAC7042404000000FFD0EB9A3D960000C0EBD1C7042408000000B80100000089442404E8080D000085F60F8476FFFFFFE88B090000E96CFFFFFFC704240B00000031C089442404E8E40C000083F801743085C00F8452FFFFFFC704240B000000FFD0E93FFFFFFFC7042404000000B901000000894C2404E8B40C0000E925FFFFFFC704240B000000B80100000089442404E89A0C0000E90BFFFFFF8DB6000000008DBC27000000005589E55383EC24C7042400104000E8050D000083EC04E8FD070000E8F8080000C745F8000000008D45F889442410A104204000C70424044040008944240C8D45F489442408B80040400089442404E84D0C0000A11040400085C07464A3142040008B15F450400085D20F85A100000083FAE0741FA11040400089442404A1F45040008B4030890424E80B0C00008B15F450400083FAC07428A11040400089442404A1F45040008B4050890424E8E70B0000EB0D90909090909090909090909090E8CB0B00008B15142040008910E81607000083E4F0E8EE060000E8A10B00008B0089442408A10040400089442404A104404000890424E89E03000089C3E8760B0000891C24E8060C00008DB60000000089442404A1F45040008B4010890424E8740B00008B15F4504000E940FFFFFF905589E583EC08C7042401000000FF15E8504000E8B8FEFFFF908DB426000000005589E583EC08C7042402000000FF15E8504000E898FEFFFF908DB42600000000558B0D0451400089E55DFFE18D742600558B0DF850400089E55DFFE1909090905589E55DE93F080000909090909090905589E58B4508C700000000008B4508C64004005DC35589E583EC088B45088845FF807DFF3F7609C745F83D000000EB110FB645FF8B15002040000FBE04028945F88B45F8C9C35589E583EC1C8B45188945FC8B450C8945F88B450C0345108945F48B45080FB640048845F38B45088B008945E8837DE8010F8483000000837DE801720F837DE8020F84E5000000E9690100008B45F83B45F475238B55080FB645F38842048B4508C700000000008B55FC8B451829D08945ECE94B0100008B45F889C28D45F8FF000FB6028845F20FB645F225FC000000C1F8028845F30FB645F3890424E82DFFFFFF88C28B451888108D4518FF000FB645F22403C0E0048845F38B45F83B45F475238B55080FB645F3884"

  9. ::**************Base64+码表**************
  10. set "CODE_SKIN=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789[]

  11. ::**************Base64+编码器************
  12. setlocal enabledelayedexpansion
  13. set "LINE=!原文!000000"
  14. for /l %%j in (0,1,8000) do (
  15.         set "STR=!LINE:~0,6!"
  16.         set/a "A0=(0x!STR:~0,2!)&0x3F, A1=(0x!STR:~2,2!)&0x3F, A2=(0x!STR:~4,2!)&0x3F, N0=(0x!STR:~0,2!>>6)&0x3, N1=(0x!STR:~2,2!>>6)&0x3, N2=(0x!STR:~4,2!>>6)&0x3, N=N0*16+N1*4+N2" 2>NUL
  17.         for /f "tokens=1,2,3,4" %%a in ("!A0! !A1! !A2! !N!") do (
  18.                 set "OUT=!OUT!!CODE_SKIN:~%%a,1!!CODE_SKIN:~%%b,1!!CODE_SKIN:~%%c,1!"
  19.                 set "QU=!QU!!CODE_SKIN:~%%d,1!"
  20.         )
  21.         set "LINE=!LINE:~6!"
  22.         if "!LINE:0=!"=="" (
  23.                 echo Base64+密文:
  24.                 set/p=!QU!+!OUT!&exit
  25.         )
  26. )
复制代码

  1. @echo off
  2. ::**************Happy's Base64+**********
  3. REM 使用说明:
  4. REM Base64+编码,由“引码”+“数据”构成
  5. REM “引码”是数据的解密引文,安全性极高
  6. REM “引码”和“数据”中间用“+”号 隔开

  7. ::**************解码测试*****************
  8. set "密文=ZOumKeBjAE8AsAVgAlbwIZHVgMv[p7rxNARsAWp7rxDQG8BVUAZWsCGRlUDK0CFYCAJWsF1]qC]1YAJWcCETT9WAy]1UCALWcJ]VgIAlawr]QD0AZDVQCcDbQqBYA2lBAVQJfWWgCVvAAEUQJQE0AIcAJUQIJawlAIYAJUQIJZgsAAAAqCUCJQEtCIIlgAlRAlsCJgtnDQCVECCWYJQI]GTlQDYCvzUAZOVANgK]NQBtAnzUbgJ8AGe4AABmZACZExk6ac]ZbAjXkA9JpoZPmnnmnElm0ZJomONADgzjUCgJpUm1IZkAJ5onoCaNs0k1HAIk1Jb]iaNs1EBkmlSbUg+YeY[BIVfI0QDd4XfIwDfowDZQAMH0zYQAMHl7gQAAMwCAAAADdoVCAOJAQAI]AXHocHAswCAAAAP9L]]]]4dI3fI1fIeFcgADZAAMHMn0jZwAMHLIdI3fI1fIeFcgAJDQQAMHFzRQAMHccwCAAAADfoXCAODAQAI]AXGocHKswCAAAAP9O5jZgAMO9cwCAAAALAQAAIUCAOAAQAIfg4Hv]][IwQAOWP]]8wCAwAADcIUCAOOAAAI]AXDIcA4Fv]]8wCAwAAP9OT]]]8wCAAAALQQAAIUCAOLAAAOSf]]8wCAwAALAQAAIUCAOJgAAOQ]]]4bgAAAIbCwAAAFYeV4[CMwCABEAOAQQAI[AOPQwAOPAAAM0fAAAAIUfIUCBKQCEAMwCAEEAIUCAIUfIUCALAEEAIUCAOEQAAKREEAIcHGKxCEAIxfFEAIdg4aQAAI]uHB6REEAIUCAKfFEAI0DIQCOAwAAIxfFEAI]sHCKREEAIUCAKfFEAI0FIQCOOwwAOwZJJJJJJJJJJJJOMwwAIxRCEAIROBgwAI[POOggAOKQwAIwIUCAKQEEAIUCAKQEEAIQCOJgwAIc[HgwAIRCOAgAAIbgAAAIUCAKfFEAI0BIQCOHAwAIxfFEAOUP]]5FYeY[AMwCAQAAPxeFEAOLPv]5IbCgAAAFYeY[AMwCAgAAPxeFEAOJPv]5IbCgAAAFYwQFUAIeVf[YXCgFYwfFEAIeVf[ZJJJFYeVeTwAAJJJJJJJFYeY0QMwAAAAI0QMkAAFc1YeY[AI0QIEf4Hfz3gc0fDQAAOxQ7kf4xQCEAA7gAoUfI0fMc1YeY[BI0RIUfI0QIUfI0QA0RIUfI0QA7kAIEf40QIwIUeI3eAQ4IwAAI3eAXg43eAg4OQAAOWQQAI0fD0fHS41QA7kf4EgI0QMwAAAAI1fI0RCdIUeOUwQAI0fIcoUfPwA7goEfg7kfifAAAMfAoEfw7kf4QCOCf]]4Mo0RIBIURPwA7kfiA8OAIEf40fD0fHS41QA7kf4EAA"

  9. ::**************Base64+构建码表**********
  10. setlocal enabledelayedexpansion
  11. set "CODE=-1"
  12. set "SKIN=0123456789ABCDEF"
  13. for %%A in (#A,#B,#C,#D,#E,#F,#G,#H,#I,#J,#K,#L,#M,#N,#O,#P,#Q,#R,#S,#T,#U,#V,#W,#X,#Y,#Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9,[,]) do (
  14.         set/a "CODE+=1,UQ_%%A=CODE,SUF=CODE&0xF,CACHE=CODE>>4,PRE0=CACHE,PRE1=4+CACHE,PRE2=8+CACHE,PRE3=12+CACHE"
  15.         for %%N in (0,1,2,3) do (
  16.                 for /f "tokens=1,2" %%a in ("!PRE%%N! !SUF!") do (
  17.                         set "BASE%%N_%%A=!SKIN:~%%a,1!!SKIN:~%%b,1!"
  18.                 )
  19.         )
  20.         if !CODE! lss 26 (
  21.                 set "CASE=%%A"
  22.                 set "%%A=!CASE!"
  23.         )
  24. )

  25. ::**************Base64+解码器************
  26. for /f "tokens=1,2 delims=+" %%a in ("!密文!") do (
  27.         set "QU=%%a"
  28.         set LINE=%%b###"
  29. )
  30. for /l %%j in (0,1,1000) do (
  31.         set "PRE=!QU:~%%j,1!"
  32.         for %%Q in (!PRE!) do (
  33.                 if "#%%Q"=="!#%%Q!" (
  34.                         set "PRE=#!PRE!"
  35.                 )
  36.         )
  37.         set "STR=!LINE:~0,3!"
  38.         set/a "N2=UQ_!PRE!&0x3,N1=(UQ_!PRE!>>2)&0x3,N0=(UQ_!PRE!>>4)&0x3"
  39.         for %%i in (0,1,2) do (
  40.                 for /f "tokens=1,2" %%a in ("!N%%i! !STR:~%%i,1!") do (
  41.                         if "%%b"=="#" (
  42.                                 echo 二进制明文:
  43.                                 set/p=!OUT!&exit
  44.                         )
  45.                         if "#%%b"=="!#%%b!" (
  46.                                 set "OUT=!OUT!!BASE%%a_#%%b!"
  47.                         ) else (
  48.                                 set "OUT=!OUT!!BASE%%a_%%b!"
  49.                         )
  50.                 )               
  51.         )
  52.         set "LINE=!LINE:~3!"
  53. )
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-12-27 05:42 , Processed in 0.030315 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表