2013-04-13 74 views
1

我正在尝试使用Visual Basic创建替换密码。我是编程和努力的新手,希望得到一些支持。Visual Basic替换密​​码

的密码应做到以下几点:

  1. 询问用户的消息进行加密。
  2. 向用户询问密钥(或要求系统生成密钥,以较易于编码为准)。
  3. 使用密钥加密消息。
  4. 返回加密消息。

实施例:

  • 消息=你好
  • 字母: “ABCDEFGHIJKLMNOPQRSTUVWXYZ”
  • 键: “kxgtlmpqbwcnderfahjusviyoz”
  • 返回加密的消息。

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

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

谢谢。

+1

很难不知道你在哪里。在开始之前,有用的概念是数组,字典,循环,随机,StringBuilder。假设你从用户那里得到一个密钥是一个验证问题,而不是一个UI。如果您还不了解上述情况,则需要退后一步并查看它们。 PS你知道这种密码很容易被破解吗? –

回答

0

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

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

  2. 接下来,对密钥做同样的操作。 (你可能应该构建你的程序,以便如果密钥无效—可以方便地在下一步—中检查,你可以循环回到这一步并要求一个新的密钥。)你可能要立即转换所有小写​​字母(或全部大写字母)的关键字,并检查它是否只有26个字符。

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

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

    • 接下来,您需要遍历键字符串的字符。通常有两种方法可以做到这一点:将密钥字符串分割为一个字符列表(或单字母子字符串)并循环,或者只是循环索引i从1到字符串长度并且从每个迭代的字符串中提取第012个字符。无论哪种情况,您还需要跟踪(或计算)字母表中的第一个字母。

    • 现在,假设你现在有两个变量:ķ包含密钥字符串中个字母,一个包含字母表中个字母。现在,只需将一个入口映射ka插入到您的字典/散列表/无论它在VB中调用。如果您的输入消息可以同时包含大小写字母,则应该为大小写版本ka插入一个映射条目。此外,对于解密,只是交换ķ一个以便词典地图从一个ķ来代替。

      • 这也是以检查密钥的有效性的好时机:从插入ķ一个映射条目之前,检查是否有尚未从ķ映射条目到其他一些信件。如果有,中止,让用户知道密钥无效并要求新密钥。这将确保密钥没有重复的字母,这与字母长度为26的事实一起确保它是字母表的有效排列。哦,你显然也应该检查一下,实际上它是一个字母,而不是一个标点符号。

      • (对于解码,这是一个较为麻烦,你可能想建立两个地图,每个方向一个,只是让你可以使用ķ - 到 - 一个地图为有效性检查。)

  4. 最后,你可以使用你内置地图进行编码的消息:刚刚在消息中的每个字符循环,检查它是否在地图上找到,并且,如果是这样,与更换它映射到的字符。 (如果你不能修改原始的消息字符串,你可以将每个输出字符附加到一个字符列表中,然后最后将它们全部加入到一个字符串中,或​​者直接从一个空的输出字符串开始,直接将每个输出字符附加到它,尽管可能效率较低,这取决于在VB中如何实现字符串操作,而不是首先构建列表。)

+0

令人惊叹。我非常感谢你的帮助和时间。我现在就开始用这个:)谢谢。 –

0
+0

如果OP想要进行真实(现代,安全)的加密,这些都是很好的参考。但是,如果他们只是为了好玩而实现替代密码,或者为了加密难题,那么这些链接就不会非常相关。 (另外,仅包含链接列表的答案在堆栈溢出时通常不被认为是非常好的。) –

+0

感谢提醒Ilmari,感谢它。也许我应该先告诉他只是谷歌它;-) – Edper

+0

谢谢你的链接。有用的提示:) –

0

假设你的钥匙是字母长度相同, 你可以做一个for循环,检查字符串的每个字符(该字符是如何与你的密钥)。

例如,您的消息“hello”。

这不是实际的代码,而只是证明你在问什么概念:

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

例如,“你好”,是5个字符。所以这个循环将循环5次。 (第8,5,12,12,15)。 你插入那些关键的关键,你会得到“qlnnr”(或者关键指示)。

全部放在一起,它会看起来像:

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