|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - программа шифрования алгоритм RC4 |
|
VBA - программа шифрования алгоритм RC4
|
Новый участник Сообщения: 11 |
Помогите найти ошибку. При нажатии на кнопку расшифровать расшифровывает цифры неправильно, получается бессмыслица, а должен быть текст. вот полное задание
Рассматривается симметричный криптографический алгоритм RC4 (шифрование и расшифровка производятся с помощью одного и того же секретного ключа). Преобразование текста производится путем применения логической операции исключающего ИЛИ (XOR) к битам текущего символа текста и соответствующего (по порядку) символа ключевой последовательности (гаммы). Гамма представляет собой псевдослучайную последовательность чисел, метод получения которой основан на использовании S-блока. S-блок размером 8*8=256 – это массив S0, S1, …, S255, элементы которого представляют собой перестановку чисел от 0 до 255, зависящую от ключа переменной длины. При инициализации S-блок заполняется линейной последовательностью чисел: S0 = 0, S1 = l, …, S255 = 255. Элементы гаммы генерируются затем с помощью итерационной процедуры, в которой начальное значение целочисленного счетчика i принимается равным нулю, а начальное значение j (0j255) – является секретным ключом: i = (i + 1) mod 256 j = (j + Si) mod 256 Элементы S-блока Si и Sj меняются местами t = (Si + Sj) mod 256 G = St Здесь mod 256 – операция взятия остатка целочисленного деления по модулю 256, G – очередной элемент гаммы. Задание. 1. Написать программу, реализующую шифрование и расшифровку алгоритмом RC4 указанного вида. Открытый текст сообщения содержит только ASCII-символы, а гамма и шифртекст – десятичные числа от 0 до 255. 2. С помощью программы шифрования/расшифровки получить открытый текст по следующему шифртексту: при условии, что cекретный ключ j = 231. Указания для выполнения задания. Организовать цикл для поэлементной расшифровки сообщения. В теле цикла: a. Перевести очередное десятичное число из шифртекста в двоичный код; b. Получить очередной элемент гаммы, который также перевести в двоичный код; c. В цикле произвести операцию XOR над соответственными разрядами (битами) двоичных кодов шифртекста и гаммы; d. Результат (двоичный код) перевести в десятичное число (ASCII-код), а затем в соответствующий символ из ASCII. Option Strict Off Option Explicit On Friend Class Form1 Inherits System.Windows.Forms.Form Private Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load T. ext_Renamed.Text = "" Text_key.Text = "" Text_encrypt.Text = "" Text_decrypt.Text = "" End Sub Private Sub CmdEncr_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles CmdEncr.Click Dim X As Object Dim G As Object Dim t As Object Dim tmp As Object Dim CharText As Object Dim b As Object Dim i As Object Dim j As Object Dim LenText As Object Dim a As Object If Text_Renamed.Text = "" Or Text_key.Text = "" Then MsgBox("Введите текст и секретный ключ (от 0 до 255) для выполнения операции шифрования.") Exit Sub ElseIf CDbl(Text_key.Text) < 0 Or CDbl(Text_key.Text) > 255 Then MsgBox("Секретный ключ должен быть от 0 до 255.") Exit Sub End If Dim S(255) As Short For a = 0 To 255 S(a) = a Next a Text_encrypt.Text = "" LenText = Len(Text_Renamed.Text) j = Text_key.Text i = 0 For b = 1 To LenText CharText = Asc(Mid(Text_Renamed.Text, b, 1)) i = (i + 1) Mod 256 j = (j + S(i)) Mod 256 tmp = S(i) S(i) = S(j) S(j) = tmp t = (S(i) + S(j)) Mod 256 G = S(t) X = CharText Xor G If b < LenText Then Text_encrypt.Text = Text_encrypt.Text & X & " " Else Text_encrypt.Text = Text_encrypt.Text & X End If Next b End Sub Private Sub CmdDecr_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles CmdDecr.Click Dim CharText As Object Dim X As Object Dim G As Object Dim t As Object Dim tmp As Object Dim b As Object Dim n As Object Dim i As Object Dim j As Object Dim a As Object Dim LenEncrypt As Object LenEncrypt = Len(Text_encrypt.Text) If Text_encrypt.Text = "" Or Text_key.Text = "" Then MsgBox("Введите зашифрованный текст (каждое число через пробел) и секретный ключ (от 0 до 255) для выполнения операции расшифрования.") Exit Sub ElseIf Mid(Text_encrypt.Text, 1, 1) = " " Then MsgBox("Пробел не может быть первым символом.") Exit Sub ElseIf Mid(Text_encrypt.Text, LenEncrypt, 1) = " " Then MsgBox("Зашифрованный текст не может заканчиваться пробелом.") Exit Sub ElseIf CDbl(Text_key.Text) < 0 Or CDbl(Text_key.Text) > 255 Then MsgBox("Секретный ключ должен быть от 0 до 255.") Exit Sub End If Dim S(255) As Short Dim Asc_Renamed(1000) As Short For a = 0 To 255 S(a) = a Next a Text_decrypt.Text = "" j = Text_key.Text i = 0 n = 1 For b = 1 To LenEncrypt tmp = Mid(Text_encrypt.Text, b, 1) If tmp <> " " Then Asc_Renamed(n) = CShort(Asc_Renamed(n) & tmp) Else n = n + 1 If n > 1000 Then MsgBox("Слишком большой текст. Должно быть не более 1000 чисел без учета пробелов.") Exit Sub End If End If Next b For b = 1 To n i = (i + 1) Mod 256 j = (j + S(i)) Mod 256 tmp = S(i) S(i) = S(j) S(j) = tmp t = (S(i) + S(j)) Mod 256 X = Asc_Renamed(b) Xor G CharText = Chr(X) Text_decrypt.Text = Text_decrypt.Text & CharText Next b End Sub Private Sub CmdClear_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles CmdClear.Click Text_Renamed.Text = "" Text_key.Text = "" Text_encrypt.Text = "" Text_decrypt.Text = "" End Sub Private Sub CmdExit_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles CmdExit.Click End End Sub End Class |
|
Отправлено: 23:02, 02-01-2010 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Anton Naumov, можно осмысленные имена переменных, отступы и комментарии перед каждым циклом с описанием идеи? Я вот это
Цитата Anton Naumov:
Вообще считаю что можно было оставить одну функцию для кодирования-декодирования (т.к. оператор XOR обратим), тогда бы не было проблем с неправильным восстановлением. |
|
Отправлено: 17:37, 03-01-2010 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 11
|
Профиль | Отправить PM | Цитировать я нашел ошибку
|
Отправлено: 19:46, 03-01-2010 | #3 |
Ветеран Сообщения: 3320
|
Профиль | Отправить PM | Цитировать Anton Naumov, так почему её не указать публично?
Всем кому интересна данная тема. Во первых наблюдаем опечатку - T. ext_Renamed.Text = "" Нужно исправить на Text_Renamed.Text = "" Создаётся впечатление что код даже не пробовали собирать. Хотя с другой стороны, по умолчанию среда, при неудачном сборе, запускает последний удачно собранный бинарник (не знаю, на сколько это было правильно сделано со стороны MS, да и зачем? Без проблемная философия .NET?), так что вполне возможно внося правку допустили опечатку. Тем не менее, нужно внимательно следить за тем, с репрезентацией какого исходника сейчас имеем дело, читать сообщения во время сборки. Далее, если б код был изначально написан с рекомендацией pva (CmdDecr + CmdEncr) - следующей ошибки могло и не быть. Private Sub CmdDecr_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles CmdDecr.Click '... Dim G As Object '... X = Asc_Renamed(b) Xor G '... Должно быть (по аналогии с Private Sub CmdEncr_Click) так G = S(t) X = Asc_Renamed(b) Xor G Ещё конечно остаются по оптимизации программы (не самого алгоритма, а именно программной части). |
Отправлено: 06:45, 04-01-2010 | #4 |
Новый участник Сообщения: 11
|
Профиль | Отправить PM | Цитировать именно такую ошибку я и нашел. спасибо
|
|
Отправлено: 12:48, 04-01-2010 | #5 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Утилиты - программу для шифрования\дишифрования текста. | svetohka | Программное обеспечение Windows | 9 | 13-02-2022 09:26 | |
RetroShare 0.4.14 RC4 | OSZone Software | Новости программного обеспечения | 0 | 07-01-2010 18:30 | |
Программа шифрования данных | __sa__nya | Программное обеспечение Windows | 5 | 21-04-2008 10:32 | |
Delphi - Алгоритм шифрования TEA | fossil | Программирование и базы данных | 2 | 25-10-2007 11:38 | |
RC4 & MD5 | Surround | Программирование и базы данных | 2 | 22-01-2005 05:30 |
|