免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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
21 [报告]
发表于 2014-09-15 13:09 |只看该作者
本帖最后由 bikkuri 于 2014-09-15 14:30 编辑

这段代码我在标准的Linux上试了也是会出错,不能正常运行。
不过用3个字节加密的程序有那个busybox版本就可以了。
但是我还需要一个在标准Linux上的用4个字节进行加密的程序。

1、首先取得密钥,为第一块网卡的MAC地址的后四个16进制数;
  1. [root@hp8 ~]# ifconfig eth0
  2. eth0      Link encap:Ethernet  HWaddr 00:10:18:B1:FA:EF
  3.            inet addr:135.254.61.22  Bcast:135.254.61.255  Mask:255.255.255.0
  4.            inet6 addr: fe80::210:18ff:feb1:faef/64 Scope:Link
  5.            UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
  6.            RX packets:8326316 errors:0 dropped:0 overruns:0 frame:0
  7.            TX packets:6040424 errors:0 dropped:0 overruns:0 carrier:0
  8.            collisions:0 txqueuelen:1000
  9.            RX bytes:1991795946 (1.8 GiB)  TX bytes:776627751 (740.6 MiB)
  10.            Interrupt:28
复制代码
2、即最开始的key=18B1FAEF;
3、假设要加密的文件内容为一个13个字符长度的文本文件:
[root@hp8 ~]# echo "Hello World!" > test
[root@hp8 ~]# cat test |hexdump -C
00000000  48 65 6c 6c 6f 20 57 6f  72 6c 64 21 0a           |Hello World!.|
4、从要加密的文件中取最开始的四个字节48,65,6C和6C,然后和第2步中四个字节的密钥18,B1,FA和EF,按如下方式加密:
byte1 XOR key2: 48 XOR B1 = F9
byte2 XOR key3: 65 XOR FA = 9F
byte3 XOR key4: 6C XOR EF = 83
byte4 XOR key1: 6C XOR 18 = 74
即可得到密文的最开始四个字节为F9,9F,83和74。
5、对上次加密用的密钥进行如下操作,得到下一次加密用的密钥:
newkey=(oldkey*41C64E6D+3039) mod 80000000: (18B1FAEF*41C64E6D+3039) mod 80000000 = 0216D9FC
即可得到下一次加密用的密钥为02,16,D9和FC。
6、重复步骤4,从要加密的文件中取出后面的四个字节6F,20,57和6F,然后和第5步中得到的四个字节的密钥02,16,D9和FC,进行加密:
byte1 XOR key2: 6F XOR 16 = 79
byte2 XOR key3: 20 XOR D9 = F9
byte3 XOR key4: 57 XOR FC = AB
byte4 XOR key1: 6F XOR 02 = 6D
即可得到密文接下来的四个字节为79,F9,AB和6D。
7、继续重复以上步骤直到处理完要加密的文件的所有字节。
newkey=(oldkey*41C64E6D+3039) mod 80000000: (0216D9FC*41C64E6D+3039) mod 80000000 = 6F0DC885
byte1 XOR key2: 72 XOR 0D = 7F
byte2 XOR key3: 6C XOR C8 = A4
byte3 XOR key4: 64 XOR 85 = E1
byte4 XOR key1: 21 XOR 6F = 4E
newkey=(oldkey*41C64E6D+3039) mod 80000000: (6F0DC885*41C64E6D+3039) mod 80000000 = 57D516DA
byte1 XOR key2: 0A XOR D5 = DF
8、最后可以得到密文的全部内容为:
F9 9F 83 74 79 F9 AB 6D 7F A4 E1 4E DF
9、将上述16进制数以二进制形式保存为13个字符长度的密文文件test.crypt

那这个4个字节的加密程序应该怎么写呢?
谢谢。

damcool 发表于 2014-09-13 19:03
写了个主要的部分,看看是否合适?

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
22 [报告]
发表于 2014-09-15 16:04 |只看该作者
本帖最后由 damcool 于 2014-09-15 16:04 编辑
  1. #!/bin/bash
  2. key="$(ifconfig|grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'|head -1)"
  3. #key="0:3:ba:26:1:b0"
  4. #    ^ ^  ^  ^ ^  ^
  5. #    | |  |  | |  |
  6. #    6 5  4  3 2  1
  7. ord="3:2:1:4"
  8. file="test"
  9. length=4
  10. hexdump -ve "$length/1 \"%d \" \"\n\"" "$file"|awk -v ord="$ord" -v key="$key" -v l=$length -v a="41C64E6D" -v b="3039" -v c="80000000" 'BEGIN{n=split(key,ks,":");m=split(ord,o,":");for(i=1;i<=l;i++) k[i]=("0x"ks[n+1-o[i]])+0;a=("0x"a)+0;b=("0x"b)+0;c=("0x"c)+0}{for(i=1;i<=NF;i++) printf "%02X ",xor(k[i],$i);t=0;for(i=l;i>0;i--)t=t*256+k[o[i]];t=(t*a+b)%c;for(i=1;i<=l;i++){k[o[i]]=t%256;t=int(t/256)}}'
复制代码
是个思路,但是由于大数乘法的误差造成和你结果的不一致.busybox版本

论坛徽章:
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
23 [报告]
发表于 2014-09-15 19:21 |只看该作者
本帖最后由 bikkuri 于 2014-09-16 14:23 编辑

谢谢您的回复。
这段代码在busybox上可以正确执行,结果虽然有误差但是问题不大!
我参照您的代码,做了如下的改动:
  1. #!/bin/bash
  2. key="$(ifconfig|grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'|head -1)"
  3. #key="0:3:ba:26:1:b0"
  4. #    ^ ^  ^  ^ ^  ^
  5. #    | |  |  | |  |
  6. #    6 5  4  3 2  1
  7. ord="3:2:1:4"
  8. file="test"
  9. length=4

  10. encore(){
  11. for buff in $(hexdump -ve "$length/1 \"%d \" \"\n\"" |awk -v ord="$ord" -v key="$1" -v l=$length -v a="41C64E6D" -v b="3039" -v c="80000000" 'BEGIN{n=split(key,ks,":");m=split(ord,o,":");for(i=1;i<=l;i++) k[i]=("0x"ks[n+1-o[i]])+0;a=("0x"a)+0;b=("0x"b)+0;c=("0x"c)+0}{for(i=1;i<=NF;i++) printf "\\x%02X ",xor(k[i],$i);t=0;for(i=l;i>0;i--)t=t*256+k[o[i]];t=(t*a+b)%c;for(i=1;i<=l;i++){k[o[i]]=t%256;t=int(t/256)}}');do printf "$buff"; done
  12. }
  13. cat $file|encore $key|hexdump -C
复制代码
执行结果如下:
  1. root@kbox:/tmp# key=00:10:18:B1:FA:EF
  2. root@kbox:/tmp# echo $key
  3. 00:10:18:B1:FA:EF
  4. root@kbox:/tmp# cat $file|encore $key|hexdump -C
  5. 00000000  f9 9f 83 74 79 fa 57 6d  4b 70 5c 57 93           |...ty.WmKp\W.|
  6. 0000000d
  7. root@kbox:/tmp#
复制代码
可以看到输出结果和21楼我手工计算的结果是不太一样的。
  1. 21楼:F9 9F 83 74 79 F9 AB 6D 7F A4 E1 4E DF
  2. 23楼:f9 9f 83 74 79 fa 57 6d 4b 70 5c 57 93
  3. --------------------------------------------
  4.       √  √  √  √  √  x  x  √  x  x  x  x  x
复制代码
但是没有问题,因为这个加密程序再以同样的密钥执行一次就可以解密。
因为大数相乘的误差只发生在密钥上,所以再执行一次这个误差会继续发生在密钥上,所以加密的误差和解密的误差可以相互抵消。
  1. root@kbox:/tmp# cat $file|encore $key|encore $key|hexdump -C
  2. 00000000  48 65 6c 6c 6f 20 57 6f  6c 72 64 21 0a           |Hello Wolrd!.|
  3. 0000000d
  4. root@kbox:/tmp#
复制代码
当然如果能避免这个误差就最好了,因为在Windows上的同样算法的加密程序是没有误差的。
这样可能会造成Windows版和Busybox版的加密程序不兼容。
Busybox上加密的可以在Busybox上解,但是不能在Windows上解。

但是这段代码在Linux上却不能正确执行。
以下是在Linux上的执行结果:
  1. [root@hp8 ~]# key="$(ifconfig|grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'|head -1)"
  2. [root@hp8 ~]# echo $key
  3. 00:10:18:B1:FA:EF
  4. [root@hp8 ~]#
  5. [root@hp8 ~]# ord="3:2:1:4"
  6. [root@hp8 ~]# file="test"
  7. [root@hp8 ~]# length=4
  8. [root@hp8 ~]# cat $file
  9. Hello World!
  10. [root@hp8 ~]# cat $file|hexdump -C
  11. 00000000  48 65 6c 6c 6f 20 57 6f  72 6c 64 21 0a           |Hello World!.|
  12. 0000000d
  13. [root@hp8 ~]#
  14. [root@hp8 ~]# cat $file|encore $key|hexdump -C
  15. awk: (FILENAME=- FNR=1) fatal: division by zero attempted in `%'
  16. 00000000  48 65 6c 6c                                       |Hell|
  17. 00000004
  18. [root@hp8 ~]#
  19. [root@hp8 ~]#
复制代码
可以看到您的代码只是原样输出了明文的第一组4个字节,然后在处理第二组4个字节的时候报了被零除的错误。
这次能帮我写一个Linux版的4个字节的加密程序吗?
在Linux上应该不会有大数乘法误差的问题吧?至少可以用bc吧?
非常感谢!

damcool 发表于 2014-09-15 16:04
是个思路,但是由于大数乘法的误差造成和你结果的不一致.busybox版本

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

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="test"
  9. length=4
  10. 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
复制代码
encrypt.awk
  1. function mod(p)
  2. {
  3.         return (p%256)
  4. }

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

  9. #Copied from http://langevin.univ-tln.fr/cours/COMPIL/tps/awk.html#Strtonum-Function
  10. function str_val(str,                ret, chars, n, i, k, c)
  11. {
  12.         if (str ~ /^0[0-7]*$/)
  13.         {
  14.                 # octal
  15.                 n = length(str)
  16.                 ret = 0
  17.                 for (i = 1; i <= n; i++) {
  18.                         c = substr(str, i, 1)
  19.                         if ((k = index("01234567", c)) > 0)
  20.                                 k-- # adjust for 1-basing in awk

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

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

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

  60. BEGIN{
  61.         split(key,ks,":");
  62.         split(ord,o,":");
  63.         for(i=1;i<=l;i++) k[i]=str_val(sprintf("%s%s","0x",ks[length(ks)+1-o[i]]));
  64.         split(hex_ary(ka),a,":");
  65.         split(hex_ary(kb),b,":");
  66.         split(hex_ary(kc),c,":");
  67.         h=l;
  68.         h=(h<length(a))?length(a):h;
  69.         h=(h<length(b))?length(b):h;
  70.         h=(h<length(c))?length(c):h
  71. }
  72. {
  73.         for(i=1;i<=NF;i++) printf "%02X ",xor(k[i],$i);
  74.         if (NF<l) exit;
  75.        
  76.         #caculate k*a+b
  77.         for(i=1;i<=2*h;i++)t[i]=(i>length(b))?0:b[i];
  78.         for(i=1;i<=l;i++) for(j=1;j<=length(a);j++)
  79.         {
  80.                 p=t[i+j-1]+k[o[i]]*a[j];
  81.                 t[i+j-1]=mod(p);
  82.                 t[i+j]+=div(p)
  83.         }

  84.         #caculate "%c"
  85.         for(p=length(t);t[p]<1;p--);
  86.         for(i=1;i<=length(c);i++) q[i]=t[p-length(c)+i];
  87.         q[length(c)+1]=0;
  88.         for(i=p;i-length(c)>=0;i--)
  89.         {
  90.                 while(q[length(q)]>=0)
  91.                 {
  92.                         for (j=1;j<=length(c);j++)
  93.                         {
  94.                                 q[j]-=c[j];
  95.                                 q[j+1]=(q[j]<0)?q[j+1]-1:q[j+1];
  96.                                 q[j]=mod(q[j]+256);       
  97.                         }       
  98.                 }
  99.                 for (j=1;j<=length(c);j++)
  100.                 {
  101.                         q[j]+=c[j];
  102.                         q[j+1]=q[j+1]+div(q[j]);
  103.                         q[j]=mod(q[j]);       
  104.                 }       
  105.                
  106.                 if (i>length(c))
  107.                 {
  108.                         for(j=length(q);j>1;j--) q[j]=q[j-1];
  109.                         q[1]=t[i-length(c)]
  110.                 }               
  111.         }

  112.         #get new key       
  113.         for(i=1;i<=l;i++) k[o[i]]=q[i];
  114. }
复制代码
set key="00:10:18:B1:FA:EF"
  1. $ more test
  2. Hello World!

  3. $ sh encrypt.sh|hexdump -C
  4. 00000000  f9 9f 83 74 79 f9 ab 6d  7f a4 e1 4e df           |...ty..m...N.|
  5. 0000000d
复制代码

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
25 [报告]
发表于 2014-09-16 14:57 |只看该作者
上面是busybox/正常bash环境通用版,顺便复习了一下大数乘除法。

论坛徽章:
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
26 [报告]
发表于 2014-09-16 18:24 |只看该作者
本帖最后由 bikkuri 于 2014-09-16 18:38 编辑

谢谢您的帮助!
我在Linux和Busybox上都试过了。
在Linux服务器上可以很快地得到正确结果。
但是我在3个CPU为400MHz,内存32M,MIPS体系结构的Busybox上试这个程序,都是5秒钟后进程被系统杀死了?!
  1. root@sbox:/tmp# 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
  2. Killed
  3. Hellroot@sbox:/tmp#
  4. root@sbox:/tmp# 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|hexdump -C
  5. Killed
  6. 00000000  48 65 6c 6c                                       |Hell|
  7. 00000004
  8. root@sbox:/tmp#
复制代码
从输出的结果上判断,还是和上次的结果一样,先输出了第一组4个字节的明文,然后在处理第2组4个字节的时候碰到被零除的错误,Busybox不会报这个被零除的错,而是直接把进程杀掉了。
但是我在另外一个CPU 800MHz,内存256M,ARM体系结构的Busybox上,却可以正常得到正确结果。
  1. root@nbox:/tmp/tmp# 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|hexdump -C
  2. 00000000  f9 9f 83 74 79 f9 ab 6d  7f a4 e1 4e df           |...ty..m...N.|
  3. 0000000d
  4. root@nbox:/tmp/tmp#
复制代码
难道这个awk程序里面有MIPS不支持的命令?

damcool 发表于 2014-09-16 14:57
上面是busybox/正常bash环境通用版,顺便复习了一下大数乘除法。

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

http://www.busybox.net/oldnews.html
27 January 2010 -- BusyBox 1.16.0 (unstable)

BusyBox 1.16.0. (git, patches, how to add a patch)

Sizes of busybox-1.16.0 and busybox-1.15.3 (with equivalent config, static uclibc build):

   text    data     bss     dec     hex filename
816619     453    7436  824508   c94bc busybox-1.15.3/busybox
812074     453    7300  819827   c8273 busybox-1.16.0/busybox

Changes since previous release:

New applets:

    lspci: new applet. +573 bytes. By Souf Oued (souf_oued AT yahoo.fr)
    lsusb: new applet. +400 bytes. By Souf Oued (souf_oued AT yahoo.fr)
    flashcp: new applet. +900 bytes. By Stefan Seyfried (stefan.seyfried AT googlemail.com)
    mkfs.reiser: new applet. Needs much polishing. By Vladimir Dronnikov (dronnikov AT gmail.com)
    mkfs_ext2: new applet. By Vladimir Dronnikov (dronnikov AT gmail.com)
    ntpd: new applet, +5k. By Adam Tkac (vonsch AT gmail.com)
    traceroute6: new applet. +1562 bytes. By Leonid Lisovskiy (lly.dev AT gmail.com)
    tune2fs: new applet by Vladimir. Only supports -L LABEL
    wall: new applet. By Bernhard Reutner-Fischer (rep.dot.nop AT gmail.com)

Other changes:

    ash,hush: check that variable names are sane
    .....................................................
    .....................................................
    .....................................................
    .....................................................
    ar: fix long filenames handling. Closes bug 611
    awk: fix a case when number is treated as string. Closes bug 725
    awk: implement mktime. By Leonid Lisovskiy (lly.dev AT gmail.com)
    chown: support long options. By Matheus Izvekov (mizvekov AT gmail.com)
    .....................................................
    .....................................................
    .....................................................
    .....................................................
    .....................................................
    wget: fix for code 302. By Vladimir Dronnikov (dronnikov AT gmail.com)
    [un]expand: unicode support. By Tomas Heinrich (heinrich.tomas AT gmail.com)

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
28 [报告]
发表于 2014-09-16 19:14 |只看该作者
把你的输出贴出来看看
encrypt.debug.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="test"
  9. length=4
  10. 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.debug.awk
复制代码
encrypt.debug.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. BEGIN{
  60.         split(key,ks,":");
  61.         split(ord,o,":");
  62.         for(i=1;i<=l;i++) k[i]=str_val(sprintf("%s%s","0x",ks[length(ks)+1-o[i]]));
  63.         printf"\n[DEBUG:k[o[n]]=0x";for(i=length(k);i>0;i--) printf "%02x",k[o[i]];printf"]\n";
  64.         split(hex_ary(ka),a,":");
  65.         printf"\n[DEBUG:a[n]=0x";for(i=length(a);i>0;i--) printf "%02x",a[i];printf"]\n";
  66.         split(hex_ary(kb),b,":");
  67.         printf"\n[DEBUG:b[n]=0x";for(i=length(b);i>0;i--) printf "%02x",b[i];printf"]\n";
  68.         split(hex_ary(kc),c,":");
  69.         printf"\n[DEBUG:c[n]=0x";for(i=length(c);i>0;i--) printf "%02x",c[i];printf"]\n";
  70.         h=l;
  71.         h=(h<length(a))?length(a):h;
  72.         h=(h<length(b))?length(b):h;
  73.         h=(h<length(c))?length(c):h
  74. }
  75. {
  76.         for(i=1;i<=NF;i++) printf "%02X ",xor(k[i],$i);
  77.         if (NF<l) exit;
  78.        
  79.         #caculate k*a+b
  80.         for(i=1;i<=2*h;i++)t[i]=(i>length(b))?0:b[i];
  81.         for(i=1;i<=l;i++) for(j=1;j<=length(a);j++)
  82.         {
  83.                 p=t[i+j-1]+k[o[i]]*a[j];
  84.                 t[i+j-1]=mod(p);
  85.                 t[i+j]+=div(p)
  86.         }

  87.         printf"\n[DEBUG:k*a+b=0x";for(i=length(t);i>0;i--) printf "%02x",t[i];printf"]\n";

  88.         #caculate "%c"
  89.         for(p=length(t);t[p]<1;p--);
  90.         for(i=1;i<=length(c);i++) q[i]=t[p-length(c)+i];
  91.         q[length(c)+1]=0;
  92.         for(i=p;i-length(c)>=0;i--)
  93.         {
  94.                 while(q[length(q)]>=0)
  95.                 {
  96.                         for (j=1;j<=length(c);j++)
  97.                         {
  98.                                 q[j]-=c[j];
  99.                                 q[j+1]=(q[j]<0)?q[j+1]-1:q[j+1];
  100.                                 q[j]=mod(q[j]+256);       
  101.                         }       
  102.                 }
  103.                 for (j=1;j<=length(c);j++)
  104.                 {
  105.                         q[j]+=c[j];
  106.                         q[j+1]=q[j+1]+div(q[j]);
  107.                         q[j]=mod(q[j]);       
  108.                 }       
  109.                
  110.                 if (i>length(c))
  111.                 {
  112.                         for(j=length(q);j>1;j--) q[j]=q[j-1];
  113.                         q[1]=t[i-length(c)]
  114.                 }               
  115.         }
  116.         printf"\n[DEBUG:(k*a+b)%%c=0x";for(i=length(q);i>0;i--) printf "%02x",q[i];printf"]\n";

  117.         #get new key       
  118.         for(i=1;i<=l;i++) k[o[i]]=q[i];
  119. }
复制代码
Output
  1. $ sh encrypt.debug.sh

  2. [DEBUG:k[o[n]]=0x18b1faef]

  3. [DEBUG:a[n]=0x41c64e6d]

  4. [DEBUG:b[n]=0x3039]

  5. [DEBUG:c[n]=0x80000000]
  6. F9 9F 83 74
  7. [DEBUG:k*a+b=0x065851ef8216d9fc]

  8. [DEBUG:(k*a+b)%c=0x000216d9fc]
  9. 79 F9 AB 6D
  10. [DEBUG:k*a+b=0x00896ba96f0dc885]

  11. [DEBUG:(k*a+b)%c=0x006f0dc885]
  12. 7F A4 E1 4E
  13. [DEBUG:k*a+b=0x1c88869857d516da]

  14. [DEBUG:(k*a+b)%c=0x0057d516da]
  15. DF
  16. $
复制代码

论坛徽章:
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
29 [报告]
发表于 2014-09-16 19:29 |只看该作者
  1. root@sbox:/tmp/tmp# sh encrypt.debug.sh

  2. [DEBUG:k[o[n]]=0x]

  3. [DEBUG:a[n]=0x]

  4. [DEBUG:b[n]=0x]

  5. [DEBUG:c[n]=0x]
  6. 48 65 6C 6C
  7. [DEBUG:k*a+b=0x]
复制代码
运行到这里就停住不动了。

回复 27# damcool


   

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
30 [报告]
发表于 2014-09-16 19:30 |只看该作者
busybox 版本是多少?
bikkuri 发表于 2014-09-16 19:29
运行到这里就停住不动了。

回复 27# damcool
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP