Соглашение о ключе Диффи-Хеллмана с использованием ключей RSA?

1

Я хочу, чтобы две стороны согласились на один и тот же секретный ключ, используя свои общедоступные и закрытые ключи. Я не хочу, чтобы у них было какое-то взаимодействие. Поэтому я думаю, что method(A.privKey, B.pubKey) дает такое же число, как method(B.privKey, A.pubKey)

Мне было интересно, работает ли алгоритм соглашения с ключом Диффи-Хеллмана на Java, когда вы используете KeyPairGenerator.getInstance("RSA")

Если да, то как я могу это сделать? Или мне нужно использовать KeyPairGenerator.getInstance("DH")?

Я искал в Интернете и, похоже, не нашел ответа.

Теги:
rsa
cryptography
diffie-hellman

2 ответа

4
Лучший ответ

Математика за Диффи-Хеллманом и RSA достаточно различна, поэтому ключ RSA не может работать для DH.

Диффи-Хеллмана

DH - это обмен ключами, он создает общий ключ с двумя парами ключей. Он не шифрует данные напрямую. (Но легко создавать шифрование, объединяя DH с симметричным шифрованием).

Обе стороны согласуют группу, в простейшем случае, определяемом g и p где p - безопасное начало.

Закрытым ключом является просто число a, соответствующий открытый ключ A является g^a mod p. Общий ключ a вычисляется, поскольку возведение в степень является коммутативным, поэтому

A^b = (g^a)^b = g^(ab) = (g^b)^a = B^a

Для этой работы обе клавиши должны использовать одну и ту же группу. Самый простой способ добиться этого - выбрать одну конкретную группу и жестко привязать ее к протоколу/приложению.

RSA

RSA шифрует сообщение m открытым ключом, создавая зашифрованный текст c. Таким образом, он использует только одну пару ключей, пару ключей получателя.

Частным ключом является фиксированный показатель e (обычно 65537) и пара простых чисел p и q.

Соответствующим открытым ключом является e и произведение простых чисел n = p * q.

Шифрование происходит, вычисляя c = m^e mod n который можно почитать, только если вы знаете p и q но не знаете, если знаете только n.

сравнение

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

  • 0
    Ух ты, человек безумный, хороший ответ! Спасибо!
1

Из-за того, что RSA фактически не создает пару открытых и закрытых ключей, а пару обратных ключей, вы можете сделать обмен с ключами RSA, который создает пару ключей, которые являются обратными, но каждая сторона знает только одну часть из этого. Он полагается на то, что ключи RSA от одной и той же пары коммутируют не только, но также могут коммутироваться с другой парой. Я только что написал код для демонстрации этого утра.

alice -> bob: alice.pub
bob -> alice: bob.pub
alice: a = (alice.priv * bob.pub)
bob: b = (bob.priv * alice.pub)

Вверх и вниз - обратные ключи. Это согласованный асимметричный секретный ключ. Алиса может применить, в то время как Боб может применить b. Когда они применяются, они отменяются. Таким образом, это асимметричное ключевое соглашение. Если бы мы попытались сделать это с помощью RSA, alice или bob знали бы оба ключа. Но с этим сообщения для Боба были определенно созданы Алисой и наоборот.

Я обнаружил это в контексте требования приложения для шифрования ключа для нас - после того, как он подтвердил, что мы авторизованы для него, и чтобы приложение не могло расшифровать ключ позже - только получатель. И хотя получатель может получить ключ открытого текста, он не может создать ключ, который будет правильно декодироваться для другого получателя. Другими словами, если подписывать ключ для кого-то является авторизацией, на самом деле грантополучателю не предоставляются такие гранты - программа, которая знает, кому разрешено записывать их.

Это очень похоже на обмен Диффи Хеллмана, в котором мы обсуждаем общий секрет. Разница в том, что когда мы шифруем другую сторону, мы даже не можем ее расшифровать позже.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню