2013-04-13 69 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