首页 > 解决方案 > 将 SHA 256 移植到 Excel。一个问题:参数为二进制,而不是 ASCII

问题描述

我正在写一个关于此代码的问题: Porting SHA-256 library to Excel

如果我在 Excel 中使用上述函数,我不是对二进制数据进行 SHA,而是对数据的 ASCII 表示。因为我想“在 Excel 中挖掘比特币”(当然只是一个教学实验),我需要将一个二进制字符串传递给这个函数,正确的 0 和 1 位序列,而不是 1(4 位)的 ascii 表示。

我可以在 excel 单元格中执行此操作,或者它可以是 VBA 代码,这对我来说并不重要。

这是我使用的excel:

https://drive.google.com/file/d/1Qdy_PpUj4ZWLGBXCsSSBmQgTMhQITLVz

我在 Excel 表中使用的 SHA256 函数将二进制文件作为文本进行散列,而不是使用其中的位。这导致此 excel 函数的输出与所需的不同。下面是一个简单的python示例来说明它。

import hashlib
string1 = '876dd0a3ef4a2816ffd1c12ab649825a958b0ff3bb3d6f3e1250f13ddbf0148cc40297f730dd7b5a99567eb8d27b78758f607507c52292d02d4031895b52f2ff'
string2 = '10000111011011011101000010100011111011110100101000101000000101101111111111010001110000010010101010110110010010011000001001011010100101011000101100001111111100111011101100111101011011110011111000010010010100001111000100111101110110111111000000010100100011001100010000000010100101111111011100110000110111010111101101011010100110010101011001111110101110001101001001111011011110000111010110001111011000000111010100000111110001010010001010010010110100000010110101000000001100011000100101011011010100101111001011111111'

hashlib.sha256(bytes.fromhex(string1)).hexdigest()
>>> 'cd93fc352d3b9f27392b3052c61190609fdc80194ade62771ce9588808980be9'

hashlib.sha256(string2.encode('utf-8')).hexdigest()
>>> 'c9aee68969373b4aecc87382fb2aa28276c6b9a9bfb6956615b4b29eb14d51d2'

第一个输出是您应该从第一轮散列中得到的实际输出。第二个输出是我从 excel 函数中得到的输出。这是因为这个函数对二进制文件进行哈希处理的方式与对“hello world”之类的字符串进行哈希处理的方式相同。

所以我需要在进行sha轮之前将这个excel函数中的输入值从文本转换为二进制数据。

链接到我在 Stackexchange 上的问题:https ://bitcoin.stackexchange.com/questions/90259/merkle-root-for-block-100000-calculation-in-excel

谢谢

对函数的参数进行了各种 CHAR()/CODE() 操作,但我失败了。

有关提供的 StackOverflow 示例的其他详细信息。

标签: excelsha256

解决方案


有点晚了(问题后 4 个月),但如果您仍在处理此问题:请在此处查看我的代码:https ://github.com/krijnsent/crypto_vba ​​-> 它正在使用 system.security.cryptography完成 SHA256 的功能。

如果你下载 Excel 文件(你只需要 ModHash 和正确的引用),这段代码会给你正确的结果:

Sub teststrings()

string1 = "876dd0a3ef4a2816ffd1c12ab649825a958b0ff3bb3d6f3e1250f13ddbf0148cc40297f730dd7b5a99567eb8d27b78758f607507c52292d02d4031895b52f2ff"
string2 = "10000111011011011101000010100011111011110100101000101000000101101111111111010001110000010010101010110110010010011000001001011010100101011000101100001111111100111011101100111101011011110011111000010010010100001111000100111101110110111111000000010100100011001100010000000010100101111111011100110000110111010111101101011010100110010101011001111110101110001101001001111011011110000111010110001111011000000111010100000111110001010010001010010010110100000010110101000000001100011000100101011011010100101111001011111111"

'Convert string1 to bytes
nBytes = Len(string1) \ 2
Dim a() As Byte
ReDim a(nBytes - 1)
For i = 0 To nBytes - 1
    a(i) = CDec("&H" & Mid(string1, 1 + i * 2, 2))
Next

Set SHAhasher = CreateObject("System.Security.Cryptography.SHA256Managed")
bytes = SHAhasher.ComputeHash_2(a)
TestResult = ConvToHexString(bytes)
Debug.Print TestResult
'cd93fc352d3b9f27392b3052c61190609fdc80194ade62771ce9588808980be9

TestResult = ComputeHash_C("SHA256", string2, "", "STRHEX")
Debug.Print TestResult
'c9aee68969373b4aecc87382fb2aa28276c6b9a9bfb6956615b4b29eb14d51d2

End Sub

希望有帮助


推荐阅读