2017-04-11 40 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步驟可能會導致不同的「瑕疵」,因此可能會失敗。