2

这是一个简单的程序,我试图用它来演示一些基本加密的工作原理。使用 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
4

1 回答 1

1

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

您目标的基本加密/解密是:

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

哪里key是整数。

您所做的是更改key部分以便可以考虑字符串。问题是您为实现此目标而选择的方式并没有为两种情况(加密/解密)提供相同的密钥:您正在根据所考虑的给定长度生成密钥(加密字符串与解密字符串)因此您假设两个长度都相同,但事实并非如此。

------------------------ 更新(以整数作为键的示例代码)

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

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 加密和 513 解密(愚蠢的例子)。

我希望我的观点现在更清楚了。

于 2013-07-09T09:26:35.077 回答