Java for Beginner
675 subscribers
558 photos
156 videos
12 files
851 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Основы криптографии

Хэш-функции (SHA-256, MD5)

Хэш-функция — это алгоритм, который принимает произвольные данные и генерирует фиксированную строку (хэш).

Основные свойства хэша:
Детерминированность – одно и то же входное значение всегда даёт одинаковый результат.
Скорость – быстрый расчёт хэша.
Устойчивость к коллизиям – два разных входных значения не должны давать одинаковый хэш.


MD5 – устаревший алгоритм
Разработан в 1991 году Рональдом Ривестом.
Размер хэша: 128 бит (32 символа в шестнадцатеричном формате).
Уязвим для атак на коллизии – можно подобрать два разных входных значения с одинаковым хэшем.
Используется только для контрольных сумм (например, проверки целостности файлов).


Как работает MD5 под капотом?

Разделяет сообщение на блоки по 512 бит.
Добавляет бит 1 в конец данных, затем дополняет нулями до 448 бит.
Добавляет 64-битное представление длины исходного сообщения.
Применяет 4 раунда нелинейных преобразований (циклические сдвиги, XOR, сложение по модулю 2³²).
Получает 128-битный хэш.


Пример MD5 в Java
import java.security.MessageDigest;

public class MD5Example {
public static void main(String[] args) throws Exception {
String input = "Hello, world!";
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hash = md.digest(input.getBytes());

StringBuilder hexString = new StringBuilder();
for (byte b : hash) {
hexString.append(String.format("%02x", b));
}
System.out.println("MD5 Hash: " + hexString.toString());
}
}


SHA-256
Разработан NSA в 1993 году как часть SHA-2.
Размер хэша: 256 бит (64 символа в шестнадцатеричном формате).
Безопасен на 2025 год, поскольку коллизии не найдены.
Используется в блокчейне, цифровых подписях, аутентификации пользователей.


Как работает SHA-256 под капотом?

Разбивает данные на 512-битные блоки.
Добавляет padding, как в MD5.
Инициализирует 8 переменных (A–H) с фиксированными значениями.
Выполняет 64 раунда преобразований, используя битовые сдвиги, XOR и сложение по модулю 2³².
Возвращает 256-битный (32-байтовый) хэш.


Пример SHA-256 в Java
import java.security.MessageDigest;

public class SHA256Example {
public static void main(String[] args) throws Exception {
String input = "Hello, world!";
MessageDigest sha = MessageDigest.getInstance("SHA-256");
byte[] hash = sha.digest(input.getBytes());

StringBuilder hexString = new StringBuilder();
for (byte b : hash) {
hexString.append(String.format("%02x", b));
}
System.out.println("SHA-256 Hash: " + hexString.toString());
}
}


Цифровые подписи

Цифровая подпись – это криптографическая технология, обеспечивающая:
Аутентификацию – доказывает, что данные создал именно этот отправитель.
Целостность – если данные изменятся, подпись станет недействительной.
Неотрекаемость – автор не может отрицать, что подписал документ.


Как работает цифровая подпись?

Отправитель хэширует данные (обычно SHA-256).
Этот хэш шифруется приватным ключом (RSA/ECDSA).
Подпись отправляется вместе с оригинальными данными.
Получатель проверяет подпись с помощью публичного ключа.


Пример цифровой подписи (RSA) в Java

import java.security.*;

public class DigitalSignatureExample {
public static void main(String[] args) throws Exception {
// Генерация ключей
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
KeyPair pair = keyGen.generateKeyPair();

Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(pair.getPrivate());

String data = "Important message";
signature.update(data.getBytes());
byte[] signedData = signature.sign();

// Проверка подписи
signature.initVerify(pair.getPublic());
signature.update(data.getBytes());
boolean isValid = signature.verify(signedData);

System.out.println("Подпись действительна? " + isValid);
}
}


#Java #Training #Medium #Crypto #Hash #MD5 #SHA_256