将VB转换为C#后的加密差异

时间:2015-10-22 07:24:30

标签: c# .net vb.net encryption ascii

尝试将代码从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&amp; C#

我尝试加密字符串“Test @ 1234”,加密结果是

VB:“ - ¥§tfhjl

C#:¥§tfhjl

我调试并注意到在C#Convert.ToChar(132)&amp; Convert.ToChar(150)给出空值。

有人可以解释,这里出了什么问题

3 个答案:

答案 0 :(得分:1)

最简单的解决方案和与原始代码完全相同的解决方案是使用Asc命名空间中的ChrVisualBasic方法,因为它们具有相同的功能。

但是

Asc使用的ANSI可以在不同的语言环境和不同的机器上进行更改,因此如果你真的想要顽固,你可以通过明确定义要使用的编码来尝试模拟它。

这会在 my 计算机上产生相同的结果(但要小心在其他计算机上测试):

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();
}

答案 1 :(得分:1)

正如在这个答案here的评论中所解释的那样,VB.NET在当前的Windows代码页中返回ANSI代码,而不是ASCII代码。除非您使用相同的功能,参考Microsoft.VisualBasic并使用Strings.AscStrings.Chr来获得相同的结果,否则不要期望获得相同的输出。

答案 2 :(得分:0)

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);
        }