XOR au niveau du bit d'une chaîne en Bash
Je suis en train d'accomplir un travail dans les scripts Bash. J'ai une chaîne qui je veux XOR avec ma clé.
#!/bin/sh
PATH=/bin:/usr/bin:/sbin:/usr/sbin export PATH
teststring="abcdefghijklmnopqr"
Maintenant, comment puis-je XOR la valeur de chaîne de test et de le stocker dans une variable à l'aide de bash?
Toute aide sera appréciée.
Fondamentalement, je suis en train d'essayer de reproduire le résultat de follwing VB Script:
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
Ne serait-il pas juste être
dosen';t de travail
peut-être que si il ya une manière de passer la valeur de chaîne de test en perl à partir de script bash et XOR.
Il semble que votre essayer de faire une sorte de mot de passe de dissimulation ou de chiffrement dans bash. Perl ou python serait probablement un meilleur choix de la langue.
il semble qu'il ne peut pas être fait de demeurer tous en bash.. donc peut-être que vous devez vous en tenir à perl, ou utiliser quelque chose de plus léger que l'interprète d'une langue; par exemple, od et sed pourrait être utilisé, par exemple:
teststring="abcdefghijklmnopqr" ^ key
?dosen';t de travail
peut-être que si il ya une manière de passer la valeur de chaîne de test en perl à partir de script bash et XOR.
Il semble que votre essayer de faire une sorte de mot de passe de dissimulation ou de chiffrement dans bash. Perl ou python serait probablement un meilleur choix de la langue.
il semble qu'il ne peut pas être fait de demeurer tous en bash.. donc peut-être que vous devez vous en tenir à perl, ou utiliser quelque chose de plus léger que l'interprète d'une langue; par exemple, od et sed pourrait être utilisé, par exemple:
echo $(( $(echo -n "c" |od -td1 |sed -e 's/^[0-9]\+ *//g;') ^ 1 ))
; mettez votre char au lieu de "c"... ce qui est préférable si vous faites cela comme une fonction, alors vous pouvez diviser char par char la chaîne et appliquer le xor (peut-être xorring char par char n'était pas ce que tu voulais...; si vous avez besoin d'xorring deux mêmes chaînes de longueur, vous pouvez séparer les deux et de "construire" le résultat; sinon chaîne ^ entier ... que voulez-vous dire?OriginalL'auteur ricky2002 | 2010-06-02
Vous devez vous connecter pour publier un commentaire.
Avec l'aide de ces conseils j'ai écrit rapidement script pour terminer Pedro réponse:
Résultat:
OriginalL'auteur Fernando Miguélez
Si vous décidez d'aller pour Perl one-liner, voici ce que je suis venu avec
zip fonction Perl 6 serait mieux...
OriginalL'auteur Arkadiy
encore une autre réponse
data=abcdef; for ((i=0;i<${#data};i++)); do printf '%d ' "'${data:i:1}"; done
pour éviter la construction complexe en utilisant eval et d'appeler une commande externesed
.Comme il est très possible d'émettre des caractères de contrôle avec le xor, il est raisonnable de présenter le résultat codé comme chiffres hexadécimaux (comme la question de la demande).
En fait, c'est une solution raisonnable à la question posée: Un script bash pour xor de deux chaînes de caractères (ascii des valeurs). à cet effet, le changement
printf "\\\\\\%o" "${_res[@]}" | xargs printf
le plus simpleprintf '%02x' "${_res[@]}"
OriginalL'auteur Cyrille Lefevre
Bit à bit OU exclusif en BASH nécessite à la fois des opérandes numériques. Depuis il n'y a pas intégré de manière à obtenir des ordinal (ASCII) de la valeur d'un caractère dans bash, vous aurez besoin de l'utiliser, de le dire, Perl, pour obtenir cette valeur.
Modifier: comme indiqué ci-dessous,
ord
travaille sur le premier caractère d'une chaîne.Bien sûr, une fois que vous êtes en Perl, vous pourriez aussi bien le faire tout est là:
Modifier: il s'avère, vous pouvez saisir la valeur ordinale d'une chaîne de BASH en utilisant
printf
. Tout simplement le préfixe de la chaîne de'
.Donc, dans BASH seulement:
whoami
test=perl -e 'print ord $strUrl ^ key'
echo ${test} ai-je fait une erreur?Vous avez besoin d'envelopper le
perl
commande en soit backticks ou $(). Aussi,$strUrl
est pas défini, etkey
est un mot nu.Est-ce la bonne façon de le faire? je suis un nombre à deux chiffres comme sortie mais je m'attendais à un numéro de long. key=secret strUrl=cdcdcdc strUrl=$(($(printf "%d" "'strUrl")^$(printf "%d" ""clé")));echo $strUrl
ord
opère sur un seul personnage, doncord $ARGV[0]
renvoie la valeur ordinale de la le premier caractère de$ARGV[0]
Vous obtenez le résultat en format décimal. Convertir en binaire avec
unpack("N", pack("B32", substr("0" x 32 . $decimal, -32)))
OriginalL'auteur Pedro Silva
woks dans busybox(la pâte ne pouvait pas recevoir de deux ruisseaux), a également fait la clé de répéter
chr
qui produisent des caractères de contrôle n'est pas une bonne idée. C'est pourquoi le code de la question de l'utilisationHex
pour la sortie.OriginalL'auteur Shimon Doodkin
Les plus similaires transformation de seulement la fonction de bash serait:
(# signifie commentaire):
Supprimé les commentaires, et le nettoyage du code:
De course:
OriginalL'auteur