Как мне исправить мои шифровальные коды Цезаря для оператора цикла для шифрования?

Я пытаюсь создать базовый шифр Цезаря в Visual Basic 2010 Express (консольное приложение), но всякий раз, когда он шифрует строку, он правильно шифрует первый символ и заменяет все остальные тем же зашифрованным символом.

Я перепробовал все, что мог придумать, и поискал по всему Интернету, и не могу найти базовый способ консольного приложения, который работает, я знаю, что это можно сделать, так как это было задано как домашнее задание, и в классе есть другие люди кто прошел через эту проблему.

Sub Main()

    Dim Message As String
    Dim EncMessage As String = ""
    Dim counter As Integer = 0

    Do Until counter = 1     'This just repeats the program

        Console.Write("Please enter a string to encrypt: ")
        Message = Console.ReadLine

        Dim LetterArray() As Char = Message.ToCharArray

        For i = 0 To LetterArray.Length - 1
            EncMessage = EncMessage & Chr(Asc(LetterArray) + 3)     'Encrypts the characters one by one (i think this is where the issue is as it encrypts the first one correct but then just outputs the same character on top the correct amount of times)

'Этот оператор if просто зацикливает символы X Y Z x y z обратно в начало алфавита, поскольку он предназначен только для шифрования букв

            If EncMessage = "{" Then     
                EncMessage = Chr(Asc(LetterArray) - 23)
            ElseIf EncMessage = "|" Then
                EncMessage = Chr(Asc(LetterArray) - 23)
            ElseIf EncMessage = "}" Then
                EncMessage = Chr(Asc(LetterArray) - 23)
            ElseIf EncMessage = "[" Then
                EncMessage = Chr(Asc(LetterArray) - 23)
            ElseIf EncMessage = "\" Then
                EncMessage = Chr(Asc(LetterArray) - 23)
            ElseIf EncMessage = "]" Then
                EncMessage = Chr(Asc(LetterArray) - 23)
            End If


        Next

        Console.WriteLine(EncMessage)
        Console.ReadKey()
        EncMessage = ""

    Loop

End Sub

Например, если я ввожу «колбаса», он будет выводить «vvvvvvv», но он должен вывести «vdtvdjh», потому что я хочу, чтобы он сдвинулся вперед на 3 символа. Пожалуйста, помогите, спасибо.


person Jacob Cheadle    schedule 26.01.2019    source источник
comment
Почему этот вопрос отмечен как c#? Не будучи специалистом по VB, я тем не менее вижу, что вы никогда не используете индекс цикла i в своем коде, поэтому я предполагаю, что Asc(LetterArray) всегда принимает первый символ LetterArray. Попробуйте вместо этого LetterArray[i]. Но вы столкнетесь с другой проблемой, потому что вы сравниваете все закодированное сообщение, а не только последний символ ...   -  person derpirscher    schedule 26.01.2019
comment
Кроме того, ваша попытка справиться с переполнением алфавита не очень надежна, потому что она зависит от определенных символов, следующих за буквами a-z, и работает только при сдвиге на 3. Попробуйте найти более общий подход. Например, вы можете вычислить смещение до a и A соответственно, а если оно ›26, вы можете выполнить операцию по модулю ...   -  person derpirscher    schedule 26.01.2019
comment
Полезные ссылки: Как спросить, ДОБРО ПОЖАЛОВАТЬ TOUR и Отладка кода с помощью мощного, бесплатного , встроенный (!) Step Debugger   -  person Ňɏssa Pøngjǣrdenlarp    schedule 26.01.2019
comment
Возможный дубликат Как продвинуть строку из 3 букв в алфавит (шифр Цезаря)?   -  person Icepickle    schedule 27.01.2019