我想加密文件。我使用XOR加密它。但是,问题是,我可以加密它,但是当我想解密它时,它会给我不同的结果(不是原始文件)
以下是我使用的代码
Public Function Encrypt(ByVal txt As String, ByVal pass As String) As String
Dim mem() As Byte
mem = StrConv(txt, vbFromUnicode)
For i = 0 To UBound(mem)
mem(i) = Asc(mem(i)) Xor Asc(Mid(pass, (i Mod Len(pass)) + 1, 1))
Next i
Encrypt = StrConv(mem, vbUnicode)
Erase mem
End Function
Public Function Decrypt(ByVal txt As String, ByVal pass As String) As String
Dim mem() As Byte
mem = StrConv(txt, vbFromUnicode)
For i = 0 To UBound(mem)
mem(i) = Asc(mem(i)) Xor Asc(Mid(pass, (i Mod Len(pass)) + 1, 1))
Next i
Decrypt = StrConv(mem, vbUnicode)
Erase mem
End Function
Private Sub Form_Load()
Enkrip = Encrypt(txt.LoadFile("C:\mom.txt"), "FROM YOUR SON")
dekrip = Decrypt(Enkrip, "FROM YOUR SON")
MsgBox Enkrip & vbCrLf & dekrip
End Sub
dekrip的值应该是C:\ mom.txt的原始内容,但它会返回不同的结果
我也试过这段代码,效果很好
Private Sub Form_Load()
Data = "A"
pass = "B"
enkrip = Chr(Asc(Data) Xor Asc(pass))
dekrip = Chr(Asc(enkrip) Xor Asc(pass))
MsgBox enkrip & vbCrLf & dekrip
End Sub
我该怎么做才能修复我的代码?
由于
答案 0 :(得分:2)
字符串由字符组成,而不是字节,VB6字符是16位。当您在ASCII域中XOR
两组字符时,这会产生可能的冲突,因为与Unicode之间的转换可能会导致在Unicode-ASCII边界内传输不良的模式。
您应该将文件读入字节数组,执行XOR
,并将其作为字节数组输出,从而避免在读取/写入文件时发生的Unicode转换。您仍然可以使用StrConv
变量的Pass
,因为即使转换出现乱码,每次都会以相同的方式出现乱码。
请注意,如果您在编码和解码之间更改国家语言系统,StrConv
步骤可能会导致不同的“乱码”,因此可能会失败。
答案 1 :(得分:0)
首先,当您使用XOR进行加密时,您只是根据传递的位掩码来翻转位。因此,您不需要加密和解密 - 它们都做同样的事情。我没有搜索过您的代码,但有两种可能性:一种是两种工作中的一种而另一种不是 - 通过调用两次来确定哪一种工作,并使其成为加密方法。如果它们都失败了,那么你可能会将第一个参数转换为unicode,而不是在第二个参数中采用相同的步骤(或假设)。虽然这在语法上是正确的,但它可能仍会运行,而不是返回你的想法。
答案 2 :(得分:0)
我认为您的错误在于
(i Mod Len(pass)) + 1)
你最好有类似的东西
1 + ((i-1) mod len(Pass))
,从 1 到 m ,在这里您将 0 到 m ,所以好像一步一步。
您可以从 1 转到 ubound ,或者从 0 转到 ubound-1