Visual Basic替换密​​码

时间:2013-04-13 10:17:26

标签: vb.net substitution encryption

我正在尝试使用Visual Basic创建替换密码。我是编程和挣扎的新手,所以请一定的支持。

密码应该执行以下操作:

  1. 要求用户提供要加密的消息。
  2. 向用户询问密钥(或要求系统生成密钥,以更容易编码的方式)。
  3. 使用密钥加密邮件。
  4. 返回加密邮件。
  5. 示例:

    • Message = hello
    • 字母:“abcdefghijklmnopqrstuvwxyz”
    • Key:“kxgtlmpqbwcnderfahjusviyoz”
    • 返回加密邮件。

    我需要帮助的主要部分是2和3.我需要知道的是解决这个问题的步骤(英语或语法)然后我可以尝试自己编写代码。如果你有一个很好的例子。

    请注意,我并不是在寻求有关如何创建凯撒密码的帮助。这里的替换密码将用另一个字符(这是关键字)替换每个字母。

    感谢。

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我不知道任何Visual Basic,所以我不能给你代码,但既然你说英语的解释是可以接受的,那么让我试着把你的步骤分解成你可能更容易找到的小步骤实现:

  1. 首先,您需要从用户那里获取消息,例如要求他们在字符串中键入(或复制和粘贴)。我假设你知道如何在VB中做到这一点,因为我没有。

  2. 接下来,为密钥执行相同操作。 (您可能应该构建您的程序,以便,如果密钥结果无效 - 可以在下一步中方便地检查 - 您可以循环回到此步骤并要求新密钥。)您可能希望立即转换所有小写​​(或全部大写)的关键,并检查它是否有26个字符。

  3. 接下来,您应该将关键字符串转换为要替换哪些字母的地图。 (这个可能没有必要:有些语言提供现成的字符串音译功能,比如PHP的strtr,它可以直接使用这样的键字符串,但我想你想要这样做“从头开始“。”这可能有点牵扯,所以我会把它分解成更小的步骤:

    • 首先,您需要创建地图对象。 VB希望提供一些表示从字符到字符(或从单字母字符串到单字母字符串)的地图的方法,可能是“字典”或“哈希表”。

    • 接下来,您需要遍历键字符串的字符。通常有两种方法可以做到这一点:将密钥字符串拆分为字符列表(或单字母子字符串)并循环遍历,或者只循环索引 i 从1运行到字符串的长度,并在每次迭代时从字符串中提取 i -th字符。在任何一种情况下,您还需要跟踪(或计算) i 字母表中的字母。

    • 现在,假设您现在有两个变量: k ,其中包含键字符串中的 i - 字母, a 在字母表中包含 i 字母。现在,只需将 k 的条目映射到 a 到您的字典/散列表/无论在VB中调用它。如果输入消息可以包含大写和小写字母,则应为 k a 的大写和小写版本插入映射条目。此外,对于解密,只需交换 k a ,以便字典从 a 映射到 k 。< / p>

      • 这也是检查密钥有效性的好时机:在将地图条目从 k 插入 a 之前,请检查是否存在已经是从 k 到其他一些字母的地图条目。如果有,则中止,让用户知道密钥无效并要求输入新密钥。这将确保密钥没有重复的字母,这(以及它的长度为26个字母的事实)确保它是字母表的有效排列。哦,你显然也应该检查 k 实际上是一个字母,而不是一个标点字符。

      • (对于解码,这有点棘手;您可能想要构建两个地图,每个方向一个,这样您就可以使用 k -to- a 有效性检查地图。)

  4. 最后,您可以使用您构建的地图对消息进行编码:只需遍历消息中的每个字符,检查它是否在地图中找到,如果是,则将其替换为映射到的字符。 (如果你不能修改原始的消息字符串,你可以将每个输出字符附加到一个字符列表,然后最后将它们全部连接成一个字符串。或者只是从一个空的输出字符串开始,并直接将每个输出字符附加到它,虽然可能效率低,取决于VB中的字符串操作的实现方式,而不是首先构建列表。)

答案 2 :(得分:0)

假设你的字母表的长度是相同的, 你可以做一个FOR循环来检查字符串的每个字符(该字符与你的密钥的关系)。

例如,您的消息&#34; hello&#34;。

这不是真正的代码,只是为了展示您所问的内容的概念:

for each letter in message
    position_in_alphabet = current_letter
    cipher_letter = key(position_in_alphabet)
    append cipher_letter to cipher_message

例如,&#34;你好&#34;是5个字符。所以这个循环将循环5次。 字母表中的位置是(第8,第5,第12,第12,第15)。 你插入与密钥相关的内容,然后你得到了&#34; qlnnr&#34; (或者关键要求)。

总而言之,它看起来像:

Dim _message As String = "hello"
Const _plain As String = "abcdefghijklmnopqrstuvwxyz"
Const _key As String = "kxgtlmpqbwcnderfahjusviyoz"
Dim charPos As Integer = 0
Dim Cipher As String = ""

For i = 0 To _message.Length - 1
    charPos = _plain.IndexOf(_message(i))
    Cipher = Cipher & _key(charPos)
Next i

相反,查找密钥相对于密钥的位置,然后将其放入明文字典中,如下所示:

Dim _cipher As String = "qlnnr"
Const _plain As String = "abcdefghijklmnopqrstuvwxyz"
Const _key As String = "kxgtlmpqbwcnderfahjusviyoz"
Dim charPos As Integer = 0
Dim Message As String = ""

For i = 0 To _message.Length - 1
    charPos = _key.IndexOf(_cipher(i))
    Message = Message & _plain(charPos)
Next i