Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - программа шифрования алгоритм RC4

Ответить
Настройки темы
VBA - программа шифрования алгоритм RC4

Новый участник


Сообщения: 11
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: Drongo
Дата: 03-01-2010
Описание: используйте тег - [code]...[/code]
Помогите найти ошибку. При нажатии на кнопку расшифровать расшифровывает цифры неправильно, получается бессмыслица, а должен быть текст. вот полное задание

Рассматривается симметричный криптографический алгоритм RC4 (шифрование и расшифровка производятся с помощью одного и того же секретного ключа). Преобразование текста производится путем применения логической операции исключающего ИЛИ (XOR) к битам текущего символа текста и соответствующего (по порядку) символа ключевой последовательности (гаммы). Гамма представляет собой псевдослучайную последовательность чисел, метод получения которой основан на использовании S-блока. S-блок размером 8*8=256 – это массив S0, S1, …, S255, элементы которого представляют собой перестановку чисел от 0 до 255, зависящую от ключа переменной длины.
При инициализации S-блок заполняется линейной последовательностью чисел: S0 = 0, S1 = l, …, S255 = 255. Элементы гаммы генерируются затем с помощью итерационной процедуры, в которой начальное значение целочисленного счетчика i принимается равным нулю, а начальное значение j (0j255) – является секретным ключом:
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

 
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Anton Naumov, можно осмысленные имена переменных, отступы и комментарии перед каждым циклом с описанием идеи? Я вот это
Цитата Anton Naumov:
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 »
не понял для чего например...
Вообще считаю что можно было оставить одну функцию для кодирования-декодирования (т.к. оператор XOR обратим), тогда бы не было проблем с неправильным восстановлением.

Отправлено: 17:37, 03-01-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 11
Благодарности: 0

Профиль | Отправить PM | Цитировать


я нашел ошибку

Отправлено: 19:46, 03-01-2010 | #3


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить 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
'...
Операция Xor проводится с не инициализированной переменной G.
Должно быть (по аналогии с Private Sub CmdEncr_Click) так
G = S(t)
X = Asc_Renamed(b) Xor G


Ещё конечно остаются по оптимизации программы (не самого алгоритма, а именно программной части).

Отправлено: 06:45, 04-01-2010 | #4


Новый участник


Сообщения: 11
Благодарности: 0

Профиль | Отправить PM | Цитировать


именно такую ошибку я и нашел. спасибо

Отправлено: 12:48, 04-01-2010 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - программа шифрования алгоритм RC4

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Утилиты - программу для шифрования\дишифрования текста. 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




 
Переход