2017-04-11 38 views
0

我想加密文件。我使用异或来加密它。但是,问题是,我可以加密,但是当我要解密它,它给了我不同的结果(而不是原始文件)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

单步执行代码并检查值,最好在十六进制中检查它们。花点时间了解字符编码和值。 – zaph

回答

0

首先,当您使用XOR加密,你只是翻转基础上通过掩码位。出于这个原因,你不需要加密和解密 - 他们都做同样的事情。我没有搜索过你的代码,但有两种可能性:一种是两种作品中的一种,另一种则没有 - 通过调用两次并使用这种加密方法来找出哪一种可行。如果他们都失败了,他们很有可能将你的第一个参数转换为unicode,而不是在第二个参数中采用相同的步骤(或假设)。虽然这在语法上是正确的,但它可能仍会运行,但不会返回您的想法。

2

字符串由字符组成,而不是字节,VB6字符是16位。当您在ASCII域中使用两组字符时,这会产生可能的冲突,因为与Unicode之间的转换可能会导致无法在Unicode - ASCII边界之间良好传输的模式。

您应该将文件读取到一个字节数组中,执行您的XOR并将其输出为字节数组,避免将文本读取/写入文件时发生的Unicode转换。您仍然可以使用Pass变量的StrConv,因为即使它被转换混淆,它也会每次都以相同的方式乱码。

请注意,如果您在编码和解码之间更改国家语言系统,则StrConv步骤可能会导致不同的“瑕疵”,因此可能会失败。