2017-04-11 40 views
0

ファイルを暗号化したい。私はXORを使ってそれを暗号化します。しかし、問題は、私はそれを暗号化することができますが、私はそれを復号化するとき、それは私に異なる結果(いない元のファイル)を与える暗号化と復号化時に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 
の作品

コードを修正するにはどうすればよいですか?あなたが暗号化にXORを使用しているとき、一つには

おかげ

+0

コードをステップ実行し、値を調べて、16進数で調べることをお勧めします。文字エンコーディングと値を理解するのに時間をかけてください。 – zaph

答えて

0

は、あなたは、単に渡されたビットマスクに基づいてビットを反転しています。そのため、暗号化と復号化は必要ありません。どちらも同じことを行います。私はあなたのコードを吟味していませんが、2つの可能性があります:1つは2つの作品のうちの一方で、もう一方はそうではありません。両方が失敗した場合は、最初のパラメータをUnicodeに変換し、2番目のパラメータで同じステップ(または前提)を取っていない可能性があります。それが構文的に正しいとはいえ、それはおそらくまだ実行されていて、あなたが思うものを返さないだけです。

2

文字列はバイトではなく文字で構成され、VB6文字では16ビットです。 Unicodeとの変換によってUnicode-ASCII境界を越えてうまく転送されないパターンが発生する可能性があるため、ASCIIドメインの2組の文字がXORのときに競合が発生する可能性があります。

ファイルをバイト配列に読み込んでXORを出力し、バイト配列として出力し、テキストをファイルに読み書きするときに発生するUnicodeへの変換を避ける必要があります。 Pass変数のStrConvは引き続き使用できます。これは、コンバージョンによって文字化けしても毎回同じ方法で文字化けするためです。

エンコードとデコードの間で各国語システムを変更すると、StrConvステップで異なる「文字化け」が発生し、失敗する可能性があることに注意してください。