2

我关于 VBA 的初学者系列问题中的另一个。

我正在用 VBA 编写 Excel 插件,插件使用本地配置文件。
该文件需要包含远程服务的密码。
显然,将此密码存储为明文并不理想。但我正在寻找一种可以编码/解码文本的算法,因此它至少看起来不像配置文件中的纯文本。

我遇到了对 Windows DPAPI的引用,但我不确定这是否是 Excel VBA 的合适解决方案。我也不确定如何在 VBA 中使用这个 API,因为我只找到了在 .NET 中使用它的参考资料。此项目无法使用 Visual Studio。

所以两部分的问题是这样的:
1)如果可以在 VBA 中使用 DPAPI,我可以举个例子来说明它的用法吗?
2) 如果在 VBA 中无法使用 DPAPI,您对如何以某种可逆的编码方式存储文本有什么建议吗?

如果重要,该解决方案必须在 Excel 2003 及更高版本中运行。

再一次感谢你。

4

1 回答 1

1

如果重要,该解决方案必须在 Excel 2003 及更高版本中运行。

对于 Excel VBA,我建议使用 CAPICOM 库。

从这里下载文件。安装后,请按照这些说明注册 Dll。

32 位操作系统

将文件 Capicom.dll 从复制C:\Program Files\Microsoft CAPICOM 2.1.0.2 SDK\LibC:\Windows\System32

开始菜单上的下一步| 运行,输入这个

Regsvr32 C:\Windows\System32\Capicom.dll

64位操作系统

将文件 Capicom.dll 从复制C:\Program Files (x86)\Microsoft CAPICOM 2.1.0.2 SDK\Lib\X86C:\Windows\SysWOW64

开始菜单上的下一步| 运行,输入这个

Regsvr32 C:\Windows\SysWOW64\Capicom.dll

现在我们准备在我们的 VBA 项目中使用它

将此代码粘贴到模块中

Option Explicit

Sub Sample()
    Dim TextToEncrypt As String, EncryptedText As String
    Dim TextToDeCrypt As String, DeCryptedText As String
    Dim KeyToEncrypt As String

    TextToEncrypt = "Hello World"
    KeyToEncrypt = "JoshMagicWord"

    EncryptedText = EncryptString(TextToEncrypt, KeyToEncrypt)
    DeCryptedText = DecryptString(EncryptedText, KeyToEncrypt)

    Debug.Print "The string " & TextToEncrypt & " after encryption looks like this"
    Debug.Print "-----------------------------------------------------------------"
    Debug.Print EncryptedText
    Debug.Print "-----------------------------------------------------------------"
    Debug.Print "The above string after decrypting looks like this"
    Debug.Print "-----------------------------------------------------------------"
    Debug.Print DeCryptedText

End Sub

Public Function EncryptString(strText As String, ky As String) As String
    Dim Cap As Object
    Dim cryptIt

    Set Cap = CreateObject("CAPICOM.EncryptedData")

    Cap.Algorithm = 3
    Cap.SetSecret ky
    Cap.Content = strText
    EncryptString = Cap.Encrypt
End Function

Public Function DecryptString(strText As String, ky As String) As String
    Dim Cap As Object
    Dim cryptIt

    Set Cap = CreateObject("CAPICOM.EncryptedData")

    Cap.Algorithm = 3
    Cap.SetSecret ky
    Cap.Decrypt strText

    DecryptString = Cap.Content
End Function

函数EncryptString加密字符串,函数DecryptString解密字符串。运行上述内容时查看结果快照Sub Sample

在此处输入图像描述

于 2012-06-12T00:52:29.793 回答