"Ценность сети растет пропорционально квадрату числа подключенных устройств."
Меткалф, изобретатель Ethernet, сформулировал этот закон в 1980 году.
Почитать короткую биографию
https://habr.com/ru/companies/edison/articles/277827/
#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
Wikipedia
Robert Metcalfe
American electrical engineer
👍1
Чтение ZIP-архивов с использованием ZipInputStream
ZIP-архивы — это популярный формат сжатия данных, который позволяет объединять несколько файлов в один архив. В Java для работы с ZIP-архивами используются классы ZipInputStream и ZipOutputStream. Начнем с чтения ZIP-архивов.
Класс ZipInputStream
ZipInputStream — это класс, который позволяет читать содержимое ZIP-архива. Он наследуется от InflaterInputStream и использует алгоритм сжатия DEFLATE для распаковки данных.
Как это работает под капотом?
Чтение структуры ZIP-архива: ZIP-архив состоит из записей (entries), каждая из которых представляет отдельный файл. Каждая запись содержит метаданные (имя, размер, метод сжатия и т.д.) и сами данные.
Распаковка данных: ZipInputStream читает каждую запись по очереди и распаковывает данные с использованием алгоритма DEFLATE.
Пример чтения ZIP-архива
Плюсы и минусы ZipInputStream
Плюсы:
Простота использования.
Поддержка потокового чтения, что позволяет работать с большими архивами без загрузки всего содержимого в память.
Минусы:
Низкоуровневый API: требует ручного управления данными и записями.
Нет встроенной поддержки для работы с паролями или шифрованием.
Нюансы использования
Всегда закрывайте ZipInputStream после использования, чтобы освободить ресурсы.
Используйте буфер для чтения данных, чтобы минимизировать количество операций ввода-вывода.
#Java #Training #Medium #ZipInputStream
ZIP-архивы — это популярный формат сжатия данных, который позволяет объединять несколько файлов в один архив. В Java для работы с ZIP-архивами используются классы ZipInputStream и ZipOutputStream. Начнем с чтения ZIP-архивов.
Класс ZipInputStream
ZipInputStream — это класс, который позволяет читать содержимое ZIP-архива. Он наследуется от InflaterInputStream и использует алгоритм сжатия DEFLATE для распаковки данных.
Как это работает под капотом?
Чтение структуры ZIP-архива: ZIP-архив состоит из записей (entries), каждая из которых представляет отдельный файл. Каждая запись содержит метаданные (имя, размер, метод сжатия и т.д.) и сами данные.
Распаковка данных: ZipInputStream читает каждую запись по очереди и распаковывает данные с использованием алгоритма DEFLATE.
Пример чтения ZIP-архива
import java.io.FileInputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class ZipReaderExample {
public static void main(String[] args) {
String zipFilePath = "example.zip";
try (FileInputStream fis = new FileInputStream(zipFilePath);
ZipInputStream zis = new ZipInputStream(fis)) {
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
System.out.println("File: " + entry.getName());
System.out.println("Size: " + entry.getSize() + " bytes");
// Чтение содержимого файла
byte[] buffer = new byte[1024];
int len;
while ((len = zis.read(buffer)) > 0) {
// Здесь можно обработать данные, например, записать в другой файл
System.out.write(buffer, 0, len);
}
System.out.println("\n-------------------");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Плюсы и минусы ZipInputStream
Плюсы:
Простота использования.
Поддержка потокового чтения, что позволяет работать с большими архивами без загрузки всего содержимого в память.
Минусы:
Низкоуровневый API: требует ручного управления данными и записями.
Нет встроенной поддержки для работы с паролями или шифрованием.
Нюансы использования
Всегда закрывайте ZipInputStream после использования, чтобы освободить ресурсы.
Используйте буфер для чтения данных, чтобы минимизировать количество операций ввода-вывода.
#Java #Training #Medium #ZipInputStream
👍3
Что выведет код?
#Tasks
public class Task180225 {
public static void main(String[] args) {
int a = 5;
int b = 3;
int result = a & b | a ^ b;
System.out.println(result);
}
}
#Tasks
👍2
👍1
Вопросы с собеседования 👩💻
Какой интерфейс используется для работы с ключами и значениями?
Какой интерфейс используется для работы с ключами и значениями?
Anonymous Quiz
9%
List
2%
Set
81%
Map
7%
Queue
👍2
Запись ZIP-архивов с использованием ZipOutputStream
Теперь, когда мы научились читать ZIP-архивы, давайте рассмотрим, как создавать их с помощью ZipOutputStream.
Класс ZipOutputStream
ZipOutputStream — это класс, который позволяет создавать ZIP-архивы. Он наследуется от DeflaterOutputStream и использует алгоритм DEFLATE для сжатия данных.
Как это работает под капотом?
Создание структуры ZIP-архива: Каждый файл, добавляемый в архив, представлен как ZipEntry. Метаданные (имя, размер, метод сжатия) записываются в архив перед самими данными.
Сжатие данных: Данные сжимаются с использованием алгоритма DEFLATE и записываются в архив.
Пример создания ZIP-архива
Плюсы и минусы ZipOutputStream
Плюсы:
Простота создания архивов.
Поддержка потоковой записи, что позволяет работать с большими объемами данных.
Минусы:
Нет встроенной поддержки для шифрования или установки паролей.
Требует ручного управления записями и данными.
Нюансы использования
Всегда закрывайте ZipOutputStream после использования, чтобы завершить запись архива.
Используйте буфер для записи данных, чтобы минимизировать количество операций ввода-вывода.
#Java #Training #Medium #ZipOutputStream
Теперь, когда мы научились читать ZIP-архивы, давайте рассмотрим, как создавать их с помощью ZipOutputStream.
Класс ZipOutputStream
ZipOutputStream — это класс, который позволяет создавать ZIP-архивы. Он наследуется от DeflaterOutputStream и использует алгоритм DEFLATE для сжатия данных.
Как это работает под капотом?
Создание структуры ZIP-архива: Каждый файл, добавляемый в архив, представлен как ZipEntry. Метаданные (имя, размер, метод сжатия) записываются в архив перед самими данными.
Сжатие данных: Данные сжимаются с использованием алгоритма DEFLATE и записываются в архив.
Пример создания ZIP-архива
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipWriterExample {
public static void main(String[] args) {
String[] filesToZip = {"file1.txt", "file2.txt"};
String zipFilePath = "output.zip";
try (FileOutputStream fos = new FileOutputStream(zipFilePath);
ZipOutputStream zos = new ZipOutputStream(fos)) {
for (String file : filesToZip) {
try (FileInputStream fis = new FileInputStream(file)) {
ZipEntry zipEntry = new ZipEntry(file);
zos.putNextEntry(zipEntry);
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
zos.closeEntry();
}
}
System.out.println("ZIP-архив успешно создан: " + zipFilePath);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Плюсы и минусы ZipOutputStream
Плюсы:
Простота создания архивов.
Поддержка потоковой записи, что позволяет работать с большими объемами данных.
Минусы:
Нет встроенной поддержки для шифрования или установки паролей.
Требует ручного управления записями и данными.
Нюансы использования
Всегда закрывайте ZipOutputStream после использования, чтобы завершить запись архива.
Используйте буфер для записи данных, чтобы минимизировать количество операций ввода-вывода.
#Java #Training #Medium #ZipOutputStream
👍1
"Гипертекст — это текст, который работает как мысль."
Нельсон, создатель термина "гипертекст", написал это в своей работе "Literary Machines" (1981).
Почитать короткую биографию
И просто интересное
#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
Wikipedia
Ted Nelson
American information technologist, philosopher, and sociologist
👍1
Для тех кто не знает у нас есть чат!
Не шибко активный, но ламповый) - https://t.me/Java_Beginner_chat
👋
Не шибко активный, но ламповый) - https://t.me/Java_Beginner_chat
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Основы криптографии в Java
Криптография — это наука о методах обеспечения конфиденциальности, целостности и аутентичности информации.
Типы криптографии
Симметричная криптография
В симметричной криптографии для шифрования и дешифрования используется один и тот же ключ. Это означает, что обе стороны, обменивающиеся данными, должны заранее договориться о ключе.
Основные алгоритмы симметричной криптографии
AES (Advanced Encryption Standard):
Современный стандарт шифрования, используемый во многих приложениях.
Работает с блоками данных размером 128 бит и поддерживает ключи длиной 128, 192 или 256 бит.
Основные этапы: SubBytes, ShiftRows, MixColumns, AddRoundKey.
Плюсы: высокая скорость, надежность, поддержка аппаратного ускорения.
Минусы: необходимость безопасного обмена ключами.
DES (Data Encryption Standard):
Устаревший алгоритм, использующий ключ длиной 56 бит.
Работает с блоками данных размером 64 бита.
Основные этапы: начальная перестановка, 16 раундов шифрования, финальная перестановка.
Плюсы: простота реализации.
Минусы: слабая стойкость из-за короткого ключа.
Пример шифрования с использованием AES в Java:
#Java #Training #Medium #Crypto #Symmetrical
Криптография — это наука о методах обеспечения конфиденциальности, целостности и аутентичности информации.
Типы криптографии
Симметричная криптография
В симметричной криптографии для шифрования и дешифрования используется один и тот же ключ. Это означает, что обе стороны, обменивающиеся данными, должны заранее договориться о ключе.
Основные алгоритмы симметричной криптографии
AES (Advanced Encryption Standard):
Современный стандарт шифрования, используемый во многих приложениях.
Работает с блоками данных размером 128 бит и поддерживает ключи длиной 128, 192 или 256 бит.
Основные этапы: SubBytes, ShiftRows, MixColumns, AddRoundKey.
Плюсы: высокая скорость, надежность, поддержка аппаратного ускорения.
Минусы: необходимость безопасного обмена ключами.
DES (Data Encryption Standard):
Устаревший алгоритм, использующий ключ длиной 56 бит.
Работает с блоками данных размером 64 бита.
Основные этапы: начальная перестановка, 16 раундов шифрования, финальная перестановка.
Плюсы: простота реализации.
Минусы: слабая стойкость из-за короткого ключа.
Пример шифрования с использованием AES в Java:
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.util.Base64;
public class AESExample {
public static void main(String[] args) throws Exception {
// Генерация ключа
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128); // 128-bit key
SecretKey secretKey = keyGen.generateKey();
// Шифрование
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
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, secretKey);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
String decryptedText = new String(decryptedBytes);
System.out.println("Decrypted: " + decryptedText);
}
}
#Java #Training #Medium #Crypto #Symmetrical
👍1
Что выведет код?
#Tasks
public class Task190225 {
public static void main(String[] args) {
String dateStr = "2013-13-12 23:31:50";
try {
LocalDateTime date = LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(date);
} catch (DateTimeParseException e) {
throw new IllegalArgumentException("Ошибка парсинга");
}
}
}
#Tasks
👍2
Варианты ответа:
Anonymous Quiz
23%
2013-13-12T23:31:50
17%
2013-12-13T23:31:50
23%
DateTimeParseException
27%
IllegalArgumentException
10%
Java Rock'n Roll 🤟
👍1
Вопросы с собеседования 👩💻
Какой тип коллекции хранит уникальные элементы?
Какой тип коллекции хранит уникальные элементы?
Anonymous Quiz
11%
List
13%
Map
73%
Set
2%
Queue
👍1
Основы криптографии в 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
Симметричная криптография: алгоритм 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
👍1
Пример работы AES
Рассмотрим шифрование одного блока данных (16 байт) с использованием 128-битного ключа.
Для шифрования одного блока данных (16 байт) с использованием 128-битного ключа в алгоритме AES (Advanced Encryption Standard) выполняется несколько этапов.
Исходные данные:
Ключ:
1. Key Expansion (Генерация раундовых ключей)
Key Expansion — это процесс генерации раундовых ключей из исходного ключа. Для AES-128 генерируется 11 раундовых ключей (один исходный ключ и 10 для каждого раунда).
2. AddRoundKey (XOR данных с ключом)
На этом этапе выполняется операция XOR между исходными данными и ключом.
Исходные данные:
Ключ:
Результат XOR:
3. SubBytes (Замена байтов через S-блок)
На этом этапе каждый байт данных заменяется на соответствующий байт из S-блока (таблицы замен). S-блок — это фиксированная таблица, которая используется для нелинейного преобразования байтов.
Результат после SubBytes:
4. ShiftRows (Перестановка строк)
На этом этапе строки состояния (матрицы 4x4) сдвигаются циклически. Первая строка остается без изменений, вторая строка сдвигается на один байт влево, третья строка — на два байта, четвертая — на три байта.
Результат после ShiftRows:
5. MixColumns (Линейное преобразование)
На этом этапе каждый столбец состояния умножается на фиксированную матрицу, что приводит к линейному преобразованию данных.
Результат после MixColumns:
6. AddRoundKey (XOR с раундовым ключом)
На этом этапе выполняется операция XOR между текущим состоянием данных и раундовым ключом для текущего раунда.
Предположим, что раундовый ключ для первого раунда:
Результат после AddRoundKey:
Повторение шагов 3-6 для каждого раунда
Эти шаги повторяются для каждого раунда (всего 10 раундов для AES-128). В каждом раунде используются разные раундовые ключи.
Финальный раунд (без MixColumns)
В финальном раунде шаг MixColumns пропускается. После выполнения SubBytes, ShiftRows и AddRoundKey получается окончательный зашифрованный блок данных.
Итоговый зашифрованный блок данных:
После выполнения всех раундов и финального раунда, зашифрованный блок данных будет выглядеть следующим образом (пример):
Это пример того, как данные могут быть преобразованы на каждом этапе. Фактические значения могут отличаться в зависимости от конкретных раундовых ключей и S-блока.
Уязвимости симметричной криптографии
Атака по времени (Timing Attack):
Если реализация AES не защищена, можно измерить время выполнения операций и восстановить ключ.
Решение: Использование алгоритмов с постоянным временем выполнения (constant-time algorithms).
Атака на слабые ключи:
Короткие или предсказуемые ключи могут быть взломаны методом перебора.
Решение: Использование ключей достаточной длины (например, 256 бит для AES).
Проблема обмена ключами:
Симметричная криптография требует безопасного способа передачи ключа между сторонами.
Решение: Использование асимметричной криптографии (например, RSA) для обмена ключами.
Когда использовать симметричную криптографию?
Симметричная криптография идеально подходит для:
Шифрования больших объемов данных (например, файлов или потоков данных).
Приложений, где важна высокая скорость шифрования.
Ситуаций, где безопасный обмен ключами уже обеспечен (например, через TLS).
#Java #Training #Medium #Crypto #Symmetrical
Рассмотрим шифрование одного блока данных (16 байт) с использованием 128-битного ключа.
Для шифрования одного блока данных (16 байт) с использованием 128-битного ключа в алгоритме AES (Advanced Encryption Standard) выполняется несколько этапов.
Исходные данные:
00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
Ключ:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
1. Key Expansion (Генерация раундовых ключей)
Key Expansion — это процесс генерации раундовых ключей из исходного ключа. Для AES-128 генерируется 11 раундовых ключей (один исходный ключ и 10 для каждого раунда).
2. AddRoundKey (XOR данных с ключом)
На этом этапе выполняется операция XOR между исходными данными и ключом.
Исходные данные:
00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
Ключ:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
Результат XOR:
00^00 11^01 22^02 33^03 44^04 55^05 66^06 77^07 88^08 99^09 AA^0A BB^0B CC^0C DD^0D EE^0E FF^0F
= 00 10 20 30 40 50 60 70 80 90 A0 B0 C0 D0 E0 F0
3. SubBytes (Замена байтов через S-блок)
На этом этапе каждый байт данных заменяется на соответствующий байт из S-блока (таблицы замен). S-блок — это фиксированная таблица, которая используется для нелинейного преобразования байтов.
Результат после SubBytes:
63 7C 77 7B F2 6B 6F C5 30 01 67 2B FE D7 AB 76
4. ShiftRows (Перестановка строк)
На этом этапе строки состояния (матрицы 4x4) сдвигаются циклически. Первая строка остается без изменений, вторая строка сдвигается на один байт влево, третья строка — на два байта, четвертая — на три байта.
Результат после ShiftRows:
63 7C 77 7B
6F C5 6B F2
67 2B FE D7
AB 76 30 01
5. MixColumns (Линейное преобразование)
На этом этапе каждый столбец состояния умножается на фиксированную матрицу, что приводит к линейному преобразованию данных.
Результат после MixColumns:
BA 84 E8 1B
75 A4 8D 40
F4 8D 06 7D
7A 32 0E 5D
6. AddRoundKey (XOR с раундовым ключом)
На этом этапе выполняется операция XOR между текущим состоянием данных и раундовым ключом для текущего раунда.
Предположим, что раундовый ключ для первого раунда:
D6 AA 74 FD D2 AF 72 FA DA A6 78 F1 D6 AB 76 FE
Результат после AddRoundKey:
BA^D6 84^AA E8^74 1B^FD
75^D2 A4^AF 8D^72 40^FA
F4^DA 8D^A6 06^78 7D^F1
7A^D6 32^AB 0E^76 5D^FE
= 6C 2E 9C E6
A7 0B FF BA
2E 2B 7E 8C
AC 99 78 A3
Повторение шагов 3-6 для каждого раунда
Эти шаги повторяются для каждого раунда (всего 10 раундов для AES-128). В каждом раунде используются разные раундовые ключи.
Финальный раунд (без MixColumns)
В финальном раунде шаг MixColumns пропускается. После выполнения SubBytes, ShiftRows и AddRoundKey получается окончательный зашифрованный блок данных.
Итоговый зашифрованный блок данных:
После выполнения всех раундов и финального раунда, зашифрованный блок данных будет выглядеть следующим образом (пример):
3A D7 7B B4
0D 7A 36 60
A8 9E CA F3
F6 1F 6C 2B
Это пример того, как данные могут быть преобразованы на каждом этапе. Фактические значения могут отличаться в зависимости от конкретных раундовых ключей и S-блока.
Уязвимости симметричной криптографии
Атака по времени (Timing Attack):
Если реализация AES не защищена, можно измерить время выполнения операций и восстановить ключ.
Решение: Использование алгоритмов с постоянным временем выполнения (constant-time algorithms).
Атака на слабые ключи:
Короткие или предсказуемые ключи могут быть взломаны методом перебора.
Решение: Использование ключей достаточной длины (например, 256 бит для AES).
Проблема обмена ключами:
Симметричная криптография требует безопасного способа передачи ключа между сторонами.
Решение: Использование асимметричной криптографии (например, RSA) для обмена ключами.
Когда использовать симметричную криптографию?
Симметричная криптография идеально подходит для:
Шифрования больших объемов данных (например, файлов или потоков данных).
Приложений, где важна высокая скорость шифрования.
Ситуаций, где безопасный обмен ключами уже обеспечен (например, через TLS).
#Java #Training #Medium #Crypto #Symmetrical
👍1
"Причинность — ключ к пониманию ИИ."
Перл сказал это в своей лекции при получении Премии Тьюринга в 2012 году.
Почитать короткую биографию
#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
Wikipedia
Перл, Джуда
Джуда Перл (англ. Judea Pearl — Джудиа Перл, ивр. יהודה פרל, род. 1936) — американский и израильский учёный в области информатики, автор математического аппарата байесовских сетей, создатель математической и алгоритмической базы вероятностного вывода, автор…
Основы криптографии в Java
Асимметричная криптография
В асимметричной криптографии используются два ключа: публичный (для шифрования) и приватный (для дешифрования). Это решает проблему обмена ключами, но работает медленнее, чем симметричная криптография.
Основные алгоритмы:
RSA (Rivest-Shamir-Adleman):
Основан на сложности факторизации больших чисел.
Использует ключи длиной 1024, 2048 или 4096 бит.
Плюсы: безопасный обмен ключами.
Минусы: низкая скорость, ограниченный размер данных для шифрования.
ECC (Elliptic Curve Cryptography):
Использует математику эллиптических кривых для создания более коротких ключей при той же стойкости, что и RSA.
Плюсы: высокая эффективность, меньший размер ключей.
Минусы: сложность реализации.
Пример шифрования с использованием RSA в Java:
Основные понятия
Шифрование и дешифрование:
Шифрование — процесс преобразования открытого текста в зашифрованный.
Дешифрование — обратный процесс, преобразование зашифрованного текста в открытый.
Ключи:
Публичный ключ: Используется для шифрования, может быть передан кому угодно.
Приватный ключ: Используется для дешифрования, должен храниться в секрете.
Безопасность
Уязвимости:
Слабые ключи: Короткие или предсказуемые ключи могут быть взломаны методом перебора.
Атаки на реализацию: Например, атака по времени (timing attack) на RSA.
Социальная инженерия: Кража ключей через фишинг или другие методы.
#Java #Training #Medium #Crypto #Asymmetrical
Асимметричная криптография
В асимметричной криптографии используются два ключа: публичный (для шифрования) и приватный (для дешифрования). Это решает проблему обмена ключами, но работает медленнее, чем симметричная криптография.
Основные алгоритмы:
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
👍1
Что выведет код в консоль?
#Tasks
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
👍1