使用 MS Excel 进行反向哈希运算

使用 MS Excel 进行反向哈希运算

我在 YouTube 上观看了一个名为“A4 纸拼图' 在其中,演示者拿一张 A4 纸并以某种方式折叠,然后要求观众计算周长,但没有给出解决方案,而是提供了一种使用哈希检查答案是否正确的方法。

知道正确答案的顺序是 = 拿出您的答案并在计算器上单击 sq rt 5 次,然后从结果中取出小数点右边的 6 位数字并按数字升序重新排列它们,如果它们等于 234477,那么您就得到了正确答案。

因此,与其尝试计算周长,我更愿意反转哈希值以获得解决方案。所以我启动了 Excel,在 A5 中输入候选数字(例如 42),然后在 B5 到 F5 中开始求平方根。在 G5 中我减去 1 得到 0.123897073,在 H5 中我将其乘以 100 万得到 123897,然后在 I5:I10 中提取每个数字。在 J5:J10 中,我使用公式对数字进行排序,因此 J5-1、J6=2、J7=3、J8=7、J9=8、J10=9,最后在 K5 中我将所有数字连接起来得到 123789,并将目标 234477 放在 L5 中。

现在我陷入了困境,我以为我可以通过改变 A5 使用目标搜索将 K5 设置为等于 234477,但它找不到解决方案。

我不想使用代码/宏来寻找答案或进行排序等手动操作,我喜欢观察目标搜索并尝试解决方案并能够“看到”解决方案的路径。

有人知道我怎样才能完成这个吗?

公式
A5 = 用户输入数字
B5 = SQRT(A5)
C5 = SQRT
(B5) D5
= SQRT(C5) E5 = SQRT(D5)
F5 = SQRT(E5)
G5 = F5-1
H5 = IF(MID(G5,3,1)*1=0,G5*10000000,G5*1000000)
(LIST)I5:I10 = MID($F$5,3,1)*1 [每行增加 3 1]
J5:J10 { = INDEX(list, MATCH(SMALL(COUNTIF(list, "<"&list), ROW(1:1)), COUNTIF(list, "<"&list), 0))}
K5 = J5&J6&J7&J8&J9&J10

在此处输入图片描述

编辑:也许我不应该使用目标搜索,它可能有局限性,即使我输入目标 123789,它仍然找不到 42 的起始值。

答案1

一般情况下,你应该尝试找到一种不仅适用于你的解决方案的算法。
甚至尝试尽可能加快计算速度。

错误的解决方案

  • A5它将保留你的初始值
  • B5 =A5^(1/32),是的,有一点数学知识
    (SQRT(x) 等同于 x^1/2;执行五次意味着 1/2*1/2*.... = 1/32)
  • C5 =Mod(B5,1)
    这里你不能简单地这样做1-x:想象一下如果它是 2.smth 或 0.smth......

    MOD 函数返回一个数字除以除数后的余数。

  • D5 =3-TRUNC(LOG(C5,10))
    您需要取第一个不同于零的数字(函数 Log 10),并跳过0.字符串。
  • E5 =MID(C5,D5,6)在这里提取字符串。
  • F5:F10下一列函数的简单索引。
  • G5 =0+MID($E$5,F5,1) 它提取 F5 中的数字。复制并粘贴G5:G10
  • H5 =LARGE($G$5:$G$10,7-F5)从范围中 取出7-F5G5:G10最大值。复制并粘贴H5:H10
  • I5 =H5&H6&H7&H8&H9&H10重新编写字符串
  • J5它将保留要查找的 HASH 解决方案(您称之为目标
  • K5 =I5=MID(J5,1,6)I5比较和中的字符串 J5

以下是解决方案:

在此处输入图片描述

这是 SHA256 的 bash 代码


这是 SHA256 StartSeq=1 ; EndSeq=5 的bash 代码

for i in $(seq $StartSeq $EndSeq) ;
 do 
   [[ $(printf "$i" | sha256sum | awk '{print $1}'| xxd -r -p | base64) \
   == "SyJ3d9TdH8Ycb4hPSGQdArTRIdP9Moywi1Ux/Kzav4o=" ]] && \
   echo "### The Solution is "$i ; 
done

答案2

感谢哈斯塔我找到了一种让“目标搜索”发挥作用的方法。到目前为止,它已经为我找到了两个解决方案 -

4 和 2340。

好的,我们开始基于哈斯塔的回答

我们再次开始A5

  • A5= 任意数字
  • B5 =INT(A5)
  • C5 =B5^(1/32)
  • D5 =INT(MID(C5,FIND(".",C5,1)+1,10))
  • E5 =INT(IFERROR(IF(FIND("0",D5,1)<6,CONCATENATE(LEFT(D5,FIND("0",D5,1)-1),MID(D5,FIND("0",D5,1)+1,10-FIND("0",D5,1)))),LEFT(D5,6)))
  • F5 =INT(IFERROR(IF(FIND("0",E5,1)<=6,CONCATENATE(LEFT(E5,FIND("0",E5,1)-1),MID(E5,FIND("0",E5,1)+1,7-FIND("0",E5,1))),LEFT(E5,6)),LEFT(E5,6)))
  • G5 至 G10是索引 1,2,3,4,5,6 - 它们永远不会改变
  • H5 至 H10 =INT(0+MID($F$5,$G5,1))拖累至$G5增加至 6、7 等等
  • I5 至 I10 =SMALL($H$5:$H$10,ROW(A1))拖累,从而Row(A1)增加
  • J5 =INT(CONCATENATE(I5,I6,I7,I8,I9,I10))

现在您可以J5234477通过改变A5

在此处输入图片描述


解决方案

在此处输入图片描述

相关内容