VBA 中 .NET System.Convert 的替代品

Alternative for .NET's System.Convert within VBA

我正在 Microsoft Access 中编写一个 VBA 函数来使用 RSA 密钥加密/解密文本数据。

目前有以下作品:

CreateObject("System.Security.Cryptography.RSACryptoServiceProvider")
CreateObject("System.Text.UTF8Encoding")

但这不起作用:

CreateObject("System.Convert")

我做了一些研究并遇到了这个 Whosebug 问题: Can I call a static method of a C# class from VBA via COM?

事实证明,System.Convert 是静态的 class,因此它对 COM object 不可用,因此VBA 无法使用。

我可以将我所有的 .NET 内容打包到我自己的 class 中,然后将其添加到 Access 作为参考,但它有点超出我的舒适范围,我宁愿远离必须维护这个特定项目的自定义引用。

因此,我没有专注于 System.Convert 选项,而是考虑了我的具体需求。我需要能够:

我看到的最简单的选择是编写自己的 VBA 代码以在 Base 64 和字节数组之间进行转换 - 但是我看到两个陷阱:

  1. 编码问题。字节数组和字符串之间的转换意味着必须处理编码问题。
  2. Base64 变体。在我的脑海中,Base64 可以包含 CR/LF。我也不确定 Base64 编码的 RSA 字符串是否/需要有 header。如果我编写自己的 Base64 函数,我需要确保它与 RSACryptoServiceProvider 的 FromBase64String 方法兼容。我不想在加密流中引入额外的字符。

考虑到我的担忧 - Convert.FromBase64String 似乎是最佳选择,因为它将所有内容都保存在 .NET 中,但由于我无法使用它 - 我需要一个替代方案。

如果有其他标准 .NET classes 提供 FromBase64String 和 ToBase64String 功能,但能够通过 CreateObject 实例化 - 这可能是最佳选择。但是我不知道。

有许多 VBA/VBScript/VB6 Base64 实现生成与 .NET 完全相同的结果 ToBase64String 编码和 FromBase64String 解码。

您可以在此处找到具有完整 Base64 编码和解码功能的 VBA/VB6 示例 Base64 encoder/decoder in Visual Basic. The Base64 VB module bas file can be found here Base64Coder.bas

以下是 C#VB6 中相同测试的一些屏幕截图。您可以清楚地看到两种语言的结果相同:

C#

static void Main(string[] args)
{
    Check("Aladdin:open sesame", "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="); // example from RFC 2617)
    Check("1", "MQ==");
    Check("22", "MjI=");
    Check("333", "MzMz");
    Check("4444", "NDQ0NA==");
    Check("55555", "NTU1NTU=");
    Check("abc:def", "YWJjOmRlZg==");
    Check("????", "Pz8/Pw==");
    Check("abcdefghijklnmopqrstuvwxyz0123456789???", "YWJjZGVmZ2hpamtsbm1vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Pz8/");
}

private static void Check(string plainText, string base64Text)
{
    string s1 = Base64Encode(plainText);
    string s2 = Base64Decode(base64Text);

    Debug.WriteLine("String: " + s2 + ", to Base64: " + s1);

    if(s1 != base64Text || s2 != plainText)
        Debug.WriteLine("Check failed for \"" + plainText + "\" / \"" + base64Text + "\".");
}
public static string Base64Encode(string plainText)
{
    var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
    return System.Convert.ToBase64String(plainTextBytes);
}

public static string Base64Decode(string base64EncodedData)
{
    var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
    return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
}

C# 输出

VBA/VB6

Public Sub Main()
    Check "Aladdin:open sesame", "QWxhZGRpbjpvcGVuIHNlc2FtZQ==" ' example from RFC 2617
    Check "1", "MQ=="
    Check "22", "MjI="
    Check "333", "MzMz"
    Check "4444", "NDQ0NA=="
    Check "55555", "NTU1NTU="
    Check "abc:def", "YWJjOmRlZg=="
    Check "????", "Pz8/Pw=="
    Check "abcdefghijklnmopqrstuvwxyz0123456789???", "YWJjZGVmZ2hpamtsbm1vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Pz8/"
End Sub

Private Sub Check(ByVal plainText As String, ByVal base64Text As String)
    Dim s1 As String: s1 = Base64EncodeString(plainText)
    Dim s2 As String: s2 = Base64DecodeString(base64Text)

    Debug.Print "String: " & s2 & ", Base64: " & s1

    If s1 <> base64Text Or s2 <> plainText Then _
        Debug.Print "Check failed for """ & plainText & """ / """ & base64Text & """."
End Sub

VBA/VB6 输出

你可能需要这个

使用 rsa sha256 sha1 md5 vbscript 加密 vba 经典 asp

https://github.com/ekede/WTS-Classic-ASP-MVC-Framework/blob/master/inc/class/crypt/rsa.asp