Неосозноваемая некомпетентность
Вижинер
HELLOWORLD
KEYKEYKEYK
Сдвигаем по ключу. Варианты ключа – количество_букв!. 26! для англ
Случайный ключ => считаем частоту букв, если похоже то делаем сумму квадратов
отклонений
Круче всего, если длинна ключа совпадает с длинной текста. (one time pad)
Задача криптографии – сделать такой шифр, чтоб частоты были примерно
равномерны.
2 Лекция №2
Kerckhoffs`s principle (норм)
A cryptosystem should be secure event if everything about the system, except the key, is
public knowledge.
transposition ciphers
Записываем зигзагом. Длинна зигзага – ключ
Число ПИ. Если узнаем позицию, то сможем все расшифровать. Предыдущие биты
могут быть расшифрованы основываясь на текущем состоянии
Nonce:
Не пароль
Никогда не повторяется
Это не тайна, в отличие от ключа
Если мало места под nonce (< 100 битов), то вероятность совпадения быстро растет
Поэтому надо сперва первый сгенерить случайно, а потом инкрементировать.
Если >=100 Битов, то юзаем CSPRNG
Модели атаки:
Атакующему извествен только шифро-текст (known chiphertext attack KCA)
Игра: B передает А два сообщения. А шифрует одно из сообщений и отправляет B.
B должен узнать какое из сообщений зашифровал A. Если вероятность того, что он
отгадал сообщение <= ½, то считается, что алгоритм защещен от KCA. Если > 1/2, то
алгоритм считается indistinguishable (можно отличить или нельзя отличить от
случайных даных)
Атака с известным открытым текстом (known plaintext attack)
вижинер вообще на изи ломается
choosen plaintext attack
не взломает сальсу.
choosen ciphertext attack
coming soon
ECB mode (Electronic codebook mode encryption) Режим, когда мы берем каждый блок и
шифруем его в шифро-блок. Книга, тк можно составить книгу, где на одной страницы
оригинальный текст, на второй зашифрованный.
CTR mode (counter mode encryption) – делаем из блочного шифра, потоковый. Юзаем
nonce, Инкрементим его.
CBC (cyber block chaining ) – херня. (Взлом ниже) – юзаем initialize vector – размером с
блок. Юзаем его как нонсе для первого блока, дальше юзаем результат из предыдущего
шифра. Трабла с тем, что шифровать/расшифровывать надо с начала.| Еще трабла, что если
поменять значение в конце предыдущего зашифрованого блока, так чтоб в конце
получилась еденица, то поломаем сообщение.
Трабла в том что если кто-то меняет зашифрованный текст, то все летит коту под хвост.
Надо убедится в том, что шифр-текст не был изменен
Криптографическую Хэш-функцию юзаем.
Правила:
h(a) == h(b) if a == b
if a != b, то h(a) скорее всего != h(b)
preimage resistance (из хэша нельзя получить оригинальные значения)
криптографическая хэш-функция не должна нам позволять находить другие
значения с таким же хэшем.
collision resseistance. Вероятность того что два хэша, двух разных сообщений
совпадут должна стремится к нулю.
Говно:
Costs:
cost of info
cost to hack
Cost to hack should be greater the cost of info
Теперь для взлома хэша надо взять от него хэш и искать совпадения с таблицей,
если не нашли, берем хэш от хэша и опять ищем и тд.
Соединяем слова
Еще пароль типа (текст)(дата_рождения)
Как решить:
увеличить время работы хэш функции – но нафиг так делать
KDF (Key Derivation Function) – из пароля получаем ключ для шифрования
например Argon2 (идеально), PBKDF2(не ахти, быстро перебирается), Scrypt, BCrypt
(юзать, если нет возможности юзать scrypt)
Argon2 – тут указывается количество памяти, которое надо юзать при хэшировании,
посему перебрать на видюхе уже не получится. (Он заполняет память кучей
данных, которые основываются друг на друге, а потом схлопывает все в небольшой
хэш)
SRNG:
Числа не должны зависить от предыдущих
Из текущего состояния нельзя получить следующее
Результат похож на шум
2FA
Отправляем код сгенереный CSPRNG
Штука с рандомом:
Если гегенрим число, и нам надо до 100, то не надо делать модуль(тк тогда
вероятности сбиваются), лучше вайлом.
Password storage:
Можно юзать:
argon2
SHA3 then Argon2. (SHA3 может считать сам клиент)
probably use SHA3- then-Argon2-then-AES-Poly1305
or user HMAC(pass+salt, key)
Не ограничивать длинну пароля
Не ограничивать символы
Ограничить частые пароли
Add version field to database – так можно менять способ шифрования
Add isCompromised field to database (взломанные юзеры помечаются)
Если взломан:
Enable forced 2FA – при повторном входе.
Disable changing of secret question/2FA settings
Rotate keys – менять ключи
Попросить юзера поменять пароль при следующем входе
Самый простой:
{0, +}
{[0, 1], xor} это не точно)
поворот равностороннего треугольника
{Z, +}
Елептические кривые:
y^2 = x^3 + ax +b
Повороты 24-угольника:
0-12
Z7: 3 – генерирующий
Z10: 3 - генерирующий
Z6: [5, 1]
Взаємно прості числа — натуральні або цілі числа, які не мають спільних дільників
більших за 1
Все числа для множества Z10 являются взаимно простыми
n = pq
n – (q – 1) – (p - 1) |
pq – (q – 1) – (p - 1) | это не точно)
(p – 1) * (q – 1) – колчиество чисел, которые взаимно простые с n и меньше чем n
Это функция ейлера обозночается как фи: |Zn| = fi(n)
g^|Zn| = 1 g^fi(n) = 1
g^(|Zn| + 1) = g
Таким образом у хакера есть (g^b)^a1 и (g^a)^b1 и можем менять сообщения как хотим
Решаем RSA
Алгоритм RSA
Алгоритм, чтоб зашифровать надо один ключ(private), а расшифровать другой
ключ(public).
p^(fi(n) +1) = p
p^(K1 mod(n)) = c
c^(K2 mod(n)) = p
тк p^(K1*K2) = p (mod n)
n = pq
fi(n) = (p-1)(q-1)
Зная число n, но не зная p, q: очень сложно найти fi(n). Там експоненциальное время
malleability
Можем подбросить случайное число и RSA расшифрует.
Еще трабла:
Стоит сервак, который расшифровывает RSA, и не возвращает определенные
расшифровки.
Это можно обойти домножив на cipher_number*r^public_key,
тогда сервак вернет plain_number*r mod n. Делим на r и получаем расшифровку
Решаем MAC
Еще трабла:
pq = n.
Если p приблезительно равно q, тогда есть простой алгоритм, который найдет p и q.
Еще трабла:
Две разные пары сделали,
p*q=n
p * q’ = n’
У них общие делители, поэтому поиск НайбільшогоСпільногоДільника(GCD) n и n’ изи
найдет.
RSA-OAEP – юзать
Тайминг атаки.
Чем юольше едениц в приватном ключе, тем больше времени занимает расшифровка,
так можно померять время и найти приватный ключ.
vs RSA:
DSA (тоже цифровые подписи, и каждый раз разные), то есть зависит от рандомного
параметра К
ECDSA – это как DSA только работает с елептической кривой, тоже зависит от К
EdDSA – специальная елептическая кривая (кривая Эдварда)
Ed25519 – кривая 25519, она работает быстрее и не придумана интститутом стандартов
США). – годно
Curve25519 ECDH – та же схема ECDH но на кривой. Это можно юзать, если захотите
юзать DH.
Не знаем подлинность.
Для подлинности используется третье лицо, которое подписывает сертификат.
Записи:
Входные транзакции
Выходные транзакции
Цифровая подпись
Трабла, что можно сделать две разные записи и распространить два разных списка.
Чтоб решить где валидный юзаем - Proof of work.
Если сгенерили два одинаковых валидных блока, то часть людей имеет одну версию ветки,
часть – другую версию ветки. Валидной веткой считается та что длиннее.
Можно в данные записать код, а потом в адрес возврата написать адрес своих данных.
printf(string):
опасно, тк это параметр формата, и там можно все что угодно будет вытащить
%n – запись по указателю)
Как противостоять:
Stack protector, stack canary, stack cookie – в стек между переменными и
адресным пространством записывает дополнительные значения и перед возратом
из функции делается проверка этого значения.
DEP (data execution prevention), NX-flag, non-executable pages
ASLR - Address space layout randomization – случайные адреса делает, поэтому не
знаем куда записать что-то
10 Лекция 10 (TLS 1/2)
Confidentiality
Integrity
Availability – доступность данных, когда они нам нужны
SSL/TLS
TLS v1.3 – нормуль
SSL (Secure Socket Layers) – думали сделать промежуточным слоем в моделе OSI.
Клиент говорит – я поддерживаю вот такие алгоритмы шифрования
Сервер выбирает какой использовать.
Сервер шлет сертификаты клиенту, чтоб клиент смог подтвердить, что это именно
тот сервак.
Дальше обмен ECDH
Главная фишка – в выборе алгоритма.
TLS_NULL – поддержка без подписей. Эту херню надо вычеркивать. Эту штуку может
указать хакер.
BEAST
CBC уязвимость
Когда используем initialize vector из прошлой сессии.
Если пересылаем так пароль типа «super_password=<password>»
Можем разбить на блоки чтоб отгадывать по одной букве.
Heartbleed
Уязвимость, которая позволяла получить приватные ключи с сервака.
Клиент отправлял серваку сообщение “hello” 5, тип длинна сообщения 5.
Сервер отправлял сообщение в обратку. Ну и приватные ключи в памяти лежат.
HSIS
HPKP (coming coon)
HSTS (http strict transport security) – способ сказать, что сервер доступен только по
HTTPS.
http: 80;
https: 8080;
TLS: 443
Можно защитить
1. encrypted SNI (still in draft)
Запрашивает ESNI у DNS, если он его поддерживает – это публичный ключ для
шифрования, получает g^a, формирует g^b, и отправляет на сервак
2. DoH (DNS over HTTPS) / DoT (DNS over TLS)
Clodflare, microsoft, google – предоставляют шифрования DNS
3. DNSSEC
VPN
PPTP – старая версия
L2TP
OpenVPN
IKEv2 – протокол обмена ключами, который используется вместе с IPsec
IPsec – поддерживается большинством ОС
Обворачиваем наши запросы. В случае с openVPN наша инфа кладется в TLS поток
Шифрование IPsec:
AH – поддерживает только аутификацию, без шифрования
ESP – шифрования всего пакета, как TLS