Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   программа шифрования алгоритм RC4 (http://forum.oszone.net/showthread.php?t=162150)

Anton Naumov 02-01-2010 23:02 1309363

программа шифрования алгоритм RC4
 
Помогите найти ошибку. При нажатии на кнопку расшифровать расшифровывает цифры неправильно, получается бессмыслица, а должен быть текст. вот полное задание

Рассматривается симметричный криптографический алгоритм 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


pva 03-01-2010 17:37 1309826

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 обратим), тогда бы не было проблем с неправильным восстановлением.

Anton Naumov 03-01-2010 19:46 1309945

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

Admiral 04-01-2010 06:45 1310349

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


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

Anton Naumov 04-01-2010 12:48 1310467

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


Время: 23:47.

Время: 23:47.
© OSzone.net 2001-