пятница, 21 октября 2011 г.

Шифрование публичным ключом.

В данном способе шифрования используются 2 ключа. Публичный ключ передается дешифрующей стороне, а приватный остается у того кто шифрует. Данные ключи к шифру таковы что сообщение зашифрованное пппубличным ключом однозначно расшифровывается с помощью приватного. При этом имея публичный ключ невозможно определить приватный. Таким образом при переписке я беру публичный ключ адресата, шифрую сообщение и посылаю ему. Он делает тоже самое. На практике приходится использовать еще систему подтверждения подлинности публичных ключей. Для этого нужна третья сторона, которой доверяют оба участника переписки.
При это переписка может призводится например следующим образом:
1) Разрешающая сторона выдает всем участникам свой публичный ключ.
2) Я скачиваю запрашиваю сертификат у разрешающей стороны посылая ей свой публичный ключ.
3) Разрешающая сторона изготавливает для меня сертификат следующим образом : делает хеш моего публичного ключа и шифрует его своим приватным ключом и присоединяет это к моему публичному ключу.
4) Мой адресат получает сертификат содержащий мой публичный ключ и его зашифрованный хеш. С помощью публичного ключа разрешающей стороны расшифровывает хеш, делает второй хеш из моего публичного ключа и сравнивает их. Если они совпадают, то оба ключа мои и все ок.
5) Теперь он может зашифровать свое сообщение моим публичным ключом и послать мне, зная что его смогу расшифровать я и никто другой.
Таким образом злоумышленник не знающий приватного ключа сервера не сможет выдать свой публичный ключ за мой.

среда, 7 сентября 2011 г.

Как в QTableView/QTableWidget нарисовать в клетке галочки?

Есть официальный способ. достаточно удобный. Все что Вам нужно - создать класс производный от QStyledItemDelegate переопределив там метод void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index). QPainter - стандартный объект для рисования, из option получаем палитру и прямоугольник рисования (можно будет вызвать painter->translate() чтобы туда перейти и отсчитывать координаты от границ данного прямоугольника при рисовании, в случае с таблицей так и надо сделать) а index - индекс модели (ряд, столбец таблицы) - Вам ведь не во всех клетках нужно галочки рисовать, для остальных просто вызовем метод базового класса.

пятница, 26 августа 2011 г.

Исключения в С++ : по ссылке, копией или по указателю?

Исключение в С++ можно бросить 2-мя способами:
  1. throw MyException();
  2. throw new MyException();
А поймать потом 3-мя:
  1. catch( MyException  ) {}
  2. catch( const MyException& ) {}
  3. catch( MyException* ){}
Ну конечно объект может быть константным а ссылка неконстантной. Ну ладно. Суть в том что 3-ий catch ловит 2-ой throw, а 1-ый и 2-ой ловят 1-ый throw. Из двух последних предпочтительней 2-ой вариант потому что он не делает копии. Ловить надо тоже самое что и бросал иначе не поймаешь. Вариант с броском указателя вызывает проблемы с освобождением памяти которое нужно или не нужно делать в блоке catch в зависимости от того указывает ли указатель на объект размещенный в куче с помощью вызова new или нет. Поэтому самый лучший вариант - ловить по ссылке.


понедельник, 15 августа 2011 г.

Виртуальные функции в Jаva и С++.

То есть конечно же в Java нет никаких виртуальных функций. Все функции (или если следовать ООП терминологии методы) в Java имеют позднее связывание если вы явно не укажите их как final или private. Это значит что вы просто переопределяете их производных классах и получаете тот же эффект который дают виртуальные функции C++. Тот же да не тот. Я пока знаю по крайней один случай при котором виртуальные функции С++ и обычные методы Java дают разный эффект. Это если вы будете вызывать функцию которая переопределена в производном классе в конструкторе или деструкторе базового класса. То есть конечно же делать этого не в коем случае не стоит, в обоих случаях Вас ждут неприятные сюрпризы. Так что же будет происходить? В Java тип объекта во время выполнения известен и будет вызываться метод производного класса при том что инициализация объекта производного класса еще не произведена. При обращении к полям-примитивам они будут иметь значения по умолчанию, а ссылки - null. Вобщем либо неправильное поведение, либо исключение. В С++ виртуальные функции работают как известно даже при отсутствии точной информации о  типе, потому что адреса виртуальных функций находятся  в специальной таблице указатель  на которую хранит в себе объект. При работе конструктора базового класса указатель таблицы виртуальных функций имеет значение свойственное базовому классу и виртуальная функция будет вести себя как будто она виртуальной не является.