【问题标题】:Compute SHA512 on VBA (Excel 2003)在 VBA (Excel 2003) 上计算 SHA512
【发布时间】:2015-01-22 17:33:02
【问题描述】:

我正在尝试在 VBA (Excel 2003) 上计算字符串的哈希值,但是当我调用 ComputeHash 时,它会抛出 Invalid argument/procedure call 错误。

DLL 参考:mscorlib v4.0、System v4.0

MSDN 参考:http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha512managed.aspx

 Sub Main()
        Dim instance As New SHA512Managed
        Dim data() As Byte
        data = StringToByte("mymsg")
        Dim result() As Byte
        instance.ComputeHash(data) 'Throws runtime error'
        MsgBox (ByteToString(result))
    End Sub

    Function StringToByte(ByVal s)
        Dim b() As Byte           
        b = s  'Assign Unicode string to bytes.'
        StringToByte = b
    End Function

    Function ByteToString(ByVal dBytes)
        Dim strText As String
        strText = dBytes
        ByteToString = strText
    End Function

【问题讨论】:

  • 看看这是否有帮助? vbaexpress.com/forum/showthread.php?t=23032
  • 该引用 (SHA512Managed) 来自(哪个库)?我有几个不同版本的 mscorlib.dll,但无法将它们链接到 VBE...
  • mscorlib.dll v4.0,带有系统 v4.0
  • 你是说.NET?我的 .dll 仅适用于 .NET 2.0,但我仍然无法添加引用。无论如何,我正在添加一个我无法测试的答案......

标签: vba hash excel sha512


【解决方案1】:

你不能完全那样使用​​它,但你快到了。由于 .ComputeHash 是一个可重载函数,而 VBA 无法处理此问题,因此您需要明确要调用哪个函数。所以考虑下面,使用 UTF-8 字符串编码为 base64:

Sub test()
Dim text As Object
Dim SHA512 As Object

Set text = CreateObject("System.Text.UTF8Encoding")
Set SHA512 = CreateObject("System.Security.Cryptography.SHA512Managed")

Debug.Print ToBase64String(SHA512.ComputeHash_2((text.GetBytes_4("Hello World"))))

End Sub

Function ToBase64String(rabyt)

  'Ref: http://stackoverflow.com/questions/1118947/converting-binary-file-to-base64-string
  With CreateObject("MSXML2.DOMDocument")
    .LoadXML "<root />"
    .DocumentElement.DataType = "bin.base64"
    .DocumentElement.nodeTypedValue = rabyt
    ToBase64String = Replace(.DocumentElement.text, vbLf, "")
  End With
End Function

【讨论】:

    【解决方案2】:

    我无法让库链接,所以我无法自己测试...

    你的意思也是这样分配结果吗?

    result = instance.ComputeHash(data)
    

    深入查看您提供的链接,我发现了这个示例:

    Dim data(DATA_SIZE) As Byte
    Dim result() As Byte
    
    Dim shaM As New SHA512Managed()
    result = shaM.ComputeHash(data)
    

    这在我的脑海中似乎不正确,但我无法确定,但他们在 New 声明的末尾添加了 ()。你试过吗?

    【讨论】:

    • 不工作,抛出同样的错误。关于参考,我只是去工具并标记它们,我没有安装环境,所以我没有太多要说的。您应该尝试取消标记它们,关闭参考窗口,打开它,看看是否有 v4.0 版本。
    • 更新答案 - 我认为您需要实际分配 result?
    • @WoF_Angel 我想,但他们甚至不在要检查的列表中。我必须手动浏览它们,然后引发错误。我不会担心它,我目前对库没有用处;只是想帮助测试您的代码。
    • 喂!查看您链接到的参考,看起来您已经正确完成了。由于我无法测试/玩它,我不确定我是否会对您有更多帮助,抱歉。
    • 我会尝试自己实现它。还是谢谢。
    猜你喜欢
    • 2013-04-24
    • 2017-07-17
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多