Xor没有按预期使用VisuabBasic

时间:2013-07-09 05:21:23

标签: vb.net xor

这是一个简单的程序,我试图用它来演示一些基本加密的工作。使用VB的算法,但下面这段代码不能按预期工作。

Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        RichTextBox2.Text = ""
        Dim text, key As String
        text = RichTextBox1.Text
        key = TextBox1.Text
        Dim i = 0
        For i = 0 To text.Length - 1 Step 1
            RichTextBox2.Text = Chr(Asc(text(i)) Xor Asc(key(i Mod key.Length))) + RichTextBox2.Text
        Next
    End Sub

我收到一些糟糕的输出作为我的密文,当我试图获取原始文本时它只给我垃圾

Output:

        E
    O
    LO

Input:
 text: this is a sample text
 key : pass

1 个答案:

答案 0 :(得分:1)

您用于加密/解密的算法是错误的,因为它来自一个错误的假设:加密和未加密字符串的长度必须相同(很少出现这种情况)。

针对您的目标的基本加密/解密:

For i As Integer = 0 To text.Length - 1
    RichTextBox2.Text = Chr(Asc(text(i)) Xor key) & RichTextBox2.Text
Next

key是整数。

您所做的是更改key部分,以便可以考虑字符串。问题是,您选择实现此目标的方式不会为两种情况(加密/解密)提供相同的密钥:您正在生成密钥作为所考虑的给定长度的函数(加密字符串与解密字符串)因此,你假设两种长度都是相同的,不是这种情况。

------------------------ UPDATE(示例代码,键为整数)

在表单中添加2个按钮(ButtonEncryptButtonDecrypt)和两个文本框(TextBoxInputTextBoxOutput)并复制以下代码:

Private Sub ButtonEncrypt_Click(sender As System.Object, e As System.EventArgs) Handles ButtonEncrypt.Click

    TextBoxOutput.Text = ""
    Dim key As Integer = 123
    Dim inputText As String = TextBoxInput.Text
    For i As Integer = 0 To inputText.Length - 1
        TextBoxOutput.Text = Chr(Asc(inputText(i)) Xor key) & TextBoxOutput.Text
    Next

End Sub

Private Sub ButtonDecrypt_Click(sender As System.Object, e As System.EventArgs) Handles ButtonDecrypt.Click

    TextBoxOutput.Text = ""
    Dim key As Integer = 123
    Dim inputText As String = TextBoxInput.Text
    For i As Integer = 0 To inputText.Length - 1
        TextBoxOutput.Text = Chr(Asc(inputText(i)) Xor key) & TextBoxOutput.Text
    Next

End Sub

例如,如果您在TextBoxInput中输入“加密此字符串”并单击ButtonEncrypt,您将获得“加密字符串”(我无法复制我在此处获取的内容,因为字符无法识别)TextBoxOutput。如果您现在将此“加密字符串”复制到TextBoxInput并点击ButtonDecrypt,您会看到“加密此字符串”会显示在TextBoxInput中。也就是说,您可以使用此代码加密/解密任何内容。

此代码与您的代码之间的差异在于我使用的key在两种情况下都是通用的(加密和解密)。您使用的那个不是常量,因为您将其定义为给定字符串长度(解密或加密的字符串)的函数。因此,您的问题的解决方案是确保您使用的key在两种情况下都相同。

最后,我想重新坚持这个算法期望key是一个整数(因为Chr只能处理整数);但有一个简单的解决方法(你做了什么):依赖一个定义为字符串的键,并在执行加密/解密时,将给定的字符转换为整数(依赖于Asc)。因此,您(一般)解决问题的方法是正确的,唯一的问题是,您用来考虑key的不同字符的方式是错误的:它依赖于给定字符串的长度,该长度不同于加密/解密版本,从而激发对不同密钥的计算;也就是说,考虑加密的密钥123和解密的密钥(哑的例子)。

我希望我的观点现在更加明确。