Передача аутентичного информационного сообщения по каналу связи

Автор работы: Пользователь скрыл имя, 06 Марта 2013 в 23:26, курсовая работа

Описание работы

Протокол - это порядок действий, предпринимаемых двумя или более сторонами, предназначенный для решения определенной задачи. Это важное определение. "Порядок действий" означает, протокол выполняется в определенной последовательности, с начала до конца. Каждое действие должно выполняться в свою очередь и только после окончания предыдущего. "Предпринимаемых двумя или более сторонами" означает, что для реализации протокола требуется по крайней мере два человека, один человек не сможет реализовать протокол.

Содержание работы

Введение…………………………………………………………………………………………….4

1. Передача информации с использованием криптографии с открытыми ключами...………..5
1.1. Основные требования к алгоритмам асимметричного шифрования……………………6
1.2. Криптоанализ алгоритмов с открытым ключом………………………………………….8
1.3. Основные способы использования алгоритмов с открытым ключом…………………..9
1.4. Схема идентификации FIAT-SHAMIR.……………………………………………….....11

2. Электронная цифровая подпись………………………………………………………………15
2.1. Общая схема цифровой подписи…………………………………………………………15
2.2. Алгоритм цифровой подписи ГОСТ……………………………………………………..16

3. Контроль целостности передаваемых сообщений ГОСТ……………………………..……17
3.1. Общая концепция алгоритма ………………………………………………………….…17
3.2. Режим выработки имитоприставки………………………………………………………21

4. Разработка протокола установления связи с абонентом…………………………………….23
4.1. Протокол установления связи с абонентом……………………………………………..23
4.2. Программная реализация протокола……………………………………………………..25

Заключение……...………………………………………………………………………….………31

Приложение………………………………………………………………………………………..32

Список использованной литературы………………………………………………………..……33

Файлы: 1 файл

Методы и средства защиты информации.doc

— 803.50 Кб (Скачать файл)

Криптоанализ  ГОСТ

Вот главные различия между DES и COST.

—  DES использует сложную процедуру для генерации подключей из ключей. В ГОСТ эта процедура очень проста.

—  В DES 56-битовый ключ, а в ГОСТ - 256-битовый. Если добавить секретные перестановки S-блоков, то полный объем секретной информации ГОСТ составит примерно 610 битов.

—  У S-блоков DES 6-битовые входы и 4-битовые выходы, а у S-блоков ГОСТ 4-битовые входы и выходы. В обоих алгоритмах используется по восемь S-блоков, но размер S-блока ГОСТ равен одной четвертой размера S-блока DES.

—  В DES используются нерегулярные перестановки, названные Р-блоком, а в ГОСТ используется 11-битовый циклический сдвиг влево.

—  В DES 16 этапов, а в ГОСТ - 32.

Табл. 3.2. S-блоки ГОСТ

S-блок 1:

4     10   9    2    13   8    0    14   6    11   1    12   7    15   5    3

S-блок 2:

14   11   4    12   6    13   15   10   2    3    8    1    0   7    5    9

S-блок З:


5    8    1    13   10   3    4   2    14   15   12   7    6    0   9    11

S-блок 4:

7    13   10   1    0    8    9    15   14   4    6    12   11   2    5    3

S-блок 5:

6     12   7    1    5    15   13   8   4    10   9    14   0    3    11   2

S-блок 6:

4     11   10   0  7    2     1 13  3    6  8      5   9   12  15   14

S-блок 7:

13    11   4    1    3   15     5    9   0   10   14     7   6    8   2    12

S-блок 8:

1    15   13   0    5   7     10  4   9    2     3    14   6    11  8    12

Если лучшим способом вскрытия ГОСТ является грубая сила, то это очень безопасный алгоритм. ГОСТ использует 256-битовый ключ, а если учитывать секретные S-блоки, то длина ключа возрастает. ГОСТ, по видимому, более устойчив к дифференциальному и линейному криптоанализу, чем DES. Хотя случайные S-блоки ГОСТ возможно слабее фиксированных S-блоков DES, их секретность увеличивает устойчивость ГОСТ к дифференциальному и линейному криптоанализу. К тому же, эти способы вскрытия чувствительны к количеству этапов - чем больше этапов, тем труднее вскрытие. ГОСТ использует в два раза больше этапов, чем DES, одно это возможно делает несостоятельными и дифференциальный, и линейный криптоанализ.

Другие части ГОСТ такие же, как в DES, или слабее. ГОСТ не использует существующую в DES перестановку с расширением. Удаление этой перестановки из DES ослабляет его из-за уменьшения лавинного эффекта, разумно считать, что отсутствие такой операции в ГОСТ ослабляет этот алгоритм. Сложение, используемое в ГОСТ, не менее безопасно, чем используемая в DES операция XOR.

Самым большим различием представляется использование в ГОСТ циклического сдвига вместо перестановки. Перестановка DES увеличивает лавинный эффект. В ГОСТ изменение одного входного бита влияет на один S-блок одного этапа, который затем влияет на два S-блока следующего этапа, три блока следующего этапа, и т.д.. В ГОСТ потребуется 8 этапов прежде, чем изменение одного входного бита повлияет на каждый бит результата, алгоритму DES для этого нужно только 5 этапов. Это, конечно же, слабое место. Но не забывайте: ГОСТ состоит из 32 этапов, a DES только из 16.

Разработчики ГОСТ пытались достигнуть равновесия между безопасностью  и эффективностью. Они изменили идеологию DES так, чтобы создать алгоритм, который больше подходит для программной реализации. Они, по-видимому, менее уверены в безопасности своего алгоритма и попытались скомпенсировать это очень большой длиной ключа, сохранением в секрете S-блоков и удвоением количества итераций. Вопрос, увенчались ли их усилия созданием более безопасного, чем DES, алгоритма, остается открытым.


В качестве раундового шифрования расписывается схема алгоритма основного шага криптопреобразования.


 


Рис. 3.2 Схема алгоритма  основного шага криптопреобразования.

 

 

 

3.2. Режим выработки имитоприставки

Для обеспечения целостности  передачи данных используется дополнительный режим шифрования 16-З. Он позволяет  приемной стороне проконтролировать  полученный шифротекст на предмет целостности. Целостность включает в себя контроль на предмет добавлений и выпадений битов, искажения, подмену части или всего сообщения. При выработке имитоприставки используется секретный ключ, поэтому противник не может сымитировать имитоприставку. Считается, что криптостойкость не должна превышать криптостойкости самого сообщения. В результате этого ограничиваются шестнадцатью раундами шифрования ГОСТ.

(I) используется следующим образом:

К полученным блокам шифровки Сi, i= добавляется имитоприставка I;

На приемной стороне  производится расшифровка Сi;

Вычисляется новая имитоприставка   и сравнивается с I;

Если они совпадают, делается вывод, что целостность  не нарушена, если нет – принятое Сi отбрасывается, делается повторный прием шифровки;

Объем имитоприставки: старшие 32 разряда отбрасываются.

Получение имитоприставки производится  в специальном режиме 16-З, который отличается лишь количеством  раундов.

Рис. 3.3 Схема алгоритма получения имитоприставки.

 

Первый блок шифруется, результат добавляется ко второму блоку,  результат которого шифруется, добавляется к третьему блоку и т.д. В конце получается 64-х разрядный блок. В нём отсекают N разрядов. Обычно N=32.



 

Рис. 3.4 Функция зашифрования Ek в режиме выработки имитоприставки (16-З)

 

4. Разработка протокола установления связи с абонентом

 

4.1. Протокол установления связи с абонентом

 

Алгоритм протокола:

 

1. С помощью алгоритма Фиата-Шамира производим идентификацию пользователей. После успешной аккредитации передаем ключ для алгоритма ГОСТ, зашифровав его предварительно закрытым ключом абонента A.

2. Шифруем сообщение алгоритмом ГОСТ. Предварительно подписываем сообщение цифровой подписью по алгоритму ГОСТ, используя закрытый ключ отправителя; при этом в алгоритме происходит вычисление имитоприставки сообщения;

4. На стороне получателя принимаем сообщение и получаем имитоприставку, сравнивая её с прикрепленной к шифротексту удостоверяемся в целостности сообщения; проверяем цифровую подпись сообщения.

5. Если цифровая подпись соответствует сообщению, значит, сообщение было передано без

изменений, в этом случае дешифруем сообщение ключом, полученным на первом шаге.

 

 

 

 

Блок-схема алгоритма



 

 



 


 




нет да


 


                                -       +


 

 

 



 


 


 




 


 

 


 

 

4.2. Программная реализация протокола

 

Программа написана на Visual C++ .

 

// FS_GOST_GOSTDlg.cpp : implementation file

//

 

#include "stdafx.h"

#include "FS_GOST_GOST.h"

#include "FS_GOST_GOSTDlg.h"

#include "Algorithm.h"

#include "utils.h"

#include "gost.h"

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

 

// CAboutDlg dialog used for App About

 

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

 

// Dialog Data

enum { IDD = IDD_ABOUTBOX };

 

protected:

virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

 

// Implementation

protected:

DECLARE_MESSAGE_MAP()

};

 

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

}

 

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

}

 

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

END_MESSAGE_MAP()

 

 

// CFS_GOST_GOSTDlg dialog

 

 

 

 

CFS_GOST_GOSTDlg::CFS_GOST_GOSTDlg(CWnd* pParent /*=NULL*/)

: CDialog(CFS_GOST_GOSTDlg::IDD, pParent)

    , m_pass1(_T(""))

    , m_msg1(_T(""))

    , m_pass2(_T(""))

    , m_msg2(_T(""))

{

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

 

void CFS_GOST_GOSTDlg::DoDataExchange(CDataExchange* pDX)

{

    CDialog::DoDataExchange(pDX);

    DDX_Text(pDX, IDC_EDITPASS1, m_pass1);

    DDX_Text(pDX, IDC_EDITMSG1, m_msg1);

    DDX_Text(pDX, IDC_EDITPASS2, m_pass2);

    DDX_Text(pDX, IDC_EDITMSG2, m_msg2);

    DDX_Control(pDX, IDC_LIST1, m_editLog);

}


 

BEGIN_MESSAGE_MAP(CFS_GOST_GOSTDlg, CDialog)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

//}}AFX_MSG_MAP

    ON_EN_CHANGE(IDC_EDITMSG2, &CFS_GOST_GOSTDlg::OnEnChangeEditmsg2)

    ON_BN_CLICKED(IDC_BTNEXIT, &CFS_GOST_GOSTDlg::OnBnClickedBtnexit)

    ON_BN_CLICKED(IDC_BTNABOUT, &CFS_GOST_GOSTDlg::OnBnClickedBtnabout)

    ON_BN_CLICKED(IDC_BTNSEND1, &CFS_GOST_GOSTDlg::OnBnClickedBtnsend1)

    ON_WM_CHAR()

    ON_WM_KEYDOWN()

    ON_BN_CLICKED(IDC_BTNSEND2, &CFS_GOST_GOSTDlg::OnBnClickedBtnsend2)

END_MESSAGE_MAP()

 

 

// CFS_GOST_GOSTDlg message handlers

 

BOOL CFS_GOST_GOSTDlg::OnInitDialog()

{

CDialog::OnInitDialog();

 

// Add "About..." menu item to system menu.

 

// IDM_ABOUTBOX must be in the system command range.

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

 

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

 

// Set the icon for this dialog.  The framework does this automatically

//  when the application's main window is not a dialog

SetIcon(m_hIcon, TRUE);   // Set big icon

SetIcon(m_hIcon, FALSE);  // Set small icon

 

// TODO: Add extra initialization here

    mainDlg = this;

    initAlgorithm();

    initGost();

 

return TRUE;  // return TRUE  unless you set the focus to a control

}

 

void CFS_GOST_GOSTDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{


CDialog::OnSysCommand(nID, lParam);

}

}

 

// If you add a minimize button to your dialog, you will need the code below

//  to draw the icon.  For MFC applications using the document/view model,

//  this is automatically done for you by the framework.

 

void CFS_GOST_GOSTDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // device context for painting

 

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

 

// Center icon in client rectangle

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() - cxIcon + 1) / 2;

int y = (rect.Height() - cyIcon + 1) / 2;

 

// Draw the icon

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialog::OnPaint();

}

}

 

// The system calls this function to obtain the cursor to display while the user drags

//  the minimized window.

HCURSOR CFS_GOST_GOSTDlg::OnQueryDragIcon()

{

return static_cast<HCURSOR>(m_hIcon);

}

 

 

void CFS_GOST_GOSTDlg::OnEnChangeEdit1()

{

    // TODO:  If this is a RICHEDIT control, the control will not

    // send this notification unless you override the CDialog::OnInitDialog()

    // function and call CRichEditCtrl().SetEventMask()

    // with the ENM_CHANGE flag ORed into the mask.

 

    // TODO:  Add your control notification handler code here

}

 

CFS_GOST_GOSTDlg *mainDlg;

 

void CFS_GOST_GOSTDlg::OnEnChangeEditmsg2()

{

    // TODO:  If this is a RICHEDIT control, the control will not

    // send this notification unless you override the CDialog::OnInitDialog()

    // function and call CRichEditCtrl().SetEventMask()

   

// with the ENM_CHANGE flag ORed into the mask.

 

    // TODO:  Add your control notification handler code here

}

 

void CFS_GOST_GOSTDlg::OnBnClickedBtnexit()

{

    DestroyWindow();


}

 

void CFS_GOST_GOSTDlg::OnBnClickedBtnabout()

{

    CAboutDlg().DoModal();

}

 

void CFS_GOST_GOSTDlg::OnBnClickedBtnsend1()

{

    UpdateData();

    wchar_t from[8096], to[8096];

    if (fiatShamir(0) )

        outStr(L"Fiat-Shamir okay");

    else

        outStr(L"Fiat-Shamir check failed!");

    gostSetKey(m_pass1.GetBuffer() );

    wcscpy(from, m_msg1.GetBuffer(8096) );

    uint32 hash[4], hash1[4];

    hashSum(from, hash);

    outArray(L"Source hash sum: ", hash, 4);

    int len = wcslen(from);

    gostEncode(from, to, len);

    gostSetKey(m_pass2.GetBuffer() );

    gostDecode(to, from, len);

    from[len] = L'\0';

    hashSum(from, hash1);

    outArray(L"Decoded hash sum: ", hash1, 4);

    if (compareHash(hash, hash1) )

        outStr(L"Hash sum okay");

    else

        outStr(L"Hash sum check failed!");

    m_msg2.SetString(from, len);

    UpdateData(FALSE);

}

 

void CFS_GOST_GOSTDlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

    CDialog::OnChar(nChar, nRepCnt, nFlags);

}

 

void CFS_GOST_GOSTDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)

{

    // TODO: Add your message handler code here and/or call default

 

    CDialog::OnKeyDown(nChar, nRepCnt, nFlags);

}

 

void CFS_GOST_GOSTDlg::OnBnClickedBtnsend2()

{

    UpdateData();

    wchar_t from[8096], to[8096];

    if (fiatShamir(1) )

        outStr(L"Fiat-Shamir okay");

    else

        outStr(L"Fiat-Shamir check failed!");

    gostSetKey(m_pass2.GetBuffer() );

    wcscpy(from, m_msg2.GetBuffer(8096) );

   

uint32 hash[4], hash1[4];

    hashSum(from, hash);

    outArray(L"Source hash sum: ", hash, 4);

    int len = wcslen(from);

    gostEncode(from, to, len);

    gostSetKey(m_pass1.GetBuffer() );

    gostDecode(to, from, len);

    from[len] = L'\0';

    hashSum(from, hash1);

    outArray(L"Decoded hash sum: ", hash1, 4);

    if (compareHash(hash, hash1) )

        outStr(L"Hash sum okay");

    else

        outStr(L"Hash sum check failed!");

    m_msg1.SetString(from, len);

    UpdateData(FALSE);

}

#include "stdafx.h"

#include "math.h"

#include "string.h"

#include "Algorithm.h"

 

uint32 p, q, n;

uint32 ss[2][k]; /* секретные  ключи */

uint32 vv[2][k]; /* открытые ключи  */

 

void randomize()

{

    srand( (unsigned int)time(NULL) );

}

 

uint32 random(uint32 limit)

{

    return rand() % limit;

}

 

bool isPrime(uint32 a)

{

    for (uint32 d=2; d<(uint32)sqrt( (double)a); d++)

        if (a % d == 0)

            return false;

    return true;

}


 

uint32 findPrime()

{

    while (true) {

        uint32 r = random(0x100) + 2;

        if (isPrime(r) )

            return r;

    }

}

 

void outStr(wchar_t *s)

{

    int index = mainDlg->m_editLog.GetCount();

    mainDlg->m_editLog.InsertString(index, s);

}

 

void outNum(wchar_t *what, uint32 n)

{

    wchar_t buf[1024], bufN[32];

    _itow(n, bufN, 10);

    wcscpy(buf, what);

    wcscat(buf, bufN);

   

outStr(buf);

}

 

void outArray(wchar_t *what, uint32 *a, int n)

{

    wchar_t buf[1024], bufN[32], space[] = L" ";

    wcscpy(buf, what);

    for (int i=0; i<n; i++) {

        _itow(a[i], bufN, 10);

        wcscat(buf, bufN);

        wcscat(buf, space);

    }

    outStr(buf);

}

Информация о работе Передача аутентичного информационного сообщения по каналу связи