在bash脚本中XOR两个十六进制数字

By simon at 2018-02-07 • 0人收藏 • 169人看过

我写了一个操作十六进制值的bash脚本,我需要执行XOR操作 两个六进制数之间我的问题是当我try在bash中提示这是工作 并返回正确的值,但在脚本中这个值是错误的。 当XOR变量$ ExtendAuthKey和$ IPAD结果必须是: 181ad673a5d94f0e12c8894ea26381b363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636 但事实上,我得到这个值:3906369333256140342 如果你有解释,我不明白这个行为或我采取的解决方案 谢谢 看我的脚本:

#!/bin/bash

AuthID=80001f8880e9bd0c1d12667a5100000000

IPAD=0x36363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636
OPAD=0x5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c
Ext0=0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

WholeMsgIn=0x3081800201033011020420dd06a7020300ffe30401050201030431302f041180001f8880e9bd0c1d12667a5100000000020105020120040475736572040c00000000000000000000000004003035041180001f8880e9bd0c1d12667a51000000000400a11e02046b4c5ac20201000201003010300e060a2b06010201041e0105010500

line=test

#Calcule AuthKey
  AuthKey=$(snmpkey md5 $line $AuthID | grep auth | cut -d ' ' -f 2)

#Concat AuthKey + Ext0
  ExtendAuthKey=$AuthKey${Ext0:2}

#Calcule de K1 = ExtendAuthKey XOR IPAD
  K1=$(( $ExtendAuthKey ^ $IPAD ))

#Calcule de K2 = ExtendAuthKey XOR OPAD
  K2=$(( $ExtendAuthKey ^ $OPAD ))

#Concat K1 + WholeMsgIn
  Concat1=$K1$WholeMsgIn

#Calcul Hash Concat1
  echo ${Concat1:2} > tempH.hex
  cat tempH.hex | xxd -r -p > tempB.bin
  HashConcat1=$(md5sum tempB.bin | cut -d ' ' -f 1)

#Concat K2 + Concat1
  Concat2=$K2$HashConcat1

#Calcul Hash Concat1
  echo ${Concat2:2} > tempH.hex
  cat tempH.hex | xxd -r -p > tempB.bin
  HashConcat2=$(md5sum tempB.bin | cut -d ' ' -f 1)

3 个回复 | 最后更新于 2018-02-07
2018-02-07   #1

如果你做echo $((IPAD))你会得到3906369333256140342.问题是,一旦你 在shell中执行算术运算,输入被截断为大小 int你的平台(在这种情况下是64b)。我怀疑你将不得不 伸出壳外执行按位异或(或更小的处理 大块,但单独的MD5摘要已经是大小的两倍)。

2018-02-07   #2

如果你做echo $((IPAD))你会得到3906369333256140342.问题是,一旦你 在shell中执行算术运算,输入被截断为大小 int你的平台(在这种情况下是64b)。我怀疑你将不得不 伸出壳外执行按位异或(或更小的处理 大块,但单独的MD5摘要已经是大小的两倍)。

2018-02-07   #3

也许这有助于使用bc:

a=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
b=5555555555555555555555555555555555555555555555555555555555555555
bc -l logic.bc <<< "obase=16;ibase=16;xor($a,$b)"
* 输出
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
请注意,十六进制是在
大写
*,并且<<<是一个 “bashism”所以,如果你不使用
echo "obase=16;ibase=16;xor($a,$b)" | BC_LINE_LENGTH=0 bc -l logic.bc 
2,你可以把它翻过来 像这样表达,也是同时防止换行:
echo "obase=16;ibase=16;xor($a,$b)" | BC_LINE_LENGTH=0 bc -l logic.bc 


它依赖于logic bc的附加库:

wget http://phodd.net/gnu-bc/code/logic.bc

登录后方可回帖

Loading...