免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: tajial
打印 上一主题 下一主题

[算法] 求一个文件加密算法 [复制链接]

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
11 [报告]
发表于 2010-06-28 17:25 |只看该作者
本帖最后由 yulihua49 于 2010-06-28 17:31 编辑
兄弟直接上传个源码包吧
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的,用别的也行,只要加密解密是一套就行。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
12 [报告]
发表于 2010-06-28 17:26 |只看该作者
本帖最后由 yulihua49 于 2010-06-28 17:37 编辑
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就没问题了。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
13 [报告]
发表于 2010-06-28 17:35 |只看该作者
没想到ENIGMA还这么强大啊,没用过。
ecjtubaowp 发表于 2010-06-28 17:21



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

论坛徽章:
0
14 [报告]
发表于 2010-06-28 19:17 |只看该作者
AES

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
15 [报告]
发表于 2010-06-29 09:45 |只看该作者
本帖最后由 yulihua49 于 2010-06-29 09:59 编辑
AES
nhuczp 发表于 2010-06-28 19:17


能提供AES的demo吗?

简单异或的“乱度”:明文改变1比特,密文改变1比特。
ENIGMA1的“乱度”:明文改变1比特,密文改变1字节。
FRENZ的“乱度”:明文改变1比特,密文“半乱”,即变化字节后的都变了。
ENIGMA2的“乱度”:明文改变1比特,密文“全乱”
DES的“乱度”:明文改变1比特,密文改变一个分组。(56bit的是8字节,128bit的是16字节)
3DES的“乱度”:明文改变1比特,密文“半乱”,即变化字节后的分组都变了。
AES应该与DES差不多。

关于流媒体加密,还是建议用ENIGMA1。它虽然“乱度”小,但抗干扰。
如果流在网络传播,或存储与介质,难免有误码。一旦误码,高“乱度”的加密就全乱了。
ENIGMA1的速度是3DES的27倍,适合流加密。
AES据说比DES快,但不知到底如何。

由于AES和DES都是分组密钥,加密信息必须满足一个完整分组,这对流加密有点罗嗦。

论坛徽章:
0
16 [报告]
发表于 2010-06-29 10:49 |只看该作者
enigma1.c:里边用到的散列函数;
des_fcrypt,ssh_crc32是ssl里的,crcgen()是crc16,ccitt的,用别的也 ...
yulihua49 发表于 2010-06-28 17:25

为解决des_fcrypt,下了个openssl,发现里面定义一环套一环,移过来工作量太大了(要在arm上运行),只好放弃
Any way, thanks a lot.

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
17 [报告]
发表于 2010-07-04 18:08 |只看该作者
为解决des_fcrypt,下了个openssl,发现里面定义一环套一环,移过来工作量太大了(要在arm上运行),只好 ...
tajial 发表于 2010-06-29 10:49



    我有提纯的,可以arm用。

论坛徽章:
0
18 [报告]
发表于 2010-07-05 09:04 |只看该作者
回复 17# yulihua49
大侠 能发个么
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP