免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 13161 | 回复: 71
打印 上一主题 下一主题

[文本处理] 请高手帮我用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
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-12 23:14 |只看该作者 |倒序浏览
本帖最后由 bikkuri 于 2014-09-13 07:50 编辑

大家好!
我有一个问题向大家请教。
我想请高手帮我写这样一个加密程序:
1、首先取得密钥,为第一块网卡的MAC地址的后三个16进制数;
root@kbox:~# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 4C:E6:76:CC:62:1E
          inet addr:192.168.1.103  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1150538 errors:0 dropped:776 overruns:0 frame:0
          TX packets:1146494 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:712326959 (679.3 MiB)  TX bytes:247278904 (235.8 MiB)
2、即最开始的key=CC621E;
3、假设要加密的文件内容为一个13个字符长度的文本文件:
root@kbox:~# echo "Hello World!" > a
root@kbox:~# cat a |hexdump -C
00000000  48 65 6c 6c 6f 20 57 6f  72 6c 64 21 0a           |Hello World!.|
4、从要加密的文件中取最开始的三个字节48,65和6C,然后和第2步中三个字节的密钥CC,62,1E,按如下方式加密:
byte1 XOR key3: 48 XOR 1E = 56
byte2 XOR key2: 65 XOR 62 = 07
byte3 XOR key1: 6C XOR CC = A0
即可得到密文的最开始三个字节为56,07和A0。
5、对上次加密用的密钥进行如下操作,得到下一次加密用的密钥:
newkey=(oldkey*123456+ABCD) mod 800000: (CC621E*123456+ABCD) mod 800000 = 33B9E1
即可得到下一次加密用的密钥为33,B9和E1。
6、重复步骤4,从要加密的文件中取出后面的三个字节6C,6F和20,然后和第5步中得到的三个字节的密钥33,B9和E1,进行加密:
byte1 XOR key3: 6C XOR E1 = 8D
byte2 XOR key2: 6F XOR B9 = D6
byte3 XOR key1: 20 XOR 33 = 13
即可得到密文接下来的三个字节为8D,D6和13
7、继续重复以上步骤直到处理完要加密的文件的所有字节。
newkey=(oldkey*123456+ABCD) mod 800000: (33B9E1*123456+ABCD) mod 800000 = 74D163
byte1 XOR key3: 57 XOR 63 = 34
byte2 XOR key2: 6F XOR D1 = BE
byte3 XOR key1: 72 XOR 74 = 06
newkey=(oldkey*123456+ABCD) mod 800000: (74D163*123456+ABCD) mod 800000 = 3D1F0F
byte1 XOR key3: 6C XOR 0F = 63
byte2 XOR key2: 64 XOR 1F = 7B
byte3 XOR key1: 21 XOR 3D = 1C
newkey=(oldkey*123456+ABCD) mod 800000: (3D1F0F*123456+ABCD) mod 800000 = 6626D7
byte1 XOR key3: 0A XOR D7 = DD
8、最后可以得到密文的全部内容为:
56 07 A0 8D D6 13 34 BE 06 63 7B 1C DD
9、将上述16进制数以二进制形式保存为13个字符长度的密文文件a.crypt
希望大家不吝赐教!
我自己也会尝试来写,希望大家互相切磋,共同进步。
在这里特别呼唤damcool大侠,之前得到您很多指点和帮助,不知道这次您能不能再次出手相助?
非常感谢!





论坛徽章:
3
丑牛
日期:2014-09-13 18:19:22摩羯座
日期:2014-10-10 17:43:02水瓶座
日期:2014-10-16 01:00:22
2 [报告]
发表于 2014-09-13 02:16 |只看该作者
[ 本帖最后由 李满满 于 2014-09-13 02:18 编辑 ]

学生党:飘过~大家验证一下吧~**玩耍中....
[root@b10-1b ~]# cat yhsafe.sh
#!/bin/bash
#just for fun - [url]www.yhsafe.net[/url]
hdpfile=${1}
#原始KEY
org_key=$(ifconfig |awk '/eth0/{l=split($0,M,":");print M[l-2]M[l-1]M[l]}')
#简单判断
if [ $# -ne 1 ];then
        echo -e "\033[31;40mUsage:./yhsafe.sh <dumpfilename>\033[0m"
        exit $?
fi
#AWK取异或值
function gck_key(){
for ((x=0;x<=4;x+=2))
do
        res_yhf=`awk -vOK=${1:$x:2} -vCK=${2:4-$x:2} 'BEGIN{printf("%X",res=(xor(OK,CK)<10)?"0"(xor(OK,CK)):xor(OK,CK))}'`
        sum_key=${sum_key}${res_yhf}
done
echo ${sum_key}
}
#计算16进制DUMP重算值
function gok_key(){
        echo $(echo $(((16#${1}*16#123456+16#ABCD)%16#800000))|awk '{printf("%x",$0)}')
}
#简单循环3人组
for x_key in `cat ${hdpfile}| hexdump -C|cut -c10-60|sed -r 's/^ //;s/[[:space:]]+/ /g'|xargs -n 3|tr -d " "`
do
        #记录最终KEY字符串
        fnl_key=${fnl_key}$(gck_key ${org_key} ${x_key})
        #每次循环取下次DUMP重算KEY
        org_key=$(gok_key ${x_key})
done
#简单输出测试
echo -e "\033[31;40mEncry--------------------------------------------------------------------------STA\033[0m"
echo "obase=2;${fnl_key}"|bc
echo -e "\033[31;40mEncry--------------------------------------------------------------------------End\033[0m"

测试:
[root@b10-1b opt]# ./yhsafe.sh /root/.bashrc
Encry--------------------------------------------------------------------------STA
11110001101000110000111011011110111110001110110011100010100000110000\
00001010111110110101001100111001101011110001011100100001100110010110\
10011001110101010101010111101001111100010000110100110010010110011100\
00011100000001101100111000101001011010001001110011000101101010100111\
01010010101110000011011111110101000111111101111010110101101000011010\
10000101101111100111000011010001111000111110111010001000010110110011\
01011000011101101010001000110110111010110110011011011111000110000011\
10010000100111011010110001101001000111101011111000000100010011110110\
00000011001001110110011001010011010010011111001110111110001010001101\
00110000011111000010011011101101101101101101001000101111100000011100\
11101101000000000111000000001001101011001101110101110101001001011100\
10000111010000100101110100101010010001010100001111000101010100100000\
01011100011111011000100101100010011011100011000001011100101110011101\
11111101001111101110001001100110110000001000110111101101100001100011\
00101111100011011100000010111011001110100000001011100111011101111110\
00011101000
Encry--------------------------------------------------------------------------End
[root@b10-1b opt]#

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

您好,谢谢您的回复。
但是由于我是在我的busybox系统上跑这个程序,所以有的命令比如for ((x=0;x<=4;x+=2))就不支持。
但是可以改用其他命令来代替,比如
  1. gck_key(){
  2. x=0
  3. while [ $x -le 4 ]
  4. do
  5.          res_yhf=`awk -vOK=${1:$x:2} -vCK=${2:4-$x:2} 'BEGIN{printf("%X",res=(xor(OK,CK)<10)?"0"(xor(OK,CK)):xor(OK,CK))}'`
  6.          sum_key=${sum_key}${res_yhf}
  7. let x+=2;
  8. done
  9. echo ${sum_key}
  10. }
复制代码
然后好像awk的xor函数并不能直接识别16进制数:
root@kbox:/tmp# awk -va="48656" -vb="621" 'BEGIN{printf("%X\n",xor(a,b))}'
BC7D
root@kbox:/tmp# awk -va="48656" -vb="621A" 'BEGIN{printf("%X\n",xor(a,b))}'
BC7D
root@kbox:/tmp#

所以您的程序在我的系统上也不能得到正确的结果:
  1. root@kbox:/tmp# gck_key(){
  2. > x=0
  3. > while [ $x -le 4 ]
  4. >  do
  5. >          res_yhf=`awk -vOK=${1:$x:2} -vCK=${2:4-$x:2} 'BEGIN{printf("%X",res=(xor(OK,CK)<10)?"0"(xor(OK,CK)):xor(OK,CK))}'`
  6. >          sum_key=${sum_key}${res_yhf}
  7. > let x+=2;
  8. >  done
  9. >  echo ${sum_key}
  10. >  }
  11. root@kbox:/tmp# first=48656C
  12. root@kbox:/tmp# echo $first
  13. 48656C
  14. root@kbox:/tmp# echo $org_key
  15. CC621E
  16. root@kbox:/tmp# gck_key $org_key $first
  17. 0006387
复制代码
这里就没有得到预期的结果5607A0。

另外,我的busybox也不支持((16#${1}*16#123456+16#ABCD)%16#800000))这样的命令。
root@kbox:/tmp# echo ((16#ABCD + 16#1234))
-sh: syntax error: unexpected "(" (expecting ""
root@kbox:/tmp#
root@kbox:/tmp# expr 16#ABCD + 16#1234
root@kbox:/tmp#
所以可能还是要写一个10进制和16进制之间转换的小函数。

最后希望将得到的密文以二进制形式保存到文件。

别的地方好像没什么问题。

回复 2# 李满满


   

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
4 [报告]
发表于 2014-09-13 10:59 |只看该作者
本帖最后由 bulletmarquis 于 2014-09-13 11:01 编辑

回复 3# bikkuri


    感觉变量定义有点问题,用这种写法呢?
  1. awk -va=$((16#48656)) -vb=$((16#621)) 'BEGIN{printf("%X\n",xor(a,b))}'
  2. 48077
  3. awk -va=$((16#48656)) -vb=$((16#621A)) 'BEGIN{printf("%X\n",xor(a,b))}'
  4. 4E44C
复制代码

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
5 [报告]
发表于 2014-09-13 11:11 |只看该作者
回复 3# bikkuri
  1. echo ((16#ABCD + 16#1234))
  2. -bash: syntax error near unexpected token `('

  3. echo $((16#ABCD + 16#1234))
  4. 48641
复制代码

论坛徽章:
3
丑牛
日期:2014-09-13 18:19:22摩羯座
日期:2014-10-10 17:43:02水瓶座
日期:2014-10-16 01:00:22
6 [报告]
发表于 2014-09-13 11:20 |只看该作者
本帖最后由 李满满 于 2014-09-13 12:38 编辑

学生党:飘过~不好意思昨天晚上急着睡觉没有看清需求~下面简单修改了下在Linux b10-1b 2.6.32-220.el6.x86_64 #1 SMP Wed Nov 9 08:03:13 EST 2011 x86_64 x86_64 x86_64 GNU/Linux测试通过,我没有busybox所以就不测试了...自己看下转换一下嗯
  1. #!/bin/bash
  2. #just for fun - [url]www.yhsafe.net[/url]
  3. hdpfile=${1}
  4. #原始KEY
  5. org_key=$(ifconfig |awk '/eth0/{l=split($0,M,":");print M[l-2]M[l-1]M[l]}')
  6. #简单判断
  7. if [ $# -ne 1 ];then
  8.         echo -e "\033[31;40mUsage:./yhsafe.sh <dumpfilename>\033[0m"
  9.         exit $?
  10. fi
  11. #十六转十进
  12. function zjz_key(){
  13.         hex_key="0x"${1}
  14.         echo $(echo ${hex_key} | gawk '$1=strtonum($1)')
  15. }
  16. #AWK取异或值
  17. function gck_key(){
  18. for ((x=0;x<=4;x+=2))
  19. do
  20.         res_yhf=`awk -vOK=$(zjz_key ${1:$x:2}) -vCK=$(zjz_key ${2:4-$x:2}) 'BEGIN{printf("%X",res=(xor(OK,CK)))}'`
  21.         res_yhf=`echo ${res_yhf}|awk '/^[0-9]$/{print "0"$0};!/^[0-9]$/{print}'`
  22.         sum_key=${sum_key}${res_yhf}
  23. done
  24. echo ${sum_key}
  25. }
  26. #计算16进制DUMP重算值
  27. function gok_key(){
  28.         echo $(echo $(((16#${1}*16#123456+16#ABCD)%16#800000))|awk '{printf("%X",$0)}')
  29. }
  30. #简单循环3人组
  31. for x_key in `cat ${hdpfile}| hexdump -C|cut -c10-60|sed -r 's/^ //;s/[[:space:]]+/ /g'|xargs -n 3|tr -d " "`
  32. do
  33.         #记录最终KEY字符串
  34.         fnl_key=${fnl_key}$(gck_key ${org_key} ${x_key})
  35.         #每次循环取下次DUMP重算KEY
  36.         org_key=$(gok_key ${x_key})
  37. done
  38. #简单输出测试
  39. echo -e "\033[31;40mEncry--------------------------------------------------------------------------STA\033[0m"
  40. echo "obase=2;${fnl_key}"|bc
  41. echo -e "\033[31;40mEncry--------------------------------------------------------------------------End\033[0m"
复制代码

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
7 [报告]
发表于 2014-09-13 12:36 |只看该作者
回复 6# 李满满


    发神,你能把你的代码贴代码框里么?

论坛徽章:
3
丑牛
日期:2014-09-13 18:19:22摩羯座
日期:2014-10-10 17:43:02水瓶座
日期:2014-10-16 01:00:22
8 [报告]
发表于 2014-09-13 12:39 |只看该作者
头一次被我找到代码框的位置.....回复 7# reyleon


   

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
9 [报告]
发表于 2014-09-13 16:19 |只看该作者
回复 8# 李满满


    哈哈,之前我找代码框也是研究了半天。。。

论坛徽章:
3
丑牛
日期:2014-09-13 18:19:22摩羯座
日期:2014-10-10 17:43:02水瓶座
日期:2014-10-16 01:00:22
10 [报告]
发表于 2014-09-13 18:18 |只看该作者
呵呵回复 9# bulletmarquis


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP