Я пытаюсь выполнить работу в сценариях Bash. У меня есть строка, которую я хочу к XOR с моим ключом.
#!/bin/sh
PATH=/bin:/usr/bin:/sbin:/usr/sbin export PATH
teststring="abcdefghijklmnopqr"
Теперь, как делают меня XOR значение teststring и хранят его в переменном ударе использования?
Любая справка будет цениться.
В основном я пытаюсь копировать результат follwing VB Сценарий:
Function XOREncryption(CodeKey, DataIn)
Dim lonDataPtr
Dim strDataOut
Dim temp
Dim tempstring
Dim intXOrValue1
Dim intXOrValue2
For lonDataPtr = 1 To Len(DataIn) Step 1
'The first value to be XOr-ed comes from the data to be encrypted
intXOrValue1 = Asc(Mid(DataIn, lonDataPtr, 1))
'The second value comes from the code key
intXOrValue2 = Asc(Mid(CodeKey, ((lonDataPtr Mod Len(CodeKey)) + 1), 1))
temp = (intXOrValue1 Xor intXOrValue2)
tempstring = Hex(temp)
If Len(tempstring) = 1 Then tempstring = "0" & tempstring
strDataOut = strDataOut + tempstring
Next
XOREncryption = strDataOut
End Function
Если вы решите использовать однострочник Perl, вот то, что я придумал,
perl -e '@a=split("", $ARGV[0]); @b=split("", $ARGV[1]); print unpack "H2", chr(ord(shift @a)^ord(shift @b)) while @a; print "\n"' aab aaa
zip-функция в Perl 6 подойдет лучше ...
Побитовое исключающее ИЛИ в BASH требует, чтобы оба операнда были числовыми. Поскольку в bash нет встроенного способа получения порядкового (ASCII) значения символа, вам нужно будет использовать, скажем, Perl, чтобы получить это значение.
Изменить : как указано ниже, ord
работает только с первым символом строки.
let a=`perl -e 'print ord $_ for split //, $ARGV[0]' string`^123; echo $a
Конечно, когда вы работаете в Perl, вы можете сделать все это и здесь:
let a=`perl -e '$ordinal .= ord $_ for split //, $ARGV[0]; print $ordinal ^ $ARGV[1]' string 123`
Edit : оказывается, вы можете получить порядковое значение строки в BASH, используя printf
. Просто добавьте к строке префикс '
.
printf "%d" "'string"
Итак, только в BASH:
let a=$(printf "%d" "'string")^123; echo $a
С помощью этих подсказок я быстро написал этот сценарий, чтобы завершить ответ Педро:
#!/bin/bash
function ascii2dec
{
RES=""
for i in `echo $1 | sed "s/./& /g"`
do
RES="$RES `printf \"%d\" \"'$i\"`"
done
echo $RES
}
function dec2ascii
{
RES=""
for i in $*
do
RES="$RES`printf \\\\$(printf '%03o' $i)`"
done
echo $RES
}
function xor
{
KEY=$1
shift
RES=""
for i in $*
do
RES="$RES $(($i ^$KEY))"
done
echo $RES
}
KEY=127
TESTSTRING="abcdefghijklmnopqr"
echo "Original String: $TESTSTRING"
STR_DATA=`ascii2dec "$TESTSTRING"`
echo "Original String Data: $STR_DATA"
XORED_DATA=`xor $KEY $STR_DATA`
echo "XOR-ed Data: $XORED_DATA"
RESTORED_DATA=`xor $KEY $XORED_DATA`
echo "Restored Data: $RESTORED_DATA"
RESTORED_STR=`dec2ascii $RESTORED_DATA`
echo "Restored String: $RESTORED_STR"
Результат:
iMac:Desktop fer$ bash test.sh
Original String: abcdefghijklmnopqr
Original String Data: 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
XOR-ed Data: 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13
Restored Data: 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
Restored String: abcdefghijklmnopqr