Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Клиент-сервер, алгоритм диффи-хеллман 
:(
    Опции темы
lev93
Дата 16.1.2017, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 16.1.2017

Репутация: нет
Всего: нет



Функциональные возможности клиента реализовать следующим образом: клиент вводит с клавиатуры строку символов и посылает ее серверу. 
Функциональные возможности сервера реализовать следующим образом: сервер, получив эту строку, должен определить длину введенной строки, и, если эта длина кратна четырем, то первая часть строки меняется местами со второй. Результаты преобразований возвращаются назад клиенту.

сервер
Код

#include<stdio.h>
#include<iostream>
#include<winsock2.h>

#pragma comment(lib,"Ws2_32.lib")
using namespace std;

DWORD WINAPI ThreadFunc(LPVOID client_socket) {

    SOCKET s2 = ((SOCKET *)client_socket)[0];
    char buf[100];
    char buf1[100];
    while (recv(s2, buf, sizeof(buf), 0)) {
        int k, j = 0;
        k = strlen(buf);

        if (k % 4 == 0) {
            for (int i = k / 2; i < k; i++) {
                buf1[j] = buf[i];
                j++;
            }

            for (int i = 0; i < k / 2; i++) {
                buf1[j] = buf[i];
                j++;
            }

            buf1[k] = '\0';
            strcpy(buf, buf1);
        }
        cout << buf << endl;
        send(s2, buf, strlen(buf) + 1, 0);
    }
    closesocket(s2);
    return 0;
}
int numcl = 0;
void print() {
    if (numcl) printf("%d client connected\n", numcl);
    else printf("No clients connected\n");
}

void main() {
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    wVersionRequested = MAKEWORD(2, 2);
    err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0) { return; }
    SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
    sockaddr_in local_addr;
    local_addr.sin_family = AF_INET;
    local_addr.sin_port = htons(1280);
    local_addr.sin_addr.s_addr = 0;
    bind(s, (sockaddr *)&local_addr, sizeof(local_addr));
    int c = listen(s, 5);
    std::cout << "Server receive ready" << std::endl;
    std::cout << std::endl;
    // извлекаем сообщение из очереди
    SOCKET client_socket; // сокет для клиента
    sockaddr_in client_addr; // адрес клиента(заполняется системой)
    int client_addr_size = sizeof(client_addr);
    // цикл извлечения запросов на подключение из очереди
    while ((client_socket = accept(s, (sockaddr *)&client_addr, &client_addr_size))) {
        numcl++;
        print();
        // Вызов нового потока для обслуживания клиента
        CreateThread(NULL, NULL, ThreadFunc, &client_socket, NULL, NULL);
    }
}



клиент
Код

#include <winsock2.h>
#include <iostream>
#include <stdlib.h>
#pragma comment(lib,"Ws2_32.lib")
int main() {
    WORD wVersionRequested;
    WSADATA wsaData;
    wVersionRequested = MAKEWORD(2, 2);
    WSAStartup(wVersionRequested, &wsaData);
    struct sockaddr_in peer;
    peer.sin_family = AF_INET;
    peer.sin_port = htons(1280);
    // т.к. клиент и сервер на одном компьютере,
    // пишем адрес 127.0.0.1
    peer.sin_addr.s_addr = inet_addr("127.0.0.1");
    SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
    connect(s, (struct sockaddr*) &peer, sizeof(peer));
    char buf[255], b[255];
    std::cout << "Enter string." << std::endl;
    std::cin >> buf;
    std::cin.get();
    send(s, buf, strlen(buf) + 1, 0);
    if (recv(s, b, sizeof(b), 0) != 0) {
        std::cout << b << std::endl;
        std::cin.get();
    }
    shutdown(s, SD_SEND);
    WSACleanup();
    return 0;
}


Есть такая клиент-серверная программа. Мне необходимо переделать программу следующим образом. Клиент вводит с клавиатуры числовые значение p и q, числовые значения ключей K_a и K_b. Данные посылаются серверу.
Сервер в свою очередь вычисляется открытые ключи для первого пользователя и для второго пользователя и возвращает значения этих ключей назад клиенту.

алгоритм диффи-хеллмана выглядит следующим образом и нужно как реализовать в серверной части.
Код

#include<iostream>
using namespace std;
long int power(int a, int b, int mod)
{
    long long int t;
    if(b == 1)
        return a;
    t = power(a, b/2, mod);
    if(b % 2 == 0)
        return (t * t) % mod;
    else
        return (((t * t) % mod) * a) % mod;
}
int main()
{
    setlocale(LC_ALL, "rus");
    int p, q, K_a, K_b, a, b;    
    cout << "Введите значение p и q: " << endl; 
    cout << "p=";
    cin >> p;
    cout << "q=";
    cin >> q;    
    cout << endl;
    cout << "Введите значение K_a для первого лица: " << endl;
    cout << "K_a=";
    cin >> K_a;
    a = power(q, K_a, p);    
    cout << "Введите значение K_b для второго лица: " << endl; 
    cout << "K_b=";
    cin >> K_b;
    b = power(q, K_b, p);
    cout << endl;
    cout << "Ключ для первого лица: " << power(b, K_a, p) << endl;
    cout << "Ключ для второго лица: " << power(a, K_b, p) << endl;
    system("pause");
    return 0;
}
  

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0773 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.