Приветствуем! Впервые на сайте Zcash?
The Zcash network is young, but evolving quickly! Sign up and we'll be in touch with monthly highlights on ecosystem growth, network development and how to get started with Zcash!

Язык

парная криптография в языке Rust

Sean Bowe | Jul 06, 2016

Парная криптография это захватывающая область исследований и существенный компонент Zcash zkSNARK — подтверждение того, что транзакции валидны без необходимости того, чтобы пользователи разглашали приватную информацию. Ранее в этом году мы уже использовали zkSNARK чтобы создать в Биткоинах первый конфиденциальный платёж с нулевым разглашением!

Одной из наших целей при движении вперёд является лучшее объяснение того, как наши инструменты работают, и то, как сделать их более доступными для общественности. Как первый шаг, мы начали разработку парной криптографии библиотеки для Rust под названием "bn". Парная криптография является важной для zkSNARK, но что это такое на самом деле?

Эллиптические кривые

Стандартные конструкции эллиптических кривых такие, как secp256k1 — используются в Биткоине — и были разработаны для вещей, подобных цифровым подписям. Точки на прямой формируют цикличную группу: она может быть добавлена вместе и умножена на скаляры. Сейчас считается, что невозможно найти сомножитель для исходной и конечной точки, что называется "проблема дискретного логарифмирования эллиптической кривой".

Эта асимметрия (непринужденность умножения, при сложности обратного преобразования) используется для создания большого количества полезных инструментов и протоколов. Обмен ключами Диффи-Хелмана это простой пример: Alice умножает открытый ключ Боба на свой (скалярный) закрытый ключ, и наоборот, чтобы найти общую тайну в присутствии нежелательного свидетеля.

Этот протокол обмена ключами может быть расширен до трёх участников, но потребует двух раундов: для частей A, B, и C, A получает общую тайну, если B переслал свой открытый ключ для C, который умножил его на свой закрытый ключ и переслал результат A, который тогда может получить общую тайну, умножив результат на свой закрытый ключ.

Парная криптография

Парная криптография является расширением этих понятий. Теперь предположите, что у нас есть две циклические группы: \(G_{1}\) и \(G_{2}\), написанные совокупно, и отображение третьей циклической группы в форме e: \(G_{1} \times G_{2} \rightarrow G_{T}\), где \(G_{T}\) is написано мультипликативно. Если это отображение билинеарное, то:

\(e(a g_{1}, b g_{2}) = e(g_{1}, g_{2})^{ab}\) где \(a\) and \(b\) это скаляры и \(g_{1}\) and \(g_{2}\) это генераторы для их соответствующих групп.

По существу скалярное умножение одного из первых двух элементов группы эквивалентно возведению в степень заключительного элемента группы.

Протокол Джокса о соглашении ключей

Давайте применим парную криптографию к сценарию обмена ключами между тремя участниками, описанному выше. Используя пары, мы можем выполнить обмен в один раунд. Каждый участник \(P\) публикует свой открытый ключ \(P^{pk} = (P^{sk} g_{1}, P^{sk} g_{2})\) и держит свой закрытый ключ \(P^{sk}\) в тайне. Все участники \(A, B, C\) могут вычислить один и тот же секрет, используя билинеарную парную функцию:

Вычисления Алисы Вычисления Боба Вычисления Карла
\(e(B_{1}^{pk}, C_{2}^{pk})^{A^{sk}}\) \(e(C_{1}^{pk}, A_{2}^{pk})^{B^{sk}}\) \(e(A_{1}^{pk}, B_{2}^{pk})^{C^{sk}}\)
Эквивалентны \(e(g_{1}, g_{2})^{A^{sk} B^{sk} C^{sk}}\)

Или, если вы предпочитаете код, посмотрите пример из нашей новой библиотеки:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
 // Генерация закрытых ключей
let alice_sk = Scalar::random(rng);
let bob_sk = Scalar::random(rng);
let carol_sk = Scalar::random(rng);

 // Генерация открытых ключей в G1 и G2
let (alice_pk1, alice_pk2) = (G1::one() * &alice_sk, G2::one() * &alice_sk);
let (bob_pk1, bob_pk2) = (G1::one() * &bob_sk, G2::one() * &bob_sk);
let (carol_pk1, carol_pk2) = (G1::one() * &carol_sk, G2::one() * &carol_sk);

 // Каждый из участников вычисляет совместный секрет
let alice_ss = pairing(&bob_pk1, &carol_pk2) ^ &alice_sk;
let bob_ss = pairing(&carol_pk1, &alice_pk2) ^ &bob_sk;
let carol_ss = pairing(&alice_pk1, &bob_pk2) ^ &carol_sk;

 assert!(alice_ss == bob_ss && bob_ss == carol_ss);

bn

Контейнер "bn" является библиотекой языка Rust для выполнения этих парных операций с использованием криптографической конструкции, созданной нашими разработчиками в [BCGTV14]. Она использует эллиптические кривые Barreto-Naehrig, настроенные для применения в zkSNARKs. Эта библиотека является новой и не полной, поэтому не может использоваться в рабочем программном обеспечении, но она является большим шагом вперёд к нашей цели создания нового вида криптографии, более понятной и простой в использовании.

Проверьте наш контейнер bn на github или на crates.io! И присоединяйтесь к нашему каналу Slack или подписывайтесь на уведомления по электронной почте от нашей команды!