这是一个简单的程序,我试图用它来演示一些基本加密的工作。使用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
答案 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个按钮(ButtonEncrypt
和ButtonDecrypt
)和两个文本框(TextBoxInput
和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和解密的密钥(哑的例子)。
我希望我的观点现在更加明确。