+ -
当前位置:首页 → 问答吧 → 求一个文件加密算法

求一个文件加密算法

时间:2010-06-28

来源:互联网

用于对jpg图像文件进行加密,性能第一安全第二,当然也不能完全不考虑安全,像那种简单的逻辑移位是肯定不行的,3des这种复杂的算法效率又跟不上。

作者: tajial   发布时间: 2010-06-28

我只用过一个botan加密库:http://botan.randombit.net/

作者: ecjtubaowp   发布时间: 2010-06-28

回复 ecjtubaowp
好像是C++的
有C版本的吗?

作者: tajial   发布时间: 2010-06-28

jpg图片一般都不大,楼主可以试试aes

作者: c/unix   发布时间: 2010-06-28

本帖最后由 yulihua49 于 2010-06-28 17:13 编辑


QUOTE:
用于对jpg图像文件进行加密,性能第一安全第二,当然也不能完全不考虑安全,像那种简单的逻辑移位是肯定不行 ...
tajial 发表于 2010-06-28 14:12


ENIGMA密码:
http://blog.chinaunix.net/u3/92831/showart_2163335.html

    加入SDBC群,群空间有源码。QQ100807652

加密速度:
enigma1是3DES的27倍,frenz是13.5倍,enigma2是6.5倍。

使用方法:
#include <enigma.h>

ENIGMA2 egm;
//生成密码机
         enigma2_init(&ehm,"key122237@#$$%%");

//加密:

      enigma2_encode(&egm,buf,size);//buf里明码原位便密码
//解密:
      enigma2_decode(&egm,buf,size);//buf里密码原位变明码

安全性,在上文讨论。
适于流媒体加密。

由于是序列密码,对加密信息的长度没有限制,加密前后长度不变。

安全讨论,见80楼:
http://bbs.chinaunix.net/viewthr ... ;page=8#pid12368686

作者: yulihua49   发布时间: 2010-06-28



QUOTE:
ENIGMA密码:


    加入SDBC群,群空间有源码。QQ100807652

加密速度:
enigma1是3DES的27倍,fr ...
yulihua49 发表于 2010-06-28 17:00



兄弟直接上传个源码包吧

作者: c/unix   发布时间: 2010-06-28

本帖最后由 yulihua49 于 2010-06-28 17:19 编辑


QUOTE:
兄弟直接上传个源码包吧
c/unix 发表于 2010-06-28 17:06




    加入SDBC群,在群空间-共享空间有,群论坛有编译方法:
你能看到吗?把part01-04下来,解压到linux'
http://qun.qq.com/air/#100807652/share
好像不行,入群吧,我等你。

只编译string和crypto两个目录即可。

crypt目录下有个t_eni.c,就是demo。

作者: yulihua49   发布时间: 2010-06-28



QUOTE:
兄弟直接上传个源码包吧
c/unix 发表于 2010-06-28 17:06




    测试demo:
  1. /* enigma 加密测试 */
  2. #include <strproc.h>
  3. #include <enigma.h>
  4. #include <sys/time.h>

  5. //#define TEST_SPEED

  6. long interval(struct timeval *begtime,struct timeval *endtime)
  7. {
  8. long ret;
  9.         ret=endtime->tv_sec-begtime->tv_sec;
  10.         ret*=1000000;
  11.         ret += endtime->tv_usec - begtime->tv_usec;
  12.         return ret;
  13. }


  14. int main(int ac,char *av[])
  15. {
  16. char buf[131702];
  17. int len,i,len1;
  18. ENIGMA t;
  19. ENIGMA2 egm;
  20. struct timeval beg,end;

  21.         enigma1_init(t,"永 垂 不 朽,Enigma");
  22.         printf("t1:");
  23.         for(i=0;i<256;i++) {
  24.                 if(!(i&7)) putchar('\n');
  25.                 printf("%3d:%d\t",i,255&t[0][i]);
  26.         }
  27.         printf("\nt3:");
  28.         for(i=0;i<256;i++) {
  29.                 if(!(i&7)) putchar('\n');
  30.                 printf("%3d:%d\t",i,255&t[2][i]);
  31.         }
  32.         enigma2_init(&egm,"永 垂 不 朽 的 Enigma");
  33.         printf("\ncrc=%d\n",egm.crc);
  34. //      enigma2_init(&egm,"\x01\xff\x35\xf8\xef\x97\x22\x14\x80\x7f\t\b\r\n\377\177\225");
  35.         memset(buf,'\373',sizeof(buf));
  36.         buf[sizeof(buf)-1]=0;
  37. #ifndef TEST_SPEED
  38.         while(!ferror(stdin)) {
  39.                 fgets(buf,sizeof(buf),stdin);
  40.                 if(feof(stdin)) break;
  41.                 TRIM(buf);
  42. #endif
  43.                 len=strlen(buf);
  44.                 gettimeofday(&beg,0);
  45.                 enigma1(t,buf,len);
  46.                 gettimeofday(&end,0);
  47.                 len1=len>32?32:len;
  48.                 printf("enigma1 encode:");
  49.                 for(i=0;i<len1;i++) printf("%02X ",buf[i]&255);
  50.                 printf("\nenigma1 encode 64K:");
  51.                 for(i=0;i<len1;i++) printf("%02X ",buf[i+65536]&255);
  52.                 printf("\ntimeval=%ld\n",interval(&beg,&end));
  53.                 enigma1(t,buf,len);
  54.                 printf("enigma1 decode:\n%.100s\n",buf);
  55. //test frenz
  56.                 gettimeofday(&beg,0);
  57.                 frenz_encode(t,buf,len);
  58.                 gettimeofday(&end,0);
  59.                 printf("frenz encode:");
  60.                 for(i=0;i<len1;i++) printf("%02X ",buf[i]&255);
  61.                 printf("\nfrenz encode 64K:");
  62.                 for(i=0;i<len1;i++) printf("%02X ",buf[i+65536]&255);
  63.                 printf("\ntimeval=%ld\n",interval(&beg,&end));
  64.                 frenz_decode(t,buf,len);
  65.                 printf("frenz decode:\n%.100s\n",buf);
  66. //test enigma2
  67.                 gettimeofday(&beg,0);
  68.                 enigma2_encode(&egm,buf,len);
  69.                 gettimeofday(&end,0);
  70.                 printf("enigma2 encode:");
  71.                 for(i=0;i<len1;i++) printf("%02X ",buf[i]&255);
  72.                 printf("\nenigma2 encode 64K:");
  73.                 for(i=0;i<len1;i++) printf("%02X ",buf[i+65536]&255);
  74.                 printf("\ntimeval=%ld\n",interval(&beg,&end));
  75.                 enigma2_decode(&egm,buf,len);
  76.                 printf("enigma2 decode:\n%.100s\n",buf);
  77. #ifndef TEST_SPEED
  78.         }
  79. #endif
  80.         return 0;
  81. }
复制代码

作者: yulihua49   发布时间: 2010-06-28

没想到ENIGMA还这么强大啊,没用过。

作者: ecjtubaowp   发布时间: 2010-06-28



QUOTE:
测试demo:
yulihua49 发表于 2010-06-28 17:20




    源码:
enigma.h:
  1. #ifndef ENIGMA_H
  2. #define ENIGMA_H

  3. #define ROTORSZ 256

  4. typedef char ENIGMA[3][ROTORSZ];
  5. typedef struct {
  6.         ENIGMA t;
  7.         ENIGMA r;
  8.         INT4 crc;
  9. } ENIGMA2;

  10. #ifdef __cplusplus
  11. extern "C" {
  12. #endif
  13. /* 改进的 ENIGMA 程序 */
  14. void enigma1_init(ENIGMA t,char *key);
  15. void enigma1(ENIGMA t,char *buf,int len);
  16. //疯狂旋转的转轮机,完全屏蔽了列表特征,不存在周期性
  17. void frenz_encode(ENIGMA t,char *string,int len);
  18. void frenz_decode(ENIGMA t,char *string,int len);

  19. /* 加密后扰码,用于配合多种加密手段 */
  20. void enigma_rev(ENIGMA t,char *buf,int len);
  21. /* 解扰后解密,用于解密 */
  22. void rev_enigma(ENIGMA t,char *buf,int len);

  23. /* 加强的ENIGMA程序,完全消除了密文与相似明文的对应关系 */
  24. void enigma2_init(ENIGMA2 *ep,char *key); //初始化
  25. void enigma2_encode(ENIGMA2 *ep,char *buf,int len);     //加密
  26. void enigma2_decode(ENIGMA2 *ep,char *buf,int len); //解密
  27. /*
  28. void enigma3_encode(ENIGMA2 *ep,char *buf,int len);     //加密
  29. void enigma3_decode(ENIGMA2 *ep,char *buf,int len); //解密
  30. */

  31. #ifdef __cplusplus
  32. }
  33. #endif

  34. #endif
复制代码

作者: yulihua49   发布时间: 2010-06-28

本帖最后由 yulihua49 于 2010-06-28 17:31 编辑


QUOTE:
兄弟直接上传个源码包吧
c/unix 发表于 2010-06-28 17:06


enigma1.c:
  1. #include <strproc.h>
  2. #include <enigma.h>
  3. #include <arpa/inet.h>
  4. #include <crc.h>
  5. #include <des.h>
  6. /*
  7. *      A one-rotor machine designed along the lines of Enigma
  8. *      but considerably trivialized.
  9. */

  10. #define MASK 0377
  11. // 随机串长度,如果你想使用MD5,加大这个值
  12. #define RAN_LEN 17

  13. /* 生成密码轮 */
  14. void enigma1_init(ENIGMA t,char *pw)
  15. {
  16. int ic, i, k, temp;
  17. int random,seed;
  18. char *buf,buf1[RAN_LEN+1];
  19. char    *t1,*t2,*t3,salt[3];
  20. int len;
  21. int32_t crc,*ip;
  22. char *h;
  23. int hlen;

  24.         if(!t || !pw || !*pw) return;
  25.         t1=t[0];
  26.         t2=t[1];
  27.         t3=t[2];
  28.         len=strlen(pw);
  29.         crc=(int32_t)ssh_crc32((const unsigned char *)pw,len);
  30.         ip=(int *)buf1;
  31.         *ip=htonl(crc);//CRC在不同系统上具有相同的值,作为随机串的使用,必须保证在所有系统上相同的字节次序

  32.         seed=0xFFFF&gencrc((unsigned char *)pw,len);
  33.         salt[0]=seed&127;
  34.         if(!salt[0]) salt[0]=0X41;
  35.         seed >>= 7;
  36.         salt[1]=seed&127;
  37.         if(!salt[1]) salt[1]=0X41;
  38.         salt[2]=0;
  39.         if(seed==0) seed=pw[len-1];

  40. // 设置ic,初始化的自旋
  41.         ic=len;
  42.         for(i=0;i<len;i++) ic += pw[i];
  43.         ic &= 127;
  44.         ic|=(seed & 128);

  45.         if(len>13) {
  46.                 hlen=13;
  47.                 h=pw+len-13;
  48.         } else {
  49.                 hlen=len;
  50.                 h=pw;
  51.         }

  52. /* 你可以在buf1里添加任何散列数据  如MD5等 */
  53.         buf=des_fcrypt(pw,salt,buf1+sizeof(int32_t));
  54.         for (i=0; i<13; i++) {
  55.                 seed = seed*buf[i] + i;
  56. //随机串由原来的6-7bit提升到8bit,并与密钥的最后13位直接相关
  57.                 buf[i] = (buf[i] << 1) ^ h[i % hlen];
  58.         }
  59. // ic,初始化的自旋
  60.         for(i=0;i<ROTORSZ;i++) {
  61.                 t1[i] = (i+ic) & MASK;
  62.                 t3[i] = 0;
  63.         }
  64.         for(i=0;i<ROTORSZ;i++) {
  65.                 seed = len*seed + buf1[i%RAN_LEN];
  66.                 random = (seed&0X7FFFFFFF) % 65529;     //random(key);
  67. // 以上生成尽可能随机的random,你有充分的自由度选择你的算法
  68. /* 生成主编码轮 t1 */
  69.                 k = ROTORSZ-1 - i;
  70.                 ic = random % (k+1);

  71.                 temp = t1[k];
  72.                 t1[k] = t1[ic];
  73.                 t1[ic] = temp;
  74. /************************************************************************
  75. * 生成反射板 反射板只要不重不漏的把各点两两连接起来?
  76. ************************************************************************/
  77.                 if(t3[k]!=0) continue;
  78.                 ic = (random>>8) % k;
  79.                 while(t3[ic]!=0) ic = (ic+1) % k;
  80.                 t3[k] = ic;
  81.                 t3[ic] = k;
  82.         }
  83. /* t2为t1的逆 */
  84.         for(i=0;i<ROTORSZ;i++)
  85.                 t2[t1[i]&MASK] = i;
  86. }
  87. void enigma1(ENIGMA t,char *string,int len)
  88. {
  89. register char *p;
  90. register int  n1,n2, k, x;      //x旋转因子
  91. char *t1,*t2,*t3;

  92.         if(!t || !string || len <= 0) return;
  93.         t1=t[0];
  94.         t2=t[1];
  95.         t3=t[2];
  96. //初始位置和旋转因子与len和T有关,不知道T就不知道它们,也无法通过明文、密文的关系推断T。
  97.         n2=t[len&1][(len>>9)&MASK]&MASK;
  98.         n1=t3[(len>>1)&MASK]&MASK;

  99.         x=((t3[((len>>17)+n1)&MASK]&3)<<1)+1;   //x=1,3,5,7

  100.         p=string;
  101.         for(k=0;k<len;k++){
  102.                 *p = t2[(t3[(t1[(*p+n1)&MASK]+n2)&MASK]-n2)&MASK]-n1;
  103.                 ++p;
  104.                 n1 += x;
  105.                 if (n1 >= ROTORSZ) {
  106.                         n1 &= MASK;
  107.                         if(++n2==ROTORSZ) n2 = 0;
  108.                 }
  109.         }
  110. }

  111. void frenz_encode(ENIGMA t,char *string,int len)
  112. {
  113. register char *p;
  114. register int x,n1;       //x旋转因子
  115. char *t1,*t2,*t3;
  116. int  n2, k;
  117. //int r=0;

  118.         if(!t || !string || len <= 0) return;
  119.         t1=t[0];
  120.         t2=t[1];
  121.         t3=t[2];
  122. //初始位置和旋转因子与len和T有关,不知道T就不知道它们,也无法通过明文、密文的关系推断T。

  123.         n2=t[len&1][(len>>9)&MASK]&MASK;
  124.         n1=t3[(len>>1)&MASK]&MASK;

  125.         p=string;
  126.         for(k=0;k<len;k++){
  127.                 x=t2[(*p+k)&MASK];
  128.                 *p = t2[(t3[(t1[(*p+n1)&MASK]+n2)&MASK]-n2)&MASK]-n1;
  129.                 ++p;
  130.                 n1 += x;
  131.                 if(n1<0) {
  132.                         n1&=MASK;
  133.                         continue;
  134.                 }
  135.                 if (n1 >= ROTORSZ) {
  136.                         n1 &= MASK;
  137.                         if(++n2==ROTORSZ) n2 = 0;
  138. //                      r++;
  139.                 }
  140.         }
  141. }
  142. void frenz_decode(ENIGMA t,char *string,int len)
  143. {
  144. register char *p;
  145. register int x,n1;       //x旋转因子
  146. char *t1,*t2,*t3;
  147. int  n2, k;

  148.         if(!t || !string || len <= 0) return;
  149.         t1=t[0];
  150.         t2=t[1];
  151.         t3=t[2];
  152. //初始位置和旋转因子与len和T有关,不知道T就不知道它们,也无法通过明文、密文的关系推断T。
  153.         n2=t[len&1][(len>>9)&MASK]&MASK;
  154.         n1=t3[(len>>1)&MASK]&MASK;

  155.         p=string;
  156.         for(k=0;k<len;k++){
  157.                 *p = t2[(t3[(t1[(*p+n1)&MASK]+n2)&MASK]-n2)&MASK]-n1;
  158.                 x=t2[(*p+k)&MASK];
  159.                 ++p;
  160.                 n1 += x;
  161.                 if(n1<0) {
  162.                         n1&=MASK;
  163.                         continue;
  164.                 }
  165.                 if (n1 >= ROTORSZ) {
  166.                         n1 &= MASK;
  167.                         if(++n2==ROTORSZ) n2 = 0;
  168.                 }
  169.         }
  170. }
复制代码
里边用到的散列函数;
des_fcrypt,ssh_crc32是ssl里的,crcgen()是crc16,ccitt的,用别的也行,只要加密解密是一套就行。

作者: yulihua49   发布时间: 2010-06-28

本帖最后由 yulihua49 于 2010-06-28 17:37 编辑


QUOTE:
enigma1.c:
yulihua49 发表于 2010-06-28 17:25



enigma2.c:
  1. #include <strproc.h>
  2. #include "enigma.h"

  3. void b_revers(char *buf,int len)
  4. {
  5. char *p,*p1,c;
  6.         if(!buf || len<2) return;
  7.         p=buf;
  8.         p1=p+len-1;
  9.         while(p1>p) {
  10.                 c=*p1;
  11.                 *p1--=*p;
  12.                 *p++=c;
  13.         }
  14.         return;
  15. }

  16. void enigma_rev(ENIGMA ep,char *buf,int len)
  17. {
  18. int i;
  19. char *p;
  20.         if(!buf||len<=0) return;
  21.         frenz_encode(ep,buf,len);
  22.         b_revers(buf,len);
  23.         p=buf;
  24.         for(i=0;i<len-1;i++) {
  25.                 p[1]^=*p;
  26.                 p++;
  27.         }
  28. }
  29. void rev_enigma(ENIGMA ep,char *buf,int len)
  30. {
  31. int i;
  32. char *p;
  33.         if(!buf||len<=0) return;
  34.         b_revers(buf,len);
  35.         p=buf;
  36.         for(i=0;i<len-1;i++) {
  37.                 *p^=p[1];
  38.                 p++;
  39.         }
  40.         frenz_decode(ep,buf,len);
  41. }
  42. void enigma2_init(ENIGMA2 *ep,char *key)
  43. {
  44. int len;
  45.         if(!ep||!key||!*key) return;
  46.         len=strlen(key);
  47. char rk[len+1];
  48.         strcpy(rk,key);
  49.         enigma1_init(ep->t,key);
  50.         b_revers(rk,len);
  51.         enigma1_init(ep->r,rk);
  52.         ep->crc=0X7FFFFFFF & ssh_crc32(ep->t,2*sizeof(ep->t));
  53. //ShowLog(5,"%s:crc=%d",__FUNCTION__,ep->crc);
  54.         return;
  55. }

  56. static void str_rotor(char *str,int len,int rotor)
  57. {
  58. char *p;
  59.         if(!rotor) return;
  60. char buf[rotor];//WINDOWS不能如此,改alloca

  61.         memcpy(buf,str,rotor);
  62.         memcpy(str,str+rotor,len-rotor);
  63.         memcpy(str+len-rotor,buf,rotor);
  64. }

  65. void enigma2_encode(ENIGMA2 *ep,char *buf,int len)
  66. {
  67. char *p;
  68.         if(!ep) return;
  69.         enigma_rev(ep->t,buf,len);
  70.         str_rotor(buf,len,ep->crc%len);
  71.         enigma1(ep->r,buf,len);
  72. }

  73. void enigma2_decode(ENIGMA2 *ep,char *buf,int len)
  74. {
  75. int i;
  76. char *p;
  77.         if(!ep) return;
  78.         enigma1(ep->r,buf,len);
  79.         i=ep->crc%len;
  80.         if(i) str_rotor(buf,len,len-i);
  81.         rev_enigma(ep->t,buf,len);
  82. }
复制代码
有些.h你没有就删掉,看看缺啥,给你补。缺少ShowLog,删掉吧,那只是个日志。你要下载整个SDBC就没问题了。

作者: yulihua49   发布时间: 2010-06-28



QUOTE:
没想到ENIGMA还这么强大啊,没用过。
ecjtubaowp 发表于 2010-06-28 17:21




   原始 ENIGMA不行,但他的先天体质不错,可改造,这些是我根据现代密码学的理论改造过的。

作者: yulihua49   发布时间: 2010-06-28

AES

作者: nhuczp   发布时间: 2010-06-28