Частина тексту файла (без зображень, графіків і формул):
Міністерство освіти і науки України
Національний університет «Львівська Політехніка»
Інститут комп’ютерних технологій автоматики та метрології
Кафедра Безпеки Інформаційних Технологій
Звіт
Про виконання лабораторної роботи № 3
“Криптографічні системи та протоколи”
Львів 2012
Мета роботи: Вивчити математичний апарат для опису афінних шифрів та розробити програмне забезпечення для реалізації афінних шифрів.
Теоретичні відомості
Афінний шифр k-го порядку.
Ключ: A(GLk(Zn) і S( Znk.
Шифрування. Повідомлення розбивається на k-грами. Кожна k-грама X заміщується k-грамою E(X)=AX+S.
Розшифрування. Кожна k-грама X' криптотексту заміщується k-грамою D(X’)=A’X’+S’, де A’=A-1 і S’=–A’S - розшифровуючий ключ.
Нехай потрібно зашифрувати повідомлення місто за допомогою ключа
i в Z33.
Частину операції зашифрування наведено вище. Після розбиття повідомлення на вектори-біграми і множення на них матриці А за модулем 33 було отримано . Додаємо до кожного стовпчика вектор S і отримуємо тобто криптотекст ияґхуч.
Знайдемо також розшифровуючий ключ. У попередньому прикладі було отримано матрицю . Обчислюємо .
Провівши розшифрування, одержимо
,
а саме повідомлення містоа.
ЗАВДАННЯ
1) Вивчити основні математичні залежності, які використовуються для опису шифрів зсуву, лінійного та афінного першого та вищих порядків.
2) Скласти блок-схеми алгоритмів та програму для реалізації зашифрування та розшифрування відкритого тексту за допомогою афінного шифру 3-го порядку.
Блок-схема:
Остаточна версія програми:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
if (jRadio1.isSelected() == true)
{
String inpt = this.inText.getText();
StringBuilder sb = new StringBuilder(inpt);
if (sb.length() != 0) {
while (!Character.isLetter(sb.charAt(0))) {
sb.deleteCharAt(0);
}
// continue text cleaning.
for (int i = 0; i < sb.length(); i++) {
if (!Character.isLetter(sb.charAt(i))
&& !Character.isWhitespace(sb.charAt(i))) {
sb.setCharAt(i, ' ');
}
}
for(int i = 0; i<sb.length(); i++){
if(Character.isWhitespace(sb.charAt(i))){
sb.deleteCharAt(i);
}
}
for(int i = 0; i<sb.length(); i++){
if(Character.isWhitespace(sb.charAt(i))){
sb.deleteCharAt(i);
}
}
}
for(;;){
if(sb.length()%3 != 0){
sb.append("а");
}
else break;
}
inpt = sb.toString();
int a[] = new int [9]; //ключ
String keyStr = this.jKey1.getText();
char keyCh [] = keyStr.toCharArray();
for(int i = 0; i<9; i++){
a[i] = (int)keyCh[i];
}
int s[] = new int [3];
String key2 = this.jKey2.getText();
char [] key2c = key2.toCharArray();
for(int i = 0; i<3; i++){
s[i] = (int)key2c[i];
}
char kchar[] = inpt.toCharArray();
int kn[] = new int [kchar.length];
int k[] = new int [kchar.length];
for (int i = 0; i<kchar.length; i++){
k[i] = kchar[i]-1071;
}
for (int i = 0; i<inpt.length(); i = i+3){
kn[i]=a[0]*k[i]+a[1]*k[i+1]+a[2]*k[i+2]+s[0];
kn[i+1]=a[3]*k[i]+a[4]*k[i+1]+a[5]*k[i+2]+s[1];
kn[i+2]=a[6]*k[i]+a[7]*k[i+1]+a[8]*k[i+2]+s[2];
int j;
for (j = 0;; j++){
if (kn[i] > 33){
kn[i] = kn[i]-33;
}
else break;
}
for (j = 0;; j++){
if (kn[i+1] > 33){
kn[i+1] = kn[i+1]-33;
}
else break;
}
for (j = 0;; j++){
if (kn[i+2] > 33){
kn[i+2] = kn[i+2]-33;
}
else break;
}
kn[i]=kn[i]+1071;
kn[i+1]=kn[i+1]+1071;
kn[i+2]=kn[i+2]+1071;
}
StringBuffer v = new StringBuffer();
for(int i=0; i<=kn.length-1; i++){
v.append((char)kn[i]);
}
String vv = v.toString();
this.outText.setText(vv);
}
}
Результати роботи програми:
Висновок: На даній лабораторній роботі я вивчив математичний апарат для опису афінних шифрів та розробив програмне забезпечення для реалізації афінних шифрів.