excel - 将 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 示例的其他详细信息。
解决方案
有点晚了(问题后 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
希望有帮助
推荐阅读
- php - 如何使用 wordpress 托管 gatsby?
- linux - 如何在 Amazon Linux AMI 中安装 Postgresql 11?
- qt - 通过 QT 应用程序中的代理订阅 OneSignal 中的用户
- c++ - 在 lua 中加载 C++ 模块时出现“尝试索引字符串值”错误
- reactjs - 取消选中带有 Material UI 的单选按钮
- json - 仅使用 Ruby 生成 HTML 安全 JSON
- elasticsearch - 弹性搜索 | 如何获取具有相应匹配值的原始搜索查询
- javascript - es-AR 浏览器中的日期时间段问题
- azure - 使用 Microsoft Graph API 时重定向 URL 地址不正确
- python - 为包含 Swig 对象的 Python 对象创建复制类方法