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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Вопросы с собеседования 👩‍💻

Какой тип коллекции хранит уникальные элементы?
Anonymous Quiz
11%
List
13%
Map
73%
Set
2%
Queue
Основы криптографии в Java

Симметричная криптография: алгоритм AES (Advanced Encryption Standard)

AES — это блочный шифр, который обрабатывает данные блоками по 128 бит. Он поддерживает ключи длиной 128, 192 или 256 бит.

Этапы шифрования AES

1. Key Expansion (Генерация раундовых ключей)
Перед началом шифрования AES генерирует набор раундовых ключей на основе исходного ключа. Это делается с помощью алгоритма Rijndael Key Schedule.

Раундовый ключ (AddRoundKey):
Это ключ, который используется в каждом раунде шифрования.
Каждый раундовый ключ — это 128 бит (16 байт), как и блок данных.
Раундовые ключи генерируются путем применения нелинейных преобразований и сдвигов к исходному ключу.
Использование разных ключей для каждого раунда повышает безопасность шифрования.
Если злоумышленник узнает один из раундовых ключей, это не поможет ему восстановить исходный ключ.


2. Initial Round (Начальный раунд)
Начальный раунд состоит из одного этапа: AddRoundKey.

AddRoundKey:
Каждый байт данных XORится с соответствующим байтом раундового ключа.
XOR (исключающее ИЛИ) — это битовая операция, которая возвращает 1, если биты разные, и 0, если биты одинаковые.
Пример: 1010 XOR 1100 = 0110.
Результат этой операции — это первый шаг к "запутыванию" данных.


3. Main Rounds (Основные раунды)
Каждый основной раунд состоит из четырех этапов: SubBytes, ShiftRows, MixColumns и AddRoundKey.

Количество раундов зависит от длины ключа:
10 раундов для 128-битного ключа.
12 раундов для 192-битного ключа.
14 раундов для 256-битного ключа.


SubBytes (Замена байтов)
Каждый байт данных заменяется с использованием S-блока (таблицы замен).
S-блок — это предопределенная таблица, которая заменяет каждый байт на другой байт по определенному правилу.
Например, байт 0x53 может быть заменен на 0xED.
S-блок добавляет нелинейность, что делает шифрование более устойчивым к криптоанализу.


ShiftRows (Перестановка строк)
Блок данных представляется как матрица 4x4 (16 байт).
Каждая строка матрицы сдвигается влево на определенное количество байт:
Первая строка не сдвигается.
Вторая строка сдвигается на 1 байт.
Третья строка сдвигается на 2 байта.
Четвертая строка сдвигается на 3 байта.
Перестановка строк "перемешивает" данные, что повышает сложность шифрования.


MixColumns (Линейное преобразование столбцов)
Каждый столбец матрицы 4x4 обрабатывается с помощью линейного преобразования.
Это преобразование представляет собой умножение столбца на фиксированную матрицу в поле Галуа GF(2^8).
MixColumns добавляет диффузию, что означает, что изменение одного байта влияет на несколько байтов в блоке.


AddRoundKey (Добавление раундового ключа)
На этом этапе каждый байт данных снова XORится с соответствующим байтом раундового ключа.
Это завершает раунд и подготавливает данные для следующего раунда.


4. Final Round (Финальный раунд)
Финальный раунд похож на основные раунды, но в нем пропускается этап MixColumns. Это сделано для упрощения дешифрования.

Этапы финального раунда:
SubBytes.
ShiftRows.
AddRoundKey
.

#Java #Training #Medium #Crypto #Symmetrical
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Основы криптографии в Java

Асимметричная криптография


В асимметричной криптографии используются два ключа: публичный (для шифрования) и приватный (для дешифрования). Это решает проблему обмена ключами, но работает медленнее, чем симметричная криптография.

Основные алгоритмы:

RSA (Rivest-Shamir-Adleman):
Основан на сложности факторизации больших чисел.
Использует ключи длиной 1024, 2048 или 4096 бит.


Плюсы: безопасный обмен ключами.
Минусы: низкая скорость, ограниченный размер данных для шифрования.

ECC (Elliptic Curve Cryptography):
Использует математику эллиптических кривых для создания более коротких ключей при той же стойкости, что и RSA.

Плюсы: высокая эффективность, меньший размер ключей.
Минусы: сложность реализации.

Пример шифрования с использованием RSA в Java:

import javax.crypto.Cipher;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.util.Base64;

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

// Шифрование
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
String plainText = "Hello, World!";
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);
System.out.println("Encrypted: " + encryptedText);

// Дешифрование
cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
String decryptedText = new String(decryptedBytes);
System.out.println("Decrypted: " + decryptedText);
}
}


Основные понятия

Шифрование и дешифрование:
Шифрование — процесс преобразования открытого текста в зашифрованный.
Дешифрование — обратный процесс, преобразование зашифрованного текста в открытый.


Ключи:
Публичный ключ: Используется для шифрования, может быть передан кому угодно.
Приватный ключ: Используется для дешифрования, должен храниться в секрете.


Безопасность

Уязвимости:
Слабые ключи: Короткие или предсказуемые ключи могут быть взломаны методом перебора.
Атаки на реализацию: Например, атака по времени (timing attack) на RSA.
Социальная инженерия: Кража ключей через фишинг или другие методы.


#Java #Training #Medium #Crypto #Asymmetrical
Что выведет код в консоль?


import java.io.FileWriter;
import java.io.IOException;

public class Task200225 {
public static void main(String[] args) {
try (FileWriter writer = new FileWriter("output.txt")) {
writer.write("Hello");
writer.flush();
writer.write(" World");
} catch (IOException e) {
e.printStackTrace();
}
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
10%
Hello
39%
Hello World
16%
World
35%
Ничего
Я себе все это по другому представлял 😱 😁

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
Основы криптографии в Java: Асимметричная криптография

Асимметричная криптография, также известная как криптография с открытым ключом, использует два ключа: публичный ключ (для шифрования) и приватный ключ (для дешифрования). Это решает проблему обмена ключами, которая существует в симметричной криптографии, но работает медленнее.

Алгоритмы асимметричной криптографии

1. RSA (Rivest-Shamir-Adleman)
RSA — это один из самых популярных алгоритмов асимметричной криптографии. Он основан на сложности факторизации больших чисел.

Особенности:
Использует ключи длиной 1024, 2048 или 4096 бит.
Шифрование и дешифрование выполняются с помощью операций возведения в степень по модулю.

Публичный ключ: (e,n), приватный ключ: (d,n) где n=p×q (произведение двух больших простых чисел).

Плюсы:
Безопасный обмен ключами.
Широкое применение в SSL/TLS, цифровых подписях.


Минусы:
Низкая скорость по сравнению с симметричной криптографией.
Ограниченный размер данных для шифрования (обычно меньше размера ключа).


2. ECC (Elliptic Curve Cryptography)
ECC использует математику эллиптических кривых для создания более коротких ключей при той же стойкости, что и RSA.

Особенности:
Использует ключи длиной 256, 384 или 521 бит.
Основан на сложности задачи дискретного логарифмирования на эллиптических кривых.
Публичный ключ: точка на кривой Q=d×G, приватный ключ: число d.


Плюсы:
Высокая эффективность, меньший размер ключей.
Подходит для устройств с ограниченными ресурсами (например, IoT).

Минусы:
Сложность реализации.
Меньшая распространенность по сравнению с RSA.


Этапы работы RSA

Генерация ключей:
Выбираются два больших простых числа p и q.
Вычисляется n=p×q (модуль).
Вычисляется функция Эйлера ϕ(n)=(p−1)(q−1).
Выбирается число e (публичная экспонента), такое что 1<e<ϕ(n) и НОД(e,ϕ(n))=1.
Вычисляется число d (приватная экспонента), такое что d×e≡1(mod ϕ(n)).
Публичный ключ: (e,n), приватный ключ: (d,n).


Шифрование:
Сообщение m преобразуется в число M, где 0≤M<n.
Зашифрованное сообщение C=M^e (mod n).


Дешифрование:
Расшифрованное сообщение M=C^d(mod n).

Пример работы RSA

Простые числа: p=61, q=53.
Модуль: n=61×53=3233.
Функция Эйлера: ϕ(n)=(61−1)(53−1)=3120.
Публичная экспонента: e=17 (выбрано так, что НОД(17, 3120)=1.
Приватная экспонента: d=2753 (так как 17×2753≡1 (mod 3120)).
Шифрование сообщения m=123: C=123^17 (mod 3233)=855.
Дешифрование: M=855^2753 (mod 3233)=123.


Пример шифрования с использованием RSA в Java
import javax.crypto.Cipher;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.util.Base64;

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

// Шифрование
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
String plainText = "Hello, World!";
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);
System.out.println("Encrypted: " + encryptedText);

// Дешифрование
cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
String decryptedText = new String(decryptedBytes);
System.out.println("Decrypted: " + decryptedText);
}
}


#Java #Training #Medium #Crypto #Asymmetrical
Уязвимости асимметричной криптографии

Атака на слабые ключи:
Если p и q слишком близки, можно быстро факторизовать n.
Решение: Использование стойких ключей (например, 2048 бит для RSA).

Атака по времени (Timing Attack):
Измерение времени выполнения операций может раскрыть приватный ключ.
Решение: Использование алгоритмов с постоянным временем выполнения.


Атака на короткие сообщения:
Если сообщение слишком короткое, его можно восстановить без ключа.
Решение: Использование padding (например, OAEP).


Когда использовать асимметричную криптографию?


Асимметричная криптография идеально подходит для:
Безопасного обмена ключами (например, в SSL/TLS).
Цифровых подписей и аутентификации.
Ситуаций, где безопасный обмен ключами невозможен.


#Java #Training #Medium #Crypto #Asymmetrical
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN 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
Что выведет код?

class Alfa {
void print(Alfa obj) {
System.out.println("A");
}
}

class Beta extends Alfa {
void print(Beta obj) {
System.out.println("B");
}
}

public class Task210225 {
public static void main(String[] args) {
Alfa obj1 = new Beta();
Alfa obj2 = new Alfa();
obj1.print(obj2);
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
28%
A
33%
B
26%
RuntimeException
13%
Ничего
А он не подходит к замку 😜

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы с собеседования 👩‍💻

Какой метод используется для запуска потока?
Anonymous Quiz
42%
start()
46%
run()
10%
execute()
2%
launch()
Основы криптографии

Соль (Salt) и вектор инициализации (IV)

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

Как работает соль?
При создании пароля генерируется уникальная соль (обычно 16 байт).
К паролю добавляется соль, и уже затем вычисляется хэш.
При проверке пароля используется та же соль.


Пример генерации соли в Java
import java.security.SecureRandom;
import java.util.Base64;

public class SaltExample {
public static void main(String[] args) {
byte[] salt = new byte[16]; // 16 байт соли
new SecureRandom().nextBytes(salt);
System.out.println("Сгенерированная соль: " + Base64.getEncoder().encodeToString(salt));
}
}


Вектор инициализации (IV) – это случайные данные, добавляемые к первому блоку шифрованного текста, чтобы предотвратить повторяемость результатов.

IV необходим в блочных шифрах (AES, DES) для режимов CBC, GCM.
Он не секретен, но должен быть уникальным для каждого зашифрованного сообщения.


Генерация IV в Java

import java.security.SecureRandom;
import java.util.Base64;

public class IVExample {
public static void main(String[] args) {
byte[] iv = new byte[16]; // IV должен быть 16 байт для AES
new SecureRandom().nextBytes(iv);
System.out.println("Сгенерированный IV: " + Base64.getEncoder().encodeToString(iv));
}
}


Режимы шифрования (ECB, CBC, GCM)

AES (Advanced Encryption Standard) – это блочный алгоритм, работающий с блоками 128 бит (16 байт).

Основные режимы работы AES:
ECB (Electronic Codebook) -> Каждый блок шифруется отдельно -> Уязвим – одинаковые блоки дают одинаковый результат
CBC (Cipher Block Chaining) -> Каждый блок XOR'ится с предыдущим перед шифрованием -> Устойчив к повторяемости, но уязвим к атаке "padding oracle"
GCM (Galois Counter Mode) -> Использует счётчик вместо цепочки блоков, добавляя аутентификацию -> Лучший вариант – быстрый, безопасный, предотвращает подмену


Почему ECB – плохой вариант?
ECB небезопасен, потому что одинаковые блоки данных дают одинаковый зашифрованный результат. Это делает возможной атаку на шаблоны в данных.

Пример ECB в Java
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.util.Base64;

public class ECBExample {
public static void main(String[] args) throws Exception {
String plaintext = "AAAAAAAAAAAAAAAAAAAAAAAA"; // 24 байта - два одинаковых блока

KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128);
SecretKey key = keyGen.generateKey();

Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encrypted = cipher.doFinal(plaintext.getBytes());

System.out.println("Зашифрованный текст (ECB): " + Base64.getEncoder().encodeToString(encrypted));
}
}
Использовать ECB не рекомендуется!


CBC – более безопасный вариант
CBC использует IV, который предотвращает повторяемость.

Пример AES-CBC в Java
import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class CBCExample {
public static void main(String[] args) throws Exception {
String plaintext = "Hello, Secure World!";
byte[] key = new byte[16]; // 128-битный ключ
byte[] iv = new byte[16]; // IV

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(iv);

cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
byte[] encrypted = cipher.doFinal(plaintext.getBytes());

System.out.println("Зашифрованные данные (CBC): " + Base64.getEncoder().encodeToString(encrypted));
}
}


#Java #Training #Medium #Crypto #Salt #IV #ECB #CBC #GCM #AES_256
GCM – лучший вариант
GCM добавляет аутентификацию (AEAD), предотвращая подмену данных.

Пример AES-GCM в Java

import javax.crypto.*;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class AESGCMExample {
public static void main(String[] args) throws Exception {
String plaintext = "Hello, Secure World!";
byte[] key = new byte[16];
byte[] iv = new byte[12];

Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
GCMParameterSpec gcmSpec = new GCMParameterSpec(128, iv);

cipher.init(Cipher.ENCRYPT_MODE, keySpec, gcmSpec);
byte[] encrypted = cipher.doFinal(plaintext.getBytes());

System.out.println("Зашифрованные данные (GCM): " + Base64.getEncoder().encodeToString(encrypted));
}
}
GCM – самый защищённый вариант!


Современные алгоритмы шифрования

AES-256 (Advanced Encryption Standard)
Симметричный алгоритм (один ключ).
Очень быстрый и безопасный.
Используется в VPN, TLS, защищённых хранилищах.


RSA-4096
Асимметричный алгоритм (пара ключей).
Высокая безопасность, но медленный.
Используется для шифрования ключей, цифровых подписей.
Размер ключа должен быть не менее 2048 бит.


ECC (Elliptic Curve Cryptography)
Современнее RSA – обеспечивает такую же безопасность при меньшем размере ключа.
ECC-256 = безопасность RSA-3072.
Используется в блокчейне, криптовалютах, мобильных устройствах.


#Java #Training #Medium #Crypto #Salt #IV #ECB #CBC #GCM #AES_256