【问题标题】:Perform OR on two hash outputs of sha1sum对 sha1sum 的两个哈希输出执行 OR
【发布时间】:2010-12-14 23:41:43
【问题描述】:

我想执行 sha1sum file1 和 sha1sum file2 并使用 bash 对它们执行按位或运算。输出应该是可打印的,即 53a23bc2e24d039 ...(160 位)

我该怎么做?

我知道

echo $(( 0xa | 0xb )) 但是如何扩展到40位十六进制数字?

谢谢

【问题讨论】:

  • 你为什么要这样做?如果我们知道您更高级别的目标,您可以获得更好的替代解决方案。按位或散列输出闻起来像你可能并不真正想要的东西。
  • 基本上,使用可信平台模块,PCR 寄存器通过操作 SHA-1(旧的 PCR 值 | inDigest)进行扩展。 PCR值和inDigest都是160位哈希输出
  • .. 我想在软件中模拟这种行为
  • @idazuwaika:你读错了规格。 PCR := SHA1(PCR || data) 读取“将 PCR 的旧值与数据连接,对连接的字符串进行哈希处理并将哈希存储在 PCR 中”。不是PCR := PCR BITWISE-OR SHA1(data) 也不是PCR := SHA1(PCR BITWISE-OR data)
  • 我正在使用 Mario Strasser 的 TPM 模拟器,在他的代码中 tpm_integrity.c 如下。 TPM_RESULT TPM_Extend(TPM_PCRINDEX pcrNum, TPM_DIGEST inDigest, TPM_PCRVALUE *outDigest) { ... / 计算新的 PCR 值作为 SHA-1(旧的 PCR 值 || inDigest) / tpm_sha1_init(&ctx); tpm_sha1_update(&ctx, PCR_VALUE[pcrNum].digest, sizeof(PCR_VALUE[pcrNum].digest)); tpm_sha1_update(&ctx, inDigest->digest, sizeof(inDigest->digest)); tpm_sha1_final(&ctx, PCR_VALUE[pcrNum].digest); / 设置输出摘要 */ .. } return TPM_SUCCESS; } 它是否遵循规范?

标签: bash shell hash


【解决方案1】:

我不认为你真的想要一个 160 位的 OR,但如果你这样做:

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

【讨论】:

    【解决方案2】:

    试试这个:

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

    【讨论】:

      【解决方案3】:

      在我的机器上,bash 可以处理带符号 64 位值的固定宽度整数运算。这意味着,我可以一次按位或七个字节。

      一种选择是将校验和分成三部分,然后对这些部分进行 OR。以后可以通过printf "%x" $val实现“可打印输出”。

      【讨论】:

        【解决方案4】:

        你可以使用 gawk

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

        【讨论】:

        • 这种情况下sha1sum的输出会被视为十六进制数字还是字母数字字符?
        • or 的每个参数都需要从十六进制转换为十进制,如下所示:or(strtonum("0x"sh1),strtonum("0x"sh2)) 因为sha1sum 的输出是没有前缀的十六进制。但是,这些数字超出了gawk(它使用浮点数表示所有个数字)的容量。
        猜你喜欢
        • 2020-04-06
        • 2018-09-20
        • 1970-01-01
        • 1970-01-01
        • 2017-10-28
        • 1970-01-01
        • 1970-01-01
        • 2014-02-17
        • 2017-07-16
        相关资源
        最近更新 更多