V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
WesleyNZ
V2EX  ›  程序员

用 VBA 代码算出来的 SHA256 值,有时候跟网上的计算结果相同,有时候却完全不一样。。

  •  
  •   WesleyNZ · 2020-07-07 17:21:03 +08:00 · 2852 次点击
    这是一个创建于 1611 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我把这个
    https://blog.csdn.net/xhhjin/article/details/50520621

    我按照这个人的帖子,(机器 mac os 15.3,office2019 )

    如果是比较短的英文句子,那么加密结果
    http://www.jsons.cn/sha/ 提供的完全一模一样,
    我以为这个函数就万能的。
    2 楼就是原文,你们试试看:



    EXCEL 的 VBA 给出的函数返回值是
    1cdac470e33461914fd8792d82e42cb873412e8f4bcbb5a0b2d195d9aced6d26

    http://www.jsons.cn/sha/ 提供的返回值是
    8dd0390fe0b02f168b5c9e2b39e0aea17d597a091c39ab3a1580b1e4a25d10b7

    这叫我怎么办???
    到底出了什么问题呢???

    这段 VBA 代码还警告了这件事,意思就是不同系统算出来的 sha256 不一样吗??太奇怪了吧
    '
    ' *** CAUTION ***
    ' See the comment attached to the SHA256 method below regarding use on systems
    ' with different character sets.
    第 1 条附言  ·  2020-07-08 13:18:30 +08:00
    I have learnt a lot today, thank my family for supporting me for all these years; thanks rewrwerwerewrwera for being my friend supporting me, Thanks eqweqdwasdasdwqqwefor listening to me andxxxxx relative wxxxxxxx, Thanks asdasdasdasdasdasd's attempt for iqweqeqweqew, failed tho but i really am thankful for what he has done. Xxxx qweqweqwewq, xxxxxxxxxxxfriends. I don’t careqwewqeqweqw ewq. sadasddasdasdasdh, dsadasdasdasdasdad. qwewqeqweqweqweqwewqeqweqw! July 7 2020
    第 2 条附言  ·  2020-07-08 13:22:14 +08:00
    附言 1 的各种加密结果:(均为 sha256 )

    使用终端 shasum -a 256 ‘txt 文件' (utf-8 编码 macos ):9346f0f8912d7f24e1342d1eb0ec3acc902a3d0996181d5c11978477910ede76

    使用中 http://www.jsons.cn/sha/
    15153c40c0ea6019ec55e0446d0f3afc4c16e9210af5225b5db91baef1550bff

    使用 excel 宏 vba 的函数( 2001 年写的),详情有写
    6ed14f14914ef43e09277b3726b5505920c78d0649166fea6165db2a13dcd9ba

    我人都傻了好么?
    30 条回复    2020-07-08 18:22:49 +08:00
    WesleyNZ
        1
    WesleyNZ  
    OP
       2020-07-07 17:22:03 +08:00
    "Lorem ipsum 的大部分文本源于西赛罗的《善恶之尽》( De finibus bonorum et malorum )中 1.10.32-3 小节。Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit (“无人爱苦,亦无人寻之欲之,乃因其苦”)是第一个众所周知的版本。这是由一名弗吉尼亚 Hampden-Sydney 大学的出版社社长,也是一名文献学者的 Richard McClintock 所发现;他在经典拉丁文学中查找“consectetur”一词相关引用时发现,这个词汇在文学体中使用频率相当低。

    西塞罗的版本普里默斯(第一卷),第 1.10.32–3 节(包含大多数 Lorem Ipsum 文本的片段已用红色字体标注):

    Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor sit amet, consectetur, adipisci[ng] velit, sed quia non numquam [do] eius modi tempora inci[di]dunt, ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla pariatur?"
    minami
        2
    minami  
       2020-07-07 17:26:59 +08:00
    这个警告不是说不同系统算出来的不一样,而是说不同系统可能采用不同字符集,所以算出来的可能不一样
    GM
        3
    GM  
       2020-07-07 17:27:39 +08:00
    可能是编码不同导致的。
    minami
        4
    minami  
       2020-07-07 17:28:30 +08:00
    你把输入转成统一的字符集编码应该就可以了
    WesleyNZ
        5
    WesleyNZ  
    OP
       2020-07-07 17:28:45 +08:00
    @minami 我看不懂这个代码使用的是什么字符集标准。。
    我想请问一下 mac 终端算 sha256 的字符集是什么?我估计是 utf-8
    但是这个代码你能帮我看一下用的是什么字符集计算的吗?

    就算知道我也不知道怎么改啊。。这毕竟的 2001 年的代码。。。无从下手 我也不会改。
    WesleyNZ
        6
    WesleyNZ  
    OP
       2020-07-07 17:31:27 +08:00
    @GM 请问比如说这个函数在 excel 里是:FunSha256 (),我现在在单元格比如说 c1 的数据,我想算出 sha256 的值。
    但是我现在不知道,现在通用的 sha256 计算的字符集是什么??
    这个 vba 函数的字符集用的是什么??
    如何转换字符集??
    lonelinsky
        7
    lonelinsky  
       2020-07-07 17:31:31 +08:00
    Hash (SHA256) 是基于字节流进行计算的,你 1L 回复中贴出来的文字是包含中文的,在不同的编码格式下字节流是不一样的,所以算出来的值就会不一样了。简单的英文没问题应该是都是用了 ASCII 编码而已 ( UTF-8 下英文的编码和 ASCII 是一致的,网上主流一般都是基于 UTF-8 编码后算的)。

    也就是原来提示 CAUTION 所说的:
    ' *** CAUTION ***
    ' See the comment attached to the SHA256 method below regarding use on systems
    ' with different character sets.
    WesleyNZ
        8
    WesleyNZ  
    OP
       2020-07-07 17:31:40 +08:00
    @GM 怎么让他们编码一致
    WesleyNZ
        9
    WesleyNZ  
    OP
       2020-07-07 17:34:16 +08:00
    @lonelinsky 请问如何让我输入函数()里面的自变量变成 utf-8 编码的呢?
    lonelinsky
        10
    lonelinsky  
       2020-07-07 17:39:20 +08:00
    @WesleyNZ 简单搜了下,找到这个,具体的你要自己试下了。

    https://di-mgt.com.au/howto-convert-vba-unicode-to-utf8.html
    WesleyNZ
        11
    WesleyNZ  
    OP
       2020-07-07 17:40:51 +08:00
    @lonelinsky 我已经暴毙了 谢谢,我做不到。。我不是程序员 ...........谢谢你的帮助 我估计自己啃要看 3 天以上。
    GM
        12
    GM  
       2020-07-07 17:46:01 +08:00
    @WesleyNZ
    你先用一份全英文的来算,看看是否一致。
    如果一致的话,末尾添加一个中文再算一次,看看是否一致。

    如果添加中文后不一致的话,那就可以确定是编码问题导致的。
    WesleyNZ
        13
    WesleyNZ  
    OP
       2020-07-07 17:48:13 +08:00 via iPhone
    @GM 等下我回复你结果,刚才有一个全英文的加密也是错误的 我觉得很奇怪 只有英语跟小些的标点符号 加密结果也不同 另一个只有英语字母跟逗号句号的却正常
    GM
        14
    GM  
       2020-07-07 17:54:48 +08:00
    @WesleyNZ 中文标点也是中文,建议随机乱打一份全英文的来测试,100 个字符以上
    WesleyNZ
        15
    WesleyNZ  
    OP
       2020-07-07 17:56:07 +08:00 via iPhone
    @GM 好。
    jiejiss
        16
    jiejiss  
       2020-07-07 18:22:25 +08:00
    也有可能是溢出了
    WesleyNZ
        17
    WesleyNZ  
    OP
       2020-07-07 18:52:16 +08:00
    @jiejiss 可能是。
    WesleyNZ
        18
    WesleyNZ  
    OP
       2020-07-07 18:53:11 +08:00
    @GM 我没有用过中文标点。。现在要检查下。。我估计是移除。
    我用 vba 的函数,算出来的结果跟 utf8 ( mac ) utf8 ( win )的结果是一样的(前提是只用英语,英语字符,数字)
    GM
        19
    GM  
       2020-07-08 11:19:18 +08:00
    @WesleyNZ 你最好把原始字符串发出来,算出来的 sha256 结果也发出来,这样别人才能查问题在哪里。
    WesleyNZ
        20
    WesleyNZ  
    OP
       2020-07-08 13:10:25 +08:00
    我得临时编一段。。。。。。这个有点私密
    WesleyNZ
        21
    WesleyNZ  
    OP
       2020-07-08 13:23:17 +08:00
    @GM 附言 1 是加密内容 一点中文的痕迹都没有
    附言 2 是各种 sha256 加密的结果。。
    ragnaroks
        22
    ragnaroks  
       2020-07-08 15:23:01 +08:00
    附言 1 中的文本,我在网页,7zip,hashtab 均得出同样的(与你相同)结果
    ragnaroks
        23
    ragnaroks  
       2020-07-08 15:23:23 +08:00
    15153c40c0ea6019ec55e0446d0f3afc4c16e9210af5225b5db91baef1550bff
    GM
        24
    GM  
       2020-07-08 15:24:33 +08:00
    @WesleyNZ

    shasum -a 256 sha.txt
    15153c40c0ea6019ec55e0446d0f3afc4c16e9210af5225b5db91baef1550bff sha.txt

    这是我这边的结果,这个结果肯定是对的。

    你要注意一下,文件内容要完全一致才行,一个字符都不能动,包括回车换行,建议仅仅使用字母来测试,不要用标点符号、空格、回车等等特殊字符。
    GM
        25
    GM  
       2020-07-08 15:26:45 +08:00
    @WesleyNZ 你试试这个(纯字母,不包括后面的回车换行):

    aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd


    这是我这边的结果:28b211ed1bfd2fbe3ff43c6a55e2086649c65656ef8311e94251d0fa00f4b881
    huawuya
        26
    huawuya  
       2020-07-08 17:41:59 +08:00
    楼主,注意你附言 1 文字中的 “I don’t careqwewqeqweqw”,这里面那个 n't 中间的单引号不是标准的 asc 字符里的单引号,而是中文的单引号。所以你这段文字不是全英文的。

    asdasdasdasdasdasd's attempt 这句中间的单引号是英文的。

    另外 sha256 计算文件 hash 的时候还要注意文字最后是否有换行符,有没有换行符结果也是不一样的。
    huawuya
        27
    huawuya  
       2020-07-08 17:47:23 +08:00
    把那个中文单引号改成英文单引号后,sha256 结果网页工具和 linux 上的 sha256sum 结果是一致的。

    I have learnt a lot today, thank my family for supporting me for all these years; thanks rewrwerwerewrwera for being my friend supporting me, Thanks eqweqdwasdasdwqqwefor listening to me andxxxxx relative wxxxxxxx, Thanks asdasdasdasdasdasd's attempt for iqweqeqweqew, failed tho but i really am thankful for what he has done. Xxxx qweqweqwewq, xxxxxxxxxxxfriends. I don't careqwewqeqweqw ewq. sadasddasdasdasdh, dsadasdasdasdasdad. qwewqeqweqweqweqwewqeqweqw! July 7 2020

    d7276d1345c0438e5cb7d10829006239ff676ec39fbf0160fd28773c513c9b16
    huawuya
        28
    huawuya  
       2020-07-08 18:02:09 +08:00
    用你那个 VBA 测试了一下,同样的结果
    WesleyNZ
        29
    WesleyNZ  
    OP
       2020-07-08 18:17:37 +08:00 via iPhone
    @huawuya 应该就是那个单引号引发的血案?
    WesleyNZ
        30
    WesleyNZ  
    OP
       2020-07-08 18:22:49 +08:00 via iPhone
    @huawuya 你说的计算文件 hash 的意思是,txt 文件吗?我会确保最后没有回车的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3500 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 86ms · UTC 11:12 · PVG 19:12 · LAX 03:12 · JFK 06:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.