这是我到目前为止所做的。
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'无效。"
答案 0 :(得分:1)
首先,阅读有关保护字符串的更好方法的评论。
然后,我们可以查看您的代码。您可以从密码中一次输出一个字符的字符,而不是整个密码。您可以将循环变量与mod
运算符一起使用以获取密码中的相应索引,以便它沿着字符串的长度重复密码中的字符。
使用Asc(Ascw(c))
表示您获得字符的字符代码的字符串表示的第一个字符的字符代码。例如,字符A
将为您提供字符代码65
,它将隐式转换为字符串"65"
以获取字符6
的字符代码,这是54.由于你只使用字符代码的第一个数字,因此无法获得原始字符串。
您应该使用ony AscW
获取字符代码,然后使用ChrW
将调整后的字符代码转换回字符。 Asc
和Chr
函数不支持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编码从字节创建字符串值。