2009-11-10 3 views
1

Je veux effectuer sha1sum file1 et sha1sum file2 et d'effectuer un OU opération bit à bit avec eux en utilisant bash. La sortie devrait être imprimable i.e 53a23bc2e24d039 ... (160 bit)Exécution OU sur deux sorties de hachage de sha1sum

Comment est-ce que je peux faire ceci?

Je sais

echo $ ((0xa | 0xb)) mais comment étendre à 40 chiffres hexadécimaux?

Merci

+0

Pourquoi voulez-vous faire cela? Si nous vous connaissions, vous pourriez obtenir de meilleures solutions alternatives. Bitwise ou sur les sorties de hachage sent comme quelque chose que vous ne voulez pas vraiment. – laalto

+0

Fondamentalement, avec Trusted Platform Module, le registre PCR est étendu avec l'opération SHA-1 (ancienne valeur de PCR | inDigest). La valeur de PCR et inDigest sont toutes les deux une sortie de hachage de 160 bits – idazuwaika

+0

.. et je veux émuler ce comportement dans le logiciel – idazuwaika

Répondre

0

Sur mon bash machine peut gérer l'arithmétique fixe entière largeur avec 64 signé des valeurs de bits. Cela signifie que je peux bit ou sept octets à la fois.

Une option serait de diviser votre somme de contrôle en trois parties et de faire votre OR avec ceux-ci. Vous pouvez atteindre "sortie imprimable" par printf "%x" $val plus tard.

1

Essayez ceci:

val1=$(sha1sum file1) 
val1=${val1% *} 
val2=$(sha1sum file2) 
val2=${val2% *} 
val3=$((0x$val1 | 0x$val2)) 
printf "%x\n" $val3 
0

vous pouvez utiliser reluquer

sha1sum file1 file2 | awk '{sh1=$1;getline;sh2=$1;print or(sh1,sh2);exit}' 
+0

la sortie de sha1sum dans ce cas sera-t-elle traitée comme un caractère hexadécimal ou alphanumérique? – idazuwaika

+0

Chacun des arguments de 'or' doit être converti de hexadécimal en décimal comme ceci:' ou (strtonum ("0x" sh1), strtonum ("0x" sh2)) 'puisque la sortie de' sha1sum' est hexadécimale sans un préfixe. Cependant, ces nombres dépassent la capacité de 'gawk' (qui utilise float pour représenter * tous * les nombres). –

2

Je ne pense pas que vous voulez vraiment un inclus 160 bits ou, mais si vous le faites:

split32() { 
    x='s/\(........\)\(........\)\(........\)\(........\)\(........\)/' 
    x=$x'0x\1 0x\2 0x\3 0x\4 0x\5/' 
    sed -e "$x" 
} 

(sha1sum $1 | split32; sha1sum $2 | split32) | (
    read a1 b1 c1 d1 e1 x1 
    read a2 b2 c2 d2 e2 x2 
    a=$(($a1 | $a2)) 
    b=$(($b1 | $b2)) 
    c=$(($c1 | $c2)) 
    d=$(($d1 | $d2)) 
    e=$(($e1 | $e2)) 
    printf ' %08x%08x%08x%08x%08x\n' $a1 $b1 $c1 $d1 $e1 
    printf '+ %08x%08x%08x%08x%08x\n' $a2 $b2 $c2 $d2 $e2 
    printf '= %08x%08x%08x%08x%08x\n' $a $b $c $d $e 
) 
$ bash bigOr.sh fun.tar fun.tgz 
    e515d3813b17c36b9a7d29f7aea3e79e264449b7 
+ 4f201513105c301944d0a0ba5864d9f07544ca76 
= ef35d7933b5ff37bdefda9fffee7fffe7744cbf7 
Questions connexes