转换VB到c#后的加密差异



正在尝试将代码从VB转换为c#,请参阅下面的VB代码

Dim StrCount As Int16
Dim str1, str2, EncryptedStr As String
EncryptedStr = String.Empty
theString = "Test@1234"
For StrCount = 1 To Len(theString)
    str1 = Asc(Mid(theString, StrCount, 1)) - 1
    str2 = str1 + Asc(Mid(StrCount, 1))
    EncryptedStr = EncryptedStr + Chr(str2)
Next

转换成c#代码

string EncryptedStr = string.Empty;
Encoding encode1 = Encoding.ASCII;
Byte[] encodedBytes = encode1.GetBytes("Test@1234");  
for (int count = 0; count < encodedBytes.Length; count++)
{
    int str1 = encodedBytes[count] - 1;
    Encoding encode2 = Encoding.ASCII;
    Byte[] encodedBytes1 = encode2.GetBytes((count + 1).ToString());  
    int str2 = str1 + (int)encodedBytes1[0];
    EncryptedStr += Convert.ToChar(str2);
}

它的工作很好,但我面临的问题是加密的密码是不同的VB &c#

我尝试加密字符串"Test@1234",加密的结果是

VB:"——¥§tfhjl

c#:¥§tfhjl

我调试并注意到在c#中Convert.ToChar(132) &Convert.ToChar(150)返回空值。

谁能解释一下这里出了什么问题

正如在此回答的评论中解释的那样,VB。NET返回当前windows代码页中的ANSI代码,而不是ASCII代码。不要期望得到相同的输出,除非您使用相同的函数,参考Microsoft.VisualBasic并使用Strings.AscStrings.Chr来获得相同的结果。

与原始代码相同的最简单的解决方案是在VisualBasic名称空间中使用AscChr方法,因为它们具有相同的功能。

,

Asc使用的ANSI可以在不同的语言环境和不同的机器上改变,所以如果你真的想要固执,你可以尝试通过显式定义要使用的编码来模仿它。

这在我的机器上产生相同的结果(但要小心在其他机器上测试):

Public Function EncryptString(aString As String) As String
    Dim sb As New StringBuilder
    Dim enc = Encoding.GetEncoding("windows-1252")
    For i = 0 To aString.Length - 1
        Dim x = enc.GetBytes(aString.Substring(i, 1))(0) - 1
        Dim y = enc.GetBytes((i + 1).ToString)(0) + x
        Dim b() As Byte = {y}
        sb.Append(enc.GetString(b))
    Next
    Return sb.ToString
End Function

所以(未经测试的)c#等效是:

public string EncryptString(string aString)
{
    StringBuilder sb = new StringBuilder();
    var enc = Encoding.GetEncoding("windows-1252");
    for (var i = 0; i < aString.Length; i++)
    {
        var x = enc.GetBytes(aString.Substring(i, 1))[0] - 1;
        var y = enc.GetBytes((i + 1).ToString())[0] + x;
        byte[] b = {y};
        sb.Append(enc.GetString(b));
    }
    return sb.ToString();
}

Vb.net遗留Asc函数,实际上是使用System.Text.Encoding.Default。在c#版本中,您使用的是ASCII。检查:

        string EncryptedStr = string.Empty;
        Encoding encode1 = Encoding.Default; //.ASCII;
        Byte[] encodedBytes = encode1.GetBytes("Test@1234");
        for (int count = 0; count < encodedBytes.Length; count++)
        {
            int str1 = encodedBytes[count] - 1;
            Encoding encode2 = Encoding.Default;
            Byte[] encodedBytes1 = encode2.GetBytes((count + 1).ToString());
            int str2 = str1 + (int)encodedBytes1[0];
            EncryptedStr += Convert.ToChar(str2);
        }

相关内容

  • 没有找到相关文章

最新更新