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 选项,而是考虑了我的具体需求。我需要能够:
- 将 Base 64 编码字符串转换为字节数组并传递给 .NET 方法
- 将从 .NET 调用返回的字节数组转换为 Base 64 编码字符串
我看到的最简单的选择是编写自己的 VBA 代码以在 Base 64 和字节数组之间进行转换 - 但是我看到两个陷阱:
- 编码问题。字节数组和字符串之间的转换意味着必须处理编码问题。
- 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
我正在 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 选项,而是考虑了我的具体需求。我需要能够:
- 将 Base 64 编码字符串转换为字节数组并传递给 .NET 方法
- 将从 .NET 调用返回的字节数组转换为 Base 64 编码字符串
我看到的最简单的选择是编写自己的 VBA 代码以在 Base 64 和字节数组之间进行转换 - 但是我看到两个陷阱:
- 编码问题。字节数组和字符串之间的转换意味着必须处理编码问题。
- 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