Anton Naumov
02-01-2010, 23:02
Помогите найти ошибку. При нажатии на кнопку расшифровать расшифровывает цифры неправильно, получается бессмыслица, а должен быть текст. вот полное задание
Рассматривается симметричный криптографический алгоритм 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
Рассматривается симметричный криптографический алгоритм 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