加密和解密时,XOR加密会产生不同的结果

时间:2017-04-11 15:28:01

标签: encryption vb6

我想加密文件。我使用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

我该怎么做才能修复我的代码?

由于

3 个答案:

答案 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