免费注册 查看新帖 |

Chinaunix

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

[文本处理] 请高手帮我用shell写一个加密程序 [复制链接]

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
41 [报告]
发表于 2014-09-17 15:38 |只看该作者
这是外包邀请吗?工期和价格怎么说?

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
42 [报告]
发表于 2014-09-17 15:52 |只看该作者
大神帮帮忙嘛。。。
以下是上面那个程序执行时的进程:
  1. 29139 pts/0    S      0:00 /bin/sh ./test.sh
  2. 29148 pts/0    S      0:00 hexdump -ve 4/1 "%d " "\n" NJS-2A72-01_20120516-1650.dmp
  3. 29149 pts/0    S      0:00 sed 1,128d;$d
  4. 29150 pts/0    S      0:00 /bin/sh ./test.sh
  5. 29151 pts/0    R      0:53 awk -v ord=3:2:1:4 -v key=00:00:A5:5E:C6:C9 -v l=4 -v ka=0x41C64E6D -v kb=0x3039 -v kc=0x80000000 functio
  6. n mod(p){return (p%256)}function div(p){return int(p/256)}function str_val(str,ret,chars,n,i,k,c){if (str ~ /^0[0-7]*$/){n=length(st
  7. r);ret=0;for(i=1;i<=n;i++){c=substr(str,i,1);if((k=index("01234567",c))>0)k--;ret=ret*8+k}}else if (str ~ /^0[xX][[:xdigit:]]+/){str
  8. =substr(str,3);n=length(str);ret=0;for(i=1;i<=n;i++){c=substr(str,i,1);c=tolower(c);if((k=index("0123456789",c))>0)k--;else if((k=in
  9. dex("abcdef",c))>0)k+=9;ret=ret*16+k}}else if(str ~ /^[-+]?([0-9]+([.][0-9]*([Ee][0-9]+)?)?|([.][0-9]+([Ee][-+]?[0-9]+)?))$/){ret=st
  10. r+0}else ret="NOT-A-NUMBER";return ret}function hex_ary(p,ary){p=str_val(p);ary="";while(p>0){ary=sprintf("%s:%d",ary,mod(p));p=div(
  11. p)}ary=substr(ary,2);return ary}BEGIN{split(key,ks,":");split(ord,o,":");for(i=1;i<=l;i++) k[i]=str_val(sprintf("%s%s","0x",ks[lengt
  12. h(ks)+1-o[i]]));split(hex_ary(ka),a,":");split(hex_ary(kb),b,":");split(hex_ary(kc),c,":");h=l;h=(h<length(a))?length(a):h;h=(h<leng
  13. th(b))?length(b):h;h=(h<length(c))?length(c):h}{for(i=1;i<=NF;i++) printf "%02X ",xor(k[i],$i);if (NF<l) exit;for(i=1;i<=2*h;i++)t[i
  14. ]=(i>length(b))?0:b[i];for(i=1;i<=l;i++) for(j=1;j<=length(a);j++){p=t[i+j-1]+k[o[i]]*a[j];t[i+j-1]=mod(p);t[i+j]+=div(p)}for(p=leng
  15. th(t);t[p]<1;p--);for(i=1;i<=length(c);i++) q[i]=t[p-length(c)+i];q[length(c)+1]=0;for(i=p;i-length(c)>=0;i--){while(q[length(q)]>=0
  16. ){for(j=1;j<=length(c);j++){q[j]-=c[j];q[j+1]=(q[j]<0)?q[j+1]-1:q[j+1];q[j]=mod(q[j]+256);}}for (j=1;j<=length(c);j++){q[j]+=c[j];q[
  17. j+1]=q[j+1]+div(q[j]);q[j]=mod(q[j]);}if (i>length(c)){for(j=length(q);j>1;j--) q[j]=q[j-1];q[1]=t[i-length(c)]}}for(i=1;i<=l;i++) k
  18. [o[i]]=q[i];}
复制代码
这次花了8分钟才解出来823K的文件:
  1. -rw-r--r-- 1 root root   823528 Jun 18  2012 NJS-2A72-01_20120516-1650.dmp
  2. -rw-r--r-- 1 root root   823011 Sep 17 15:45 NJS-2A72-01_20120516-1650.dmp.gz
  3. -rw-r--r-- 1 root root 10299555 Sep 17 15:45 NJS-2A72-01_20120516-1650.dmp.txt
复制代码
以前总要到Windows上去用一个Windows下开发的工具一个一个地解,现在可以用脚本直接在Linux下批量处理了。
本来觉得很完美了,就是速度太慢了,Windows下解基本上1秒1个,Linux下居然要8-9分钟才能解出来。。。

damcool 发表于 2014-09-17 15:38
这是外包邀请吗?工期和价格怎么说?

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
43 [报告]
发表于 2014-09-17 22:10 |只看该作者
Script和C拼执行效率,呵呵。
bikkuri 发表于 2014-09-17 15:52
大神帮帮忙嘛。。。
以下是上面那个程序执行时的进程:这次花了8分钟才解出来823K的文件:以前总要 ...

论坛徽章:
2
处女座
日期:2014-10-24 11:12:372015年辞旧岁徽章
日期:2015-03-03 16:54:15
44 [报告]
发表于 2014-09-17 22:29 |只看该作者
都是大神啊

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
45 [报告]
发表于 2014-09-18 11:51 |只看该作者
本帖最后由 damcool 于 2014-09-18 19:59 编辑

修改了大数除法的算法,一些其它优化,把效率提高了近3倍。900k文件2分多点。个人觉得很满意了!
更正大数求余,二分查找的一个bug.
encrypt.sh
  1. #!/bin/bash
  2. #key="$(ifconfig|grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'|head -1)"
  3. key="00:10:18:B1:FA:EF"
  4. #     ^  ^  ^  ^  ^  ^
  5. #     |  |  |  |  |  |
  6. #     6  5  4  3  2  1
  7. ord="3:2:1:4"
  8. src_file="Suzhou.mp4"
  9. length=4
  10. echo "The file size of $src_file is $(stat -c %s $src_file) bytes." >&2
  11. now=$(date +"%s")
  12. for char in $(hexdump -ve "$length/1 \"%d \" \"\n\"" "$src_file"|awk -v ord="$ord" -v key="$key" -v l=$length -v ka="0x41C64E6D" -v kb="0x3039" -v kc="0x80000000" -f encrypt.awk); do printf "\\x$char"; done
  13. end=$(date +"%s")
  14. echo "It took $((end-now)) seconds to complete!" >&2
复制代码
encrypt.awk
  1. function mod(p)
  2. {
  3.         return (p%256)
  4. }

  5. function div(p)
  6. {
  7.         return int(p/256)
  8. }

  9. function str_val(str,                ret, chars, n, i, k, c)
  10. {
  11.         if (str ~ /^0[0-7]*$/)
  12.         {
  13.                 # octal
  14.                 n = length(str)
  15.                 ret = 0
  16.                 for (i = 1; i <= n; i++) {
  17.                         c = substr(str, i, 1)
  18.                         if ((k = index("01234567", c)) > 0)
  19.                                 k-- # adjust for 1-basing in awk

  20.                         ret = ret * 8 + k
  21.                 }
  22.         }
  23.         else if (str ~ /^0[xX][[:xdigit:]]+/)
  24.         {
  25.                 # hexadecimal
  26.                 str = substr(str, 3)        # lop off leading 0x
  27.                 n = length(str)
  28.                 ret = 0
  29.                 for (i = 1; i <= n; i++) {
  30.                         c = substr(str, i, 1)
  31.                         c = tolower(c)
  32.                         if ((k = index("0123456789", c)) > 0)
  33.                                 k-- # adjust for 1-basing in awk
  34.                         else if ((k = index("abcdef", c)) > 0)
  35.                                 k += 9

  36.                         ret = ret * 16 + k
  37.                 }
  38.         }
  39.         else if (str ~ /^[-+]?([0-9]+([.][0-9]*([Ee][0-9]+)?)?|([.][0-9]+([Ee][-+]?[0-9]+)?))$/)
  40.         {
  41.                 # decimal number, possibly floating point
  42.                 ret = str + 0
  43.         }
  44.         else ret = "NOT-A-NUMBER"
  45.         return ret
  46. }

  47. function hex_ary(p,         ary)
  48. {
  49.         p=str_val(p);
  50.         ary="";
  51.         while(p>0)
  52.         {
  53.                 ary=sprintf("%s:%d",ary,mod(p));
  54.                 p=div(p)
  55.         }
  56.         ary=substr(ary,2);
  57.         return ary
  58. }

  59. function b_mul(a,b,c,   i,j,m,n)
  60. {
  61.         m=length(a);n=length(b);
  62.         for(i=1;i<=m;i++) for(j=1;j<=n;j++)
  63.         {
  64.                 c[i+j-1]+=a[i]*b[j];
  65.                 c[i+j]+=div(c[i+j-1])
  66.                 c[i+j-1]=mod(c[i+j-1]);
  67.         }
  68.         for(i=length(c);i>0;i--) if (i>1 && c[i]<1) delete c[i];
  69. }

  70. function ary_com(a,b,    i,m,n)
  71. {
  72.         m=length(a);n=length(b);
  73.         for(i=m;i>0;i--)
  74.         {
  75.                 if (i>n && a[i]>0) return 1;
  76.                 if (i<=n && a[i]>b[i]) return 1;
  77.                 if (i<=n && a[i]<b[i]) return -1;
  78.         }
  79.         return 0;
  80. }

  81. function b_mod(a,b,c, i,j,p,la,lb,lc,ll,rr,r)
  82. {
  83.         la=length(a);lb=length(b);
  84.         if ((la<2 && a[1]<1)||la<lb||(la==lb && a[la]<b[la]))
  85.         {
  86.                 split(sprintf("%0"la"d",0),c,"");
  87.                 for(i=1;i<la;i++)c[i]=a[i];
  88.                 return
  89.         }
  90.         split(sprintf("%0"(lb+1)"d",0),c,"");
  91.         for(i=1;i<=lb;i++) c[i]=a[la-lb+i];c[lb+1]=0;
  92.        
  93.         for (i=la;i>=lb;i--)
  94.         {
  95.                 p=0;
  96.                 if (c[lb+1]*256+c[lb]>=b[lb])
  97.                 {
  98.                         ll=0;rr=255;
  99.                         while(ll<=rr)
  100.                         {
  101.                                 pt=int((ll+rr)/2);
  102.                                 split(sprintf("%0"(lb+1)"d",0),r,"");
  103.                                 for (j=1;j<=lb;j++)
  104.                                 {
  105.                                         r[j]+=b[j]*pt;
  106.                                         r[j+1]+=div(r[j]);
  107.                                         r[j]=mod(r[j]);       
  108.                                 }
  109.                                 j=ary_com(c,r);
  110.                                 if (j==0)
  111.                                 {
  112.                                         p=pt;
  113.                                         break;
  114.                                 }
  115.                                 if (j<0) rr=pt-1
  116.                                 else ll=pt+1;
  117.                         }
  118.                         p=(j==0)?p:ll-1;
  119.                 }
  120.                 if (p>0)
  121.                 {
  122.                         for(j=1;j<=lb;j++)
  123.                         {
  124.                                 c[j]-=b[j]*p;
  125.                                 c[j+1]+=div(c[j]-255);
  126.                                 c[j]=mod(mod(c[j])+256);
  127.                         }
  128.                 }
  129.                 if (i>lb)
  130.                 {
  131.                         for(j=lb;j>0;j--) c[j+1]=c[j];
  132.                         c[1]=a[i-lb];
  133.                 }
  134.         }
  135. }

  136. BEGIN{
  137.         split(key,ks,":");
  138.         split(ord,o,":");
  139.         for(i=1;i<=l;i++) k[i]=str_val(sprintf("%s%s","0x",ks[length(ks)+1-o[i]]));
  140.         split(hex_ary(ka),a,":");
  141.         split(hex_ary(kb),b,":");
  142.         split(hex_ary(kc),c,":");
  143.         h=l;
  144.         la=length(a);
  145.         lb=length(b);
  146.         lc=length(c);
  147.         h=(h<la)?la:h;
  148.         h=(h<lb)?lb:h;
  149.         h=(h<lc)?lc:h;
  150. }
  151. {
  152.         for(i=1;i<=NF;i++) printf "%02X ",xor(k[i],$i)
  153.         if (NF<l) exit;
  154.        
  155.         #caculate k*a+b
  156.         now=systime();
  157.         delete t;
  158.         delete d;
  159.         for(i=1;i<=2*h;i++)t[i]=(i>lb)?0:b[i];
  160.         for(i=1;i<=l;i++) d[i]=k[o[i]];
  161.         b_mul(d,a,t)
  162.        
  163.        
  164.         end=systime()
  165.         kab+=end-now;

  166.         #caculate "%c"
  167.         now=systime();
  168.         b_mod(t,c,q);
  169.         end=systime()
  170.         kabc+=end-now
  171.         #get new key       
  172.         for(i=1;i<=l;i++) k[o[i]]=q[i];
  173. }
  174. END{
  175.         printf "[DEBUG:Caculation of (k*a+b) took %d seconds]\n",kab|"cat >&2";
  176.         printf "[DEBUG:Caculation of (k*a+b)%%c took %d seconds]\n",kabc|"cat >&2";       
  177. }
复制代码
  1. > date;sh encrypt.debug.sh|hexdump -C;date
  2. 2014年09月18日 11:44:52
  3. The file size of test is 13 bytes.
  4. [DEBUG:Caculation of (k*a+b) took 0 seconds]
  5. [DEBUG:Caculation of (k*a+b)%c took 0 seconds]
  6. It took 0 seconds to complete!
  7. 00000000  f9 9f 83 74 79 f9 ab 6d  7f a4 e1 4e df           |...ty..m...N.|
  8. 0000000d
  9. 2014年09月18日 11:44:52
  10. >
复制代码
  1. [@:~]> date;sh encrypt.debug.sh>test.awk.ret;date
  2. 2014年09月18日 19:50:31
  3. The file size of Suzhou.mp4 is 935748 bytes.
  4. [DEBUG:Caculation of (k*a+b) took 9 seconds]
  5. [DEBUG:Caculation of (k*a+b)%c took 101 seconds]
  6. It took 129 seconds to complete!
  7. 2014年09月18日 19:52:40
复制代码

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
46 [报告]
发表于 2014-09-18 12:49 |只看该作者
太感谢了!我慢慢消化一下。
看起来大数的除法最费时间啊!
81.62%的时间都花在大数除法上了。。。
Linux都那么费劲,这要让busybox来做,非累死小忙盒不可啊。。。

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
47 [报告]
发表于 2014-09-18 14:52 |只看该作者
本帖最后由 damcool 于 2014-09-18 17:50 编辑

修正错误,目前最快版。
encrypt.bc.sh
  1. #!/bin/bash
  2. length=4
  3. key="$(ifconfig|grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'|head -1|awk -F ":" -v l=$length '{for(i=1;i<=l;i++)printf"%s ",$(NF-4+i)}')"
  4. #key=$(echo "00:10:18:B1:FA:EF"|awk -F ":" -v l=$length '{for(i=1;i<=l;i++)printf"%s ",$(NF-4+i)}')
  5. #            ^  ^  ^  ^  ^  ^
  6. #            |  |  |  |  |  |
  7. #            6  5  4  3  2  1
  8. ord="3 2 1 4"
  9. src_file="Suzhou.mp4"
  10. file_size=$(stat -c %s $src_file)
  11. lines=$(((file_size+length-1)/length))
  12. ka="41C64E6D"
  13. kb="3039"
  14. kc="80000000"

  15. echo "The file size of $src_file is $(stat -c %s $src_file) bytes." >&2
  16. now=$(date +"%s")
  17. for char in $((echo "$lines $length $ord $key$ka $kb $kc"|bc -l encrypt.bc; hexdump -ve "$length/1 \"%d \" \"\n\"" "$src_file")|awk -v l=$lines 'NR>l{split(ks[NR-l],k," ");for(i=1;i<=NF;i++) printf"%02X ",xor($i,strtonum("0x"k[i]))}NR<=l{ks[NR]=$0}'); do printf "\\x$char"; done
  18. end=$(date +"%s")
  19. echo "It took $((end-now)) seconds to complete!" >&2
复制代码
encrypt.bc
  1. obase=16
  2. scale=0
  3. lines=read()
  4. len=read()
  5. for (i=1;i<=len;i++) ord[i]=read()
  6. ibase=16
  7. for (i=len;i>0;i--) k[ord[i]]=read()
  8. a=read()
  9. b=read()
  10. c=read()
  11. for(i=1;i<=len;i++) print k[i]," "
  12. print "\n"
  13. for(i=2;i<=lines;i++)
  14. {
  15.         t=0
  16.         for(j=len;j>0;j--) t=t*100+k[ord[j]]
  17.         t=(t*a+b)%c
  18.         for(j=1;j<=len;j++)
  19.         {
  20.                 k[ord[j]]=t%100
  21.                 t/=100
  22.         }
  23.         for(j=1;j<=len;j++) print k[j]," "
  24.         print "\n"
  25.        
  26. }
  27. quit
复制代码
Output
  1. [B49@B49-11:~]> date;sh encrypt.bc.sh>test.res;date
  2. 2014年09月18日 17:48:05
  3. The file size of Suzhou.mp4 is 935748 bytes.
  4. It took 59 seconds to complete!
  5. 2014年09月18日 17:49:04
  6. [B49@B49-11:~]>
复制代码

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
48 [报告]
发表于 2014-09-18 16:52 |只看该作者
本帖最后由 bikkuri 于 2014-09-18 19:54 编辑

太感谢了!看来还是用bc快啊。
您这段程序是把大数的乘除运算交给bc,先用bc把所有的key算出来,然后一次性用所有的key和明文进行异或加密对吧。
第一次见用bc写的程序,学习了!
哎,要是小忙盒里也自带有bc就好了。。。


damcool 发表于 2014-09-18 14:52
修正错误,目前最快版。

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
49 [报告]
发表于 2014-09-19 17:08 |只看该作者
不好意思,我还想请教一个问题,有什么办法可以把这两个文件合并成一个文件吗?
我尝试把bc的那个文件写成sh文件里的子程序,但是好像总是运行不正常,不知道是哪里错了。

damcool 发表于 2014-09-18 14:52
修正错误,目前最快版。
encrypt.bc.shencrypt.bcOutput

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
50 [报告]
发表于 2014-09-19 21:22 |只看该作者
来点刺激的,AWK版进入最快行列,效率几乎又提高了一倍。
encrypt.awk.sh
  1. #!/bin/bash
  2. key="$(ifconfig|grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'|head -1)"
  3. #key="00:10:18:B1:FA:EF"
  4. #     ^  ^  ^  ^  ^  ^
  5. #     |  |  |  |  |  |
  6. #     6  5  4  3  2  1
  7. ord="3:2:1:4"
  8. src_file="Suzhou.mp4"
  9. length=4
  10. echo "The file size of $src_file is $(stat -c %s $src_file) bytes." >&2
  11. now=$(date +"%s")
  12. for char in $(hexdump -ve "$length/1 \"%d \" \"\n\"" "$src_file"|awk -v ord="$ord" -v key="$key" -v l=$length -v ka="0x41C64E6D" -v kb="0x3039" -v kc="0x80000000" -f encrypt.awk); do printf "\\x$char"; done
  13. end=$(date +"%s")
  14. echo "It took $((end-now)) seconds to complete!" >&2
复制代码
encrypt.awk
  1. function mod(p)
  2. {
  3.         return (p%256)
  4. }

  5. function div(p)
  6. {
  7.         return int(p/256)
  8. }

  9. function str_val(str,                ret, chars, n, i, k, c)
  10. {
  11.         if (str ~ /^0[0-7]*$/)
  12.         {
  13.                 # octal
  14.                 n = length(str)
  15.                 ret = 0
  16.                 for (i = 1; i <= n; i++) {
  17.                         c = substr(str, i, 1)
  18.                         if ((k = index("01234567", c)) > 0)
  19.                                 k-- # adjust for 1-basing in awk

  20.                         ret = ret * 8 + k
  21.                 }
  22.         }
  23.         else if (str ~ /^0[xX][[:xdigit:]]+/)
  24.         {
  25.                 # hexadecimal
  26.                 str = substr(str, 3)        # lop off leading 0x
  27.                 n = length(str)
  28.                 ret = 0
  29.                 for (i = 1; i <= n; i++) {
  30.                         c = substr(str, i, 1)
  31.                         c = tolower(c)
  32.                         if ((k = index("0123456789", c)) > 0)
  33.                                 k-- # adjust for 1-basing in awk
  34.                         else if ((k = index("abcdef", c)) > 0)
  35.                                 k += 9

  36.                         ret = ret * 16 + k
  37.                 }
  38.         }
  39.         else if (str ~ /^[-+]?([0-9]+([.][0-9]*([Ee][0-9]+)?)?|([.][0-9]+([Ee][-+]?[0-9]+)?))$/)
  40.         {
  41.                 # decimal number, possibly floating point
  42.                 ret = str + 0
  43.         }
  44.         else ret = "NOT-A-NUMBER"
  45.         return ret
  46. }

  47. function hex_ary(p,         ary)
  48. {
  49.         p=str_val(p);
  50.         ary="";
  51.         while(p>0)
  52.         {
  53.                 ary=sprintf("%s:%d",ary,mod(p));
  54.                 p=div(p)
  55.         }
  56.         ary=substr(ary,2);
  57.         return ary
  58. }

  59. function b_mul(a,b,c,   i,j,m,n)
  60. {
  61.         m=length(a);n=length(b);
  62.         for(i=1;i<=m;i++) for(j=1;j<=n;j++)
  63.         {
  64.                 c[i+j-1]+=a[i]*b[j];
  65.                 c[i+j]+=div(c[i+j-1])
  66.                 c[i+j-1]=mod(c[i+j-1]);
  67.         }
  68.         for(i=length(c);c[i]<1&&i>1;i--) delete c[i];
  69. }

  70. BEGIN{
  71.         split(key,ks,":");
  72.         split(ord,o,":");
  73.         for(i=1;i<=l;i++) k[i]=str_val(sprintf("%s%s","0x",ks[length(ks)+1-o[i]]));
  74.         split(hex_ary(ka),a,":");
  75.         split(hex_ary(kb),b,":");
  76.         split(hex_ary(kc),c,":");
  77.         h=l;
  78.         la=length(a);
  79.         lb=length(b);
  80.         lc=length(c);
  81.         h=(h<la)?la:h;
  82.         h=(h<lb)?lb:h;
  83.         h=(h<lc)?lc:h;
  84.         ta=str_val(ka);
  85.         tb=str_val(kb);
  86.         tc=str_val(kc);
  87.        
  88. }
  89. {
  90.         for(i=1;i<=NF;i++) printf "%02X ",xor(k[i],$i)
  91.         if (NF<l) exit;
  92.        
  93.         #caculate k*a+b
  94.         now=systime();
  95.         tk=0;for(i=l;i>0;i--)tk=tk*256+k[o[i]];       
  96.         delete t;
  97.         delete d;
  98.         for(i=1;i<=2*h;i++)t[i]=(i>lb)?0:b[i];
  99.         for(i=1;i<=l;i++) d[i]=k[o[i]];
  100.         b_mul(d,a,t)
  101.        
  102.         end=systime()
  103.         kab+=end-now;

  104.         #caculate "%c"
  105.         now=systime();
  106.         delete p;
  107.         tp=int((tk*ta+tb)/tc);i=1;
  108.         while(tp>0)
  109.         {
  110.                 p[i++]=mod(tp);
  111.                 tp=div(tp);
  112.         }
  113.         delete q;
  114.         b_mul(p,c,q);
  115.         m=length(q);
  116.         for(i=1;i<=m;i++)
  117.         {
  118.                 t[i]-=q[i];
  119.                 t[i+1]-=(t[i]<0);
  120.                 t[i]=mod(t[i]+256);                               
  121.         }
  122.         for(i=length(t);t[i]<1&&i>1;i--) delete t[i];
  123.         end=systime()
  124.         kabc+=end-now
  125.         #get new key       
  126.         for(i=1;i<=l;i++) k[o[i]]=t[i];
  127. }
  128. END{
  129.         printf "[DEBUG:Caculation of (k*a+b) took %d seconds]\n",kab|"cat >&2";
  130.         printf "[DEBUG:Caculation of (k*a+b)%%c took %d seconds]\n",kabc|"cat >&2";       
  131. }
复制代码
Output
  1. [B@B:~]> date;sh encrypt.awk.sh>test.awk.ret;date
  2. 2014年09月19日 21:20:50
  3. The file size of Suzhou.mp4 is 935748 bytes.
  4. [DEBUG:Caculation of (k*a+b) took 8 seconds]
  5. [DEBUG:Caculation of (k*a+b)%c took 10 seconds]
  6. It took 42 seconds to complete!
  7. 2014年09月19日 21:21:32
  8. [B@B:~]>
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP