← Назад к вопросам

Что такое симметричность?

2.0 Middle🔥 131 комментариев
#Безопасность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Симметричность

Симметричность — математический и логический термин, описывающий отношение, которое работает в обе стороны одинаково. В контексте Java и программирования это понятие применяется в разных областях: криптография, отношения объектов, сравнения и равенство.

Симметричность в криптографии

Симметричное шифрование — это метод, где один и тот же ключ используется как для шифрования, так и для расшифровки данных. Если вы зашифруете данные ключом K, то расшифруете их тем же ключом K.

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class SymmetricEncryptionExample {
    
    // Генерация симметричного ключа
    public static SecretKey generateKey() throws Exception {
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(256);  // 256-bit ключ
        return keyGen.generateKey();
    }
    
    // Шифрование
    public static byte[] encrypt(String data, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        return cipher.doFinal(data.getBytes());
    }
    
    // Расшифровка (тот же ключ!)
    public static String decrypt(byte[] encryptedData, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, key);  // Тот же ключ
        byte[] decryptedData = cipher.doFinal(encryptedData);
        return new String(decryptedData);
    }
    
    public static void main(String[] args) throws Exception {
        SecretKey key = generateKey();
        
        String original = "Secret message";
        byte[] encrypted = encrypt(original, key);
        String decrypted = decrypt(encrypted, key);  // Используем ТОТ ЖЕ ключ
        
        System.out.println("Original: " + original);
        System.out.println("Decrypted: " + decrypted);
        System.out.println("Match: " + original.equals(decrypted));
    }
}

Распространённые симметричные алгоритмы:

  • AES (Advanced Encryption Standard) — стандарт де факто
  • DES (Data Encryption Standard) — устаревший
  • 3DES (Triple DES) — улучшение DES
  • ChaCha20 — современный потоковый шифр

Асимметричное шифрование (противоположность)

Для сравнения, асимметричное шифрование использует два разных ключа:

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import javax.crypto.Cipher;

public class AsymmetricEncryptionExample {
    
    public static KeyPair generateKeyPair() throws Exception {
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
        keyGen.initialize(2048);
        return keyGen.generateKeyPair();
    }
    
    // Шифрование открытым ключом
    public static byte[] encrypt(String data, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        return cipher.doFinal(data.getBytes());
    }
    
    // Расшифровка приватным ключом (ДРУГОЙ ключ!)
    public static String decrypt(byte[] encryptedData, PrivateKey privateKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);  // ДРУГОЙ ключ!
        byte[] decryptedData = cipher.doFinal(encryptedData);
        return new String(decryptedData);
    }
}

Симметричность в отношениях объектов

В Java объект A может быть связан с объектом B так, что если A == B, то B == A. Это симметричное отношение.

public class SymmetricRelationship {
    
    // Правильная реализация equals (симметричная)
    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Person)) return false;
        
        Person other = (Person) obj;
        return this.id.equals(other.id);  // Если this.equals(other), то other.equals(this)
    }
    
    public static void main(String[] args) {
        Person person1 = new Person(1L, "Alice");
        Person person2 = new Person(1L, "Alice");
        
        // Симметричность: если person1.equals(person2), то person2.equals(person1)
        System.out.println(person1.equals(person2));  // true
        System.out.println(person2.equals(person1));  // true (симметрично)
    }
}

class Person {
    Long id;
    String name;
    
    Person(Long id, String name) {
        this.id = id;
        this.name = name;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Person)) return false;
        Person other = (Person) obj;
        return this.id.equals(other.id);
    }
}

Симметричность в сортировке и сравнении

Компаратор должен быть симметричным:

import java.util.Comparator;

public class SymmetricComparator {
    
    // Хорошо: если compare(a, b) < 0, то compare(b, a) > 0
    public static class PersonComparator implements Comparator<Person> {
        @Override
        public int compare(Person a, Person b) {
            return a.name.compareTo(b.name);  // Транзитивное и симметричное
        }
    }
    
    // Плохо: несимметричный компаратор (может нарушить сортировку)
    public static class BrokenComparator implements Comparator<Person> {
        @Override
        public int compare(Person a, Person b) {
            // Это может нарушить контракт Comparator
            if (a.id > 100) return 1;
            if (b.id > 100) return -1;
            return 0;  // Несимметричная логика!
        }
    }
}

Плюсы и минусы симметричного шифрования

Плюсы:

  • Быстро (один ключ, простой алгоритм)
  • Подходит для больших объёмов данных
  • Низкие вычислительные затраты

Минусы:

  • Проблема распределения ключей (как передать один ключ двум сторонам безопасно?)
  • Масштабируемость: для N человек нужно N*(N-1)/2 разных ключей
  • Нет неотказуемости (обе стороны используют один ключ)

Гибридный подход

В реальных системах часто используют гибридное шифрование:

// 1. Асимметричное шифрование для обмена ключами
KeyPair keyPair = generateKeyPair();  // RSA
byte[] encryptedSymmetricKey = encrypt(symmetricKey, keyPair.getPublic());

// 2. Симметричное шифрование для данных (быстрее)
byte[] encryptedData = encryptAES(largeData, symmetricKey);

// Отправляем оба: encryptedSymmetricKey + encryptedData
// Получатель расшифровывает ключ (асимметрично) и данные (симметрично)

Это используется в TLS/SSL: RSA для handshake, AES для данных.

Симметричность — фундаментальный концепт в криптографии, математике и логике программирования.

Что такое симметричность? | PrepBro