Как зашифровать сообщение с помощью закрытого ключа алгоритма Эль Гамаля?

Добрый день! <br/> У меня возник вопрос, который может показаться необычным, но это часть поставленной задачи. Я пытаюсь проверить целостность сообщения без применения электронной цифровой подписи (ЭЦП). Я планирую зашифровать сообщение с использованием закрытого ключа и затем расшифровать его с помощью открытого ключа. Как я понимаю, алгоритм RSA подходит для этой цели, и предполагается, что метод будет аналогичен нему, т.е. шифрование происходит закрытым ключом, а расшифровка — открытым. <br/> <br/> Я применил стандартную схему генерации ключей и определил значение <i>a</i> для символа <i>M</i> следующим образом, как это делается при обычной операции шифрования открытым ключом: <br/> <code>a = g^k mod p</code> <br/> Однако значение <i>b</i> рассчитываю с использованием закрытого ключа: <br/> <code>b = M * x^k mod p</code> <br/> В итоге расшифровываю сообщение так (с использованием открытого ключа): <br/> <code>M = b * a ^ (p - y - 1) mod p</code> <br/> <br/> Проблема в том, что этот метод не всегда возвращает исходное значение <i>M</i>. <br/> <br/> В качестве примера, я получил значения <i>a</i> и <i>b</i>, равные 17 и 18 соответственно, но расшифрованный символ <i>M</i> составляет 10, вместо ожидаемого 22. <br/> Если кто-то может прояснить, как именно должны выглядеть формулы в описанной схеме, или предложить альтернативные способы обхода ЭЦП, буду признателен за помощь.
  • 18 декабря 2024 г. 11:13
Ответы на вопрос 2
Здравствуйте!

Ваш подход к использованию алгоритма Эль Гамаля для зашифрования сообщения с использованием закрытого ключа может вызвать некоторые недоразумения, так как традиционно в этой схеме зашифрование выполняется с помощью открытого ключа, а расшифрование — с использованием закрытого ключа. Если вы хотите проверить целостность сообщения, стандартная практика состоит в использовании электронных цифровых подписей (ЭЦП), но, как вы упомянули, вы хотите избежать этого.

### Проблема в вашей схеме
Ваши формулы немного искажены, и возможно, именно это приводит к неправильному результату при расшифровке. В алгоритме Эль Гамаля основная идея в том, что каждое сообщение шифруется с помощью случайного ключа, и эти ключи должны быть свежими для каждого сообщения, чтобы обеспечить безопасность.

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

1. **Генерация ключей**: 
   - Вы выбираете большие простые числа \( p \) и \( g \) (основание). 
   - Закрытый ключ \( x \) — это секретное число.
   - Открытый ключ \( y \) вычисляется как \( y = g^x \mod p \).

2. **Шифрование сообщения**:
   - Вы выбираете случайное число \( k \) (всегда должно быть свежим и секретным для каждого шифрования).
   - Вычисляете \( a = g^k \mod p \).
   - Вычисляете \( b = M \cdot y^k \mod p \) (где \( M \) — это ваше сообщение).
   - В результате вы получите зашифрованное сообщение \( (a, b) \).

3. **Расшифрование сообщения**:
   - Чтобы расшифровать, вам нужно использовать закрытый ключ:
   - Вычисляете \( s = a^x \mod p \).
   - Затем вы находите обратное значение \( s^{-1} \) по модулю \( p \).
   - Наконец, расшифровываете сообщение: \( M = b \cdot s^{-1} \mod p \).

### Ваши ошибки:
1. Использование формулы \( b = M \cdot x^k \mod p \) вместо \( b = M \cdot y^k \mod p \).
2. Расшифровка с использованием \( p - y - 1 \) не является правильной, так как вам нужно вычислять обратное значение \( s \).

### Итоговая формулировка:
С помощью вышеприведенных шагов вы сможете корректно зашифровать и расшифровать сообщение с помощью закрытого ключа, но имейте в виду, что такая схема не подходит в общем случае для обеспечения конфиденциальности и не рекомендует её использовать для реальных приложений. Убедитесь, что вы учли аспекты безопасности и целостности данных.
А почему вы решили, что открытый и закрытый ключи взаимозаменяемы? Схема асимметричная, шифрование идёт с помощью открытого и сессионного ключей, дешифрование с помощью закрытого ключа.
Похожие вопросы