如何使用密码Xor字符串?

时间:2014-05-18 13:22:35

标签: vb.net

这是我到目前为止所做的。

Public Function XOREncDec(ByVal textToEncrypt As String) As String
    Dim inSb As New StringBuilder(textToEncrypt)
    Dim outSb As New StringBuilder(textToEncrypt.Length)
    Dim c As Char
    For i As Integer = 0 To textToEncrypt.Length - 1
        c = inSb(i)
        c = Chr(Asc(AscW(c)) Xor "password")
        outSb.Append(c)
    Next
    Return outSb.ToString()
End Function

但是我在这里收到错误

c = Chr(Asc(AscW(c)) Xor "password")

"从字符串转换"密码"输入' Long'无效。"

1 个答案:

答案 0 :(得分:1)

首先,阅读有关保护字符串的更好方法的评论。

然后,我们可以查看您的代码。您可以从密码中一次输出一个字符的字符,而不是整个密码。您可以将循环变量与mod运算符一起使用以获取密码中的相应索引,以便它沿着字符串的长度重复密码中的字符。

使用Asc(Ascw(c))表示您获得字符的字符代码的字符串表示的第一个字符的字符代码。例如,字符A将为您提供字符代码65,它将隐式转换为字符串"65"以获取字符6的字符代码,这是54.由于你只使用字符代码的第一个数字,因此无法获得原始字符串。

您应该使用ony AscW获取字符代码,然后使用ChrW将调整后的字符代码转换回字符。 AscChr函数不支持Unicode字符。

您输入不需要StringBuilder,您可以直接从字符串中访问字符。

Public Function XOREncDec(ByVal textToScramble As String) As String
  Dim builder As New StringBuilder(textToScramble.Length)
  Dim password As String = "password"
  Dim c As Char
  For i As Integer = 0 To textToScramble.Length - 1
    Dim pos As Integer = i mod password.Length
    c = textToScramble(i)
    c = ChrW(AscW(c) Xor AscW(password(pos)))
    builder.Append(c)
  Next
  Return builder.ToString()
End Function

请注意,我将参数从textToEncrypt重命名为textToScramble,因为这种简单的编码在任何现代意义上都不能称为加密。

另外,作为编码结果的字符串通常包含与真实字符不对应的字符代码。它只要您解码相同的字符串对象就可以工作,但是如果您将字符串写入文件然后尝试将其读回,则很可能会损坏它。要获得能够在任何类型的存储或通信中生存的数据,您可以将字符串编码为字节,对字节进行加扰,然后使用例如base64编码从字节创建字符串值。