Π‘Π»ΡƒΡ‡Π°ΠΉΠ½Ρ‹ΠΉ ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΡŒ Π²ΠΊ: ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ побСдитСля Π²ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Π΅ ΠΏΠΎ рСпостам ΠΈΠ»ΠΈ Π»Π°ΠΉΠΊΠ°ΠΌ

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

Π’Ρ‹Π±ΠΎΡ€ случайного побСдитСля Π² конкурсС ΠΈΠ· ΠΏΡ€ΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π²ΡˆΠΈΡ… Π’ΠšΠΎΠ½Ρ‚Π°ΠΊΡ‚Π΅

Π’Ρ‹Π±ΠΎΡ€ случайного побСдитСля Π² конкурсС ΠΈΠ· ΠΏΡ€ΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π²ΡˆΠΈΡ… Π’ΠšΠΎΠ½Ρ‚Π°ΠΊΡ‚Π΅

{{user.first_name}}

{{#if user.paid_date}}({{user.paid_date}}){{/if}}

{{/if}} {{#if !user.first_name}}

Π’Ρ…ΠΎΠ΄ / рСгистрация

{{/if}} Π’Π°Ρ€ΠΈΡ„Ρ‹ ΠΈ ΠΎΠΏΠ»Π°Ρ‚Π° Π”Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ любой ссылкС ΠΈΠ· Π’Πš Π’ΠΈΠ΄ΠΆΠ΅Ρ‚ активности Π’Πš Π’ΠΎΠΊΠ΅Π½ Ρ€Π°ΡΡˆ.
ΠΏΡ€Π°Π² Π’Πš ΠŸΠ°Ρ€Ρ‚Π½Π΅Ρ€ΠΊΠ° {{#if user.first_name}} Π’Ρ‹Ρ…ΠΎΠ΄ {{/if}}
Π’Π°Ρ€Π³Π΅Ρ‚ ΠšΡƒΠ»ΡŒΡ‚ΠΈΠ²Π°Ρ‚ΠΎΡ€

— парсСр Π’ΠšΠΎΠ½Ρ‚Π°ΠΊΡ‚Π΅ ΠΈ Π˜Π½ΡΡ‚Π°Π³Ρ€Π°ΠΌ


  • ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚ Π² автоматичСском Ρ€Π΅ΠΆΠΈΠΌΠ΅ случайного побСдитСля вашСго конкурса ΠΈΠ· Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ проголосовал Π² голосовании ΠΊ посту!
  • ГолосованиС Π”ΠžΠ›Π–ΠΠž Π±Ρ‹Ρ‚ΡŒ НЕ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΌ!
  • Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Ρ‚ΡŒ Π² опросС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ€Π΅Π·Π°Π»ΡŒΡ‚Π°Ρ‚Ρ‹!
  • ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ автоматичСски Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»Π΅ΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· участников сообщСства(ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ сдСлан пост)
  • Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ вступлСниС Π² Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π³Ρ€ΡƒΠΏΠΏΡ‹ — ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ ΠΈΡ… Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΠ»Π΅(ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ Π² строку)
  • Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ (ΠΏΠΎ нововвСдСниям Π’Πš) для провСдСния конкурса Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π’ΠΎΠΊΠ΅Π½ Ρ€Π°ΡΡˆ. ΠΏΡ€Π°Π² ΠΈ Π½Π°ΠΆΠ°Ρ‚ΡŒ «Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ основной»
  • Для провСдСния конкурса Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ приобрСсти Ρ‚Π°Ρ€ΠΈΡ„

Π’Π²Π΅Π΄ΠΈΡ‚Π΅ ссылку Π½Π° пост

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π½Π° вступлСниС Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ сообщСства

{{#if vk_groups_info. view==’repost’}}

ВсСго рСпостов: {{vk_groups_info.all_reposts}}
РСпостов ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ: {{vk_groups_info.user_reposts}}

{{/if}} {{#if vk_groups_info.view==’comment’}}

ВсСго ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π²: {{vk_groups_info.all_reposts}}
ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ: {{vk_groups_info.user_reposts}}

{{/if}} {{#if vk_groups_info.view==’like’}}

ВсСго Π»Π°ΠΉΠΊΠΎΠ²: {{vk_groups_info.user_reposts}}

{{/if}} {{#if vk_groups_info.view==’poll’}}

ВсСго ΠΏΡ€ΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π²ΡˆΠΈΡ…: {{vk_groups_info.total_poll}}

{{#if vk_groups_info.poll_answers}}

Π’Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· ΠΏΡ€ΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π²ΡˆΠΈΡ… Π·Π° ΠΎΡ‚Π²Π΅Ρ‚

Π›ΡŽΠ±ΠΎΠΉ ΠΎΡ‚Π²Π΅Ρ‚ опроса {{vk_groups_info.total_poll}}

{{#each vk_groups_info.poll_answers: nom}}

ΠžΡ‚Π²Π΅Ρ‚: {{ text }} {{ votes }}

{{/each}}

{{/if}}

Π’Ρ‹Π±Ρ€Π°Π½ΠΎ участников: {{vk_groups_info. user_reposts}}

{{/if}} {{#if vk_groups_info.user_reposts>0}}

Бколько ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»Π΅ΠΉ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ

{{/if}} {{#if vk_groups_info.winners}} {{#if vk_groups_info.datetime}}

Π”Π°Ρ‚Π° ΠΈ врСмя: {{vk_groups_info.datetime}}

{{/if}}
{{#if (vk_groups_info.count_winner>1) }}ΠŸΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΠΈ{{else}}ΠŸΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΡŒ{{/if}}

{{#each vk_groups_info.winners: nom}}

{{#if (vk_groups_info.count_winner>1) }} {{nom+1}}. {{/if}} {{first_name}} {{last_name}} @{{screen_name}}

{{/each}}

{{/if}} {{#if vk_groups_info.winners}}

Π’Ρ‹Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π² Π²ΠΈΠ΄Π΅

Имя ссылкой

ΠœΠ΅ΡΡ‚ΠΎ, имя ссылкой

ИмСна

Бсылки

{{/if}} {{/if}}

Как Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ случайного побСдитСля Π’ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Π΅ β€” 3 способа

ΠšΠΎΠ½ΠΊΡƒΡ€ΡΡ‹ Π² ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… сСтях – это Π½Π΅ΠΎΡ‚ΡŠΠ΅ΠΌΠ»Π΅ΠΌΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ продвиТСния ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°, Π±Ρ€Π΅Π½Π΄Π°, роста Π°ΡƒΠ΄ΠΈΡ‚ΠΎΡ€ΠΈΠΈ ΠΈ активности. ΠŸΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ мСроприятия Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ эффСктивно, Π½ΠΎ ΠΈ приятно. Π“Π»Π°Π²Π½ΠΎΠ΅, ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ чСстными ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»Π΅ΠΉ. Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ послСднСС случайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, разбСрёмся Π΄Π°Π»Π΅Π΅ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅.

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

  1. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² VK
  2. ИспользованиС ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… сСрвисов Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅
  3. Π‘Ρ‚Π°Ρ€Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ с записью Π½Π° Π²ΠΈΠ΄Π΅ΠΎ

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² VK

Π›ΠΎΠ³ΠΎΡ‚ΠΈΠΏ Lucky you!

Для опрСдСлСния ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»Π΅ΠΉ Π² конкурсС, ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π² VK, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ самым простым ΠΈ доступным ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ – спСциализированным ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. На Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ сущСствуСт большоС количСство соврСмСнных сСрвисов, ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‰ΠΈΡ… Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰Π΅Π³ΠΎ вопроса. Π‘Ρ€Π΅Π΄ΠΈ популярных Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ΡΡ:

  1. RandomApp. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° считаСтся ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· самых прогрСссивных Π² ΠΏΠ»Π°Π½Π΅ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΈ, статистики, выполнСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… условий ΡƒΡ‡Ρ‘Ρ‚Π°. Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ случайного Π²Ρ‹Π±ΠΎΡ€Π° побСдитСля потрСбуСтся ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ список участников ΠΈ Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π° Π² Π³Ρ€ΡƒΠΏΠΏΠ΅, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Ρ€Π°Π΄ΡƒΡŽΡ‚ всСх.
  2. Lucky you! Π•Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΎ популярноС ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‰Π΅Π΅ создатСлям конкурса ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ ΠΈ случайного побСдитСля. ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ поставлСнной Π·Π°Π΄Π°Ρ‡ΠΈ потрСбуСтся список ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Ρ€Π°Π½Π΄ΠΎΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. Для ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΠΎΠΉ вСрсии прилоТСния создан ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π», Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‰ΠΈΠΉ фиормирования списков.
  3. Π‘Π»ΡƒΡ‡Π°ΠΉΠ½Ρ‹ΠΉ ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΡŒ Π² Ρ€ΠΎΠ·Ρ‹Π³Ρ€Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠ·ΠΎΠ² – это ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, достойноС рассмотрСния Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ·-Π·Π° названия. БСрвис ΠΌΠ΅Π½Π΅Π΅ Ρ€Π°Π·Π²ΠΈΡ‚Ρ‹ΠΉ, Ρ‡Π΅ΠΌ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ПО, Π½ΠΎ для Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… конкурсов ΠΏΠΎΠ΄ΠΎΠΉΠ΄Ρ‘Ρ‚ Π½Π° ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ.

Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ это Π½Π΅ всС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, доступныС для использования. Π—Π΄Π΅ΡΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ LikeChecker, ΠšΠΎΠ½ΠΊΡƒΡ€Π·ΠΈΠ»Π°, Megarand ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅.

ИспользованиС ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… сСрвисов Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅

Π‘Π°ΠΉΡ‚ random.org

Π‘Ρ‹Π²Π°ΡŽΡ‚ случаи, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ конкурс Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ»ΠΎΡ‰Π°Π΄ΠΊΠ°Ρ…. Π‘ΠΎΠ±Ρ€Π°Ρ‚ΡŒ всСх людСй Π² ΠΎΠ΄Π½ΠΎΠΌ мСстС Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π° провСсти ряд конкурсов – это Π΄ΠΎΡ€ΠΎΠ³ΠΎΠ΅ ΡƒΠ΄ΠΎΠ²ΠΎΠ»ΡŒΡΡ‚Π²ΠΈΠ΅. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ трСбуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄.

Для Π½Π°Ρ‡Π°Π»Π° ΡΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ список участников, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ условия. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ сСрвисныС прилоТСния ΠΏΠΎ ΡƒΡ‡Ρ‘Ρ‚Ρƒ статистики, Π° Ρ‚Π°ΠΊΠΆΠ΅ осущСствляСм Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΎΡ†Π΅Π½ΠΊΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². Бписок Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠ½ΡƒΠΌΠ΅Ρ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€. Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· этого, ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΡŒ конкурса.

Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ случайного участника, потрСбуСтся ΠΏΠΎΡΠ΅Ρ‚ΠΈΡ‚ΡŒ сайт random.org ΠΈΠ»ΠΈ randompicker.com. Π’Π²ΠΎΠ΄ΠΈΠΌ количСство Π½ΠΎΠΌΠ΅Ρ€ΠΊΠΎΠ², Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Ρ€Π°Π½Π΄ΠΎΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ число. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΠ²Π΅Ρ€ΠΈΡ‚ΡŒΡΡ с порядковым Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ€ΠΎΠ·Ρ‹Π³Ρ€Ρ‹Ρˆ.

ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ всС Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ чСстным, ΠΈΠ½Π°Ρ‡Π΅ ΠΏΠΎΠ΄ΠΎΡ€Π²Π°Π½Π½ΠΎΠ΅ Π΄ΠΎΠ²Π΅Ρ€ΠΈΠ΅ сыграСт Π·Π»ΡƒΡŽ ΡˆΡƒΡ‚ΠΊΡƒ. Для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ процСсса Π½ΡƒΠΌΠ΅Ρ€Π°Ρ†ΠΈΠΈ обяТитС участников ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΉ записью. Π§Π΅Π»ΠΎΠ²Π΅ΠΊ ΡƒΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ ΠΎΠ½ ΠΏΠΎ счёту ΠΈ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ, Π° Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ быстро ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ список.

Π‘Ρ‚Π°Ρ€Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ с записью Π½Π° Π²ΠΈΠ΄Π΅ΠΎ

НомСрки Π² шапкС

НСкоторыС конкурсы проводятся срСди ΡƒΠ·ΠΊΠΎΠ³ΠΎ ΠΊΡ€ΡƒΠ³Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ·Π΅ΠΉ. НСбольшоС количСство людСй Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ сущСствуСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования «дСдовского ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Β». ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ побСдитСля ΠΆΡ€Π΅Π±ΠΈΠ΅ΠΌ, с трансляциСй Π² прямом эфирС.

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ дСйствиС ΠΈΠ½ΠΎΠΉ Ρ€Π°Π· Ρ‚Ρ€ΡƒΠ΄Π½Π΅Π΅, Ρ‡Π΅ΠΌ просто Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ сСрвисом сайтов ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Но имССтся ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ сторона, которая Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² большСм Π΄ΠΎΠ²Π΅Ρ€ΠΈΠΈ. Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ потрСбуСтся ΠΊΠ°ΠΌΠ΅Ρ€Π°, Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚, Π½ΠΎΠΌΠ΅Ρ€ΠΊΠΈ ΠΈ ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ°, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ΡΡ ΠΏΠΎΠ±Π΅Π΄Π½Ρ‹ΠΉ листок ΠΈΠ»ΠΈ ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠ°.

ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, особоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡƒΠ΄Π΅Π»ΠΈΡ‚Π΅ чСстности ΠΈ созданию списка. Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ для Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ вас, ΠΊΠ°ΠΊ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°, рСкламодатСля ΠΈΠ»ΠΈ производитСля. ΠŸΠΎΠ΄ΠΊΡ€Π΅ΠΏΠ»ΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ рСкомСндуСтся ΠΈ ΠΏΡ€ΠΈ использовании ΠΏΡ€ΠΎΡ‡ΠΈΡ… способов, описанных Π² ΠΏΡƒΠ½ΠΊΡ‚Π΅ β„–1 ΠΈ 2. Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ прямым эфиром, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ доступСн Π²ΠΎ всСх ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… сСтях.

Π’Ρ€ΠΈ способа Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ побСдитСля ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ случайно, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для Π²Π°ΡˆΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ. ΠžΡΡ‚Π°Π²Π°ΠΉΡ‚Π΅ΡΡŒ с Π½Π°ΠΌΠΈ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°ΠΉΡ‚Π΅ Π΅Ρ‰Ρ‘ большС ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ Π² ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… сСтях.

ecdsa Β· PyPI

Π­Ρ‚ΠΎ простая Π² использовании рСализация ECC (криптография Π½Π° эллиптичСских ΠΊΡ€ΠΈΠ²Ρ‹Ρ…). с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ ECDSA (Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠΉ подписи Π½Π° эллиптичСских ΠΊΡ€ΠΈΠ²Ρ‹Ρ…), EdDSA (Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠΉ подписи ΠΊΡ€ΠΈΠ²ΠΎΠΉ Эдвардса) ΠΈ ECDH (ЭллиптичСская кривая Π”ΠΈΡ„Ρ„ΠΈ-Π₯Π΅Π»Π»ΠΌΠ°Π½Π°), рСализованная ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π° Python, выпущСнная ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ лицСнзия MIT. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ быстро ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Ρ‹ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ (подписаниС ΠΊΠ»ΡŽΡ‡ ΠΈ ΠΊΠ»ΡŽΡ‡ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ), ΠΏΠΎΠ΄ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ сообщСния ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ подписи. Π’Ρ‹ моТСшь Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ сСкрСтный ΠΊΠ»ΡŽΡ‡ Π½Π° основС ΠΎΠ±ΠΌΠ΅Π½Π΅Π½Π½Ρ‹Ρ… ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ. ΠšΠ»ΡŽΡ‡ΠΈ ΠΈ подписи ΠΎΡ‡Π΅Π½ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ с Π½ΠΈΠΌΠΈ ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•. Π­Ρ‚Ρƒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π½Π΅ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… настройках. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒΒ».

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π­Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° обСспСчиваСт Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, подпись, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΈ ΠΎΠ±Ρ‰ΠΈΠΉ сСкрСт Π²Ρ‹Π²ΠΎΠ΄ Π½Π° ΠΏΡΡ‚ΡŒ популярныС ΠΊΡ€ΠΈΠ²Ρ‹Π΅ NIST «Suite B» GF(p) ( простых ΠΏΠΎΠ»Π΅ΠΉ ) с Π΄Π»ΠΈΠ½ΠΎΠΉ ΠΊΠ»ΡŽΡ‡Π° 192, 224, 256, 384 ΠΈ 521 Π±ΠΈΡ‚. Β«ΠšΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π°Β» для этих ΠΊΡ€ΠΈΠ²Ρ‹Ρ…, извСстныС инструмСнт OpenSSL ( openssl ecparam -list_curves ), это: prime192v1 , secp224r1 , prime256v1 , secp384r1 ΠΈ secp521r1 . Он Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя 256-битная кривая secp256k1 , ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ Π‘ΠΈΡ‚ΠΊΠΎΠΉΠ½ΠΎΠΌ. БущСствуСт Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ (нСскручСнныС) Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΊΡ€ΠΈΠ²Ρ‹Ρ… Brainpool ΠΎΡ‚ 160 Π΄ΠΎ 512 Π±ΠΈΡ‚. Β«ΠΊΡ€Π°Ρ‚ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π°Β» этих ΠΊΡ€ΠΈΠ²Ρ‹Ρ…: brainpoolP160r1 , brainpoolP192r1 , Π±Ρ€Π΅ΠΉΠ½ΠΏΡƒΠ»P224r1 , Π±Ρ€Π΅ΠΉΠ½ΠΏΡƒΠ»P256r1 ,

Π±Ρ€Π΅ΠΉΠ½ΠΏΡƒΠ»P320r1 , Π±Ρ€Π΅ΠΉΠ½ΠΏΡƒΠ»P384r1 , ΠΌΠΎΠ·Π³ΠΎΠ²ΠΎΠΉ ΠΏΡƒΠ» P512r1 . НСкоторыС ΠΈΠ· Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΊΡ€ΠΈΠ²Ρ‹Ρ… ΠΈΠ· стандарта SEC Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ (Π² основном для ускорСния тСстирования Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ), это: secp112r1 , secp112r2 , secp128r1 ΠΈ secp160r1 . ГСнСрация ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, подписаниС ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ для Ed25519 ΠΈ ΠšΡ€ΠΈΠ²Ρ‹Π΅ Ed448. НикакиС Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΡ€ΠΈΠ²Ρ‹Π΅ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹, Π½ΠΎ нСслоТно Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ большСго количСства ΠΊΡ€ΠΈΠ²Ρ‹Ρ…. ΠΊΡ€ΠΈΠ²Ρ‹Π΅ Π½Π°Π΄ простыми полями.

Зависимости

Π­Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Python ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ ‘six’. Он совмСстим с Python 2.6, 2.7 ΠΈ 3.3+. Он Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ pypy ΠΈ pypy3.

Если установлСны gmpy2 ΠΈΠ»ΠΈ gmpy , ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Π±ΠΎΠ»Π΅Π΅ быстрой Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠΈ. Π›ΡŽΠ±ΡƒΡŽ ΠΈΠ· Π½ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ послС установки этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ,

python-ecdsa ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ ΠΈΡ… присутствиС ΠΏΡ€ΠΈ запускС ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΈΡ… автоматичСски. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Π΅ΡΡ‚ΡŒ gmpy2 Π½Π° Python3 для ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Для запуска тСстов совмСстимости OpenSSL инструмСнт openssl Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π² вашСм ПУВЬ . Π­Ρ‚ΠΎΡ‚ выпуск Π±Ρ‹Π» ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ протСстирован Π½Π° OpenSSL 0.9..8o, 1.0.0a, 1.0.2f, 1.1.1d ΠΈ 3.0.1 (срСди ΠΏΡ€ΠΎΡ‡ΠΈΡ…).

Установка

Π­Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° доступна Π½Π° PyPI, рСкомСндуСтся ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pip :

 pip install ecdsa
 

Если трСбуСтся Π±ΠΎΠ»Π΅Π΅ высокая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ использованиС собствСнного ΠΊΠΎΠ΄Π° Π½Π΅ являСтся ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ установку вмСстС с gmpy2 :

 pip install ecdsa[gmpy2]
 

ΠΈΠ»ΠΈ (ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚):

 pip install ecdsa[gmpy]
 

Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, сколько Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ трСбуСтся этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ для создания ΠΏΠ°Ρ€ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ.

( keygen ), для подписи Π΄Π°Π½Π½Ρ‹Ρ… (, Π·Π½Π°ΠΊ ), для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ этих подписСй (, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ), для получСния ΠΎΠ±Ρ‰Π΅Π³ΠΎ сСкрСта ( ecdh ) ΠΈ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ подписСй Π±Π΅Π· ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ вычислСния ΠΊΠ»ΡŽΡ‡Π° ( Π±Π΅Π· ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ПК ). ВсС эти значСния ΡƒΠΊΠ°Π·Π°Π½Ρ‹ Π² сСкундах. Для удобства Ρ‚Π°ΠΊΠΆΠ΅ прСдусмотрСны инвСрсии этих Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ: сколько ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Π² сСкунду ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сгСнСрировано ( keygen/s ), сколько подписСй ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сдСлано Π² сСкунду ( Π·Π½Π°ΠΊΠΎΠ² / с ), сколько подписСй ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π² сСкунду ( verify/s ), сколько ΠΎΠ±Ρ‰ΠΈΡ… сСкрСтов ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ Π² сСкунду ( ecdh/s ) ΠΈ сколько подписСй Π±Π΅Π· ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ вычислСния ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Ρ‹ Π² сСкунду ( Π±Π΅Π· ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ПК/с ). Π Π°Π·ΠΌΠ΅Ρ€ ΡΡ‹Ρ€ΡŒΡ подпись (ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, самая малСнькая способ кодирования подписи) Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΊΠ°Π·Π°Π½ Π² столбцС
siglen
. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ tox -e ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ эту Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π½Π° своСм ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅. На Intel Core i7 4790K @ 4,0 Π“Π“Ρ† я ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ:

 siglen keygen keygen/s Π·Π½Π°ΠΊ Π·Π½Π°ΠΊ/Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ/с Π½Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ПК Π½Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ПК
        NIST192p: 48 0,00032 с 3134,06 0,00033 с 2985,53 0,00063 с 1598,36 0,00129 с 774,43
        NIST224p: 56 0,00040 с 2469,24 0,00042 с 2367,88 0,00081 с 1233,41 0,00170 с 586,66
        NIST256p: 64 0,00051 с 1952,73 0,00054 с 1867,80 0,00098 с 1021,86 0,00212 с 471,27
        NIST384p: 96 0,00107 с 935,92 0,00111 с 904,23 0,00203 с 491,77 0,00446 с 224,00
        NIST521p: 132 0,00210 с 475,52 0,00215 с 464,16 0,00398 с 251,28 0,00874 с 114,39
       SECP256k1: 64 0,00052 с 1921,54 0,00054 с 1847,49 0,00105 с 948,68 0,00210 с 477,01
 BRAINPOOLP160r1: 40 0,00025 с 4003,88 0,00026 с 3845,12 0,00053 с 1893,93 0,00105 с 949,92
 BRAINPOOLP192r1: 48 0,00033 с 3043,97 0,00034 с 2975,98 0,00063 с 1581,50 0,00135 с 742,29
 BRAINPOOLP224r1: 56 0,00041 с 2436,44 0,00043 с 2315,51 0,00078 с 1278,49 0,00180 с 556,16
 BRAINPOOLP256r1: 64 0,00053 с 1892,49 0,00054 с 1846,24 0,00114 с 875,64 0,00229 с 437,25
 BRAINPOOLP320r1: 80 0,00073 с 1361,26 0,00076 с 1309,25 0,00143 с 699,29 0,00322 с 310,49BRAINPOOLP384r1: 96 0,00107 с 931,29 0,00111 с 901,80 0,00230 с 434,19 0,00476 с 210,20
 BRAINPOOLP512r1: 128 0,00207 с 483,41 0,00212 с 471,42 0,00425 с 235,43 0,00912 с 109,61
       SECP112r1: 28 0,00015 с 6672,53 0,00016 с 6440,34 0,00031 с 3265,41 0,00056 с 1774,20
       SECP112r2: 28 0,00015 с 6697,11 0,00015 с 6479,98 0,00028 с 3524,72 0,00058 с 1716,16
       SECP128r1: 32 0,00018 с 5497,65 0,00019 с 5272,89 0,00036 с 2747,39 0,00072 с 1396,16
       SECP160r1: 42 0,00025 с 3949,32 0,00026 с 3894,45 0,00046 с 2153,85 0,00102 с 985,07
         Ed25519: 64 0,00076 с 1324,48 0,00042 с 2405,01 0,00109 с 918,05 0,00344 с 290,50
           Ed448: 114 0,00176 с 569,53 0,00115 с 870,94 0,00282 с 355,04 0,01024 с 97,69
                       ecdh ecdh/с
        NIST192p: 0,00104 с 964,89
        NIST224p: 0,00134 с 748,63
        NIST256p: 0,00170 с 587,08
        NIST384p: 0,00352 с 283,90
        NIST521p: 0,00717 с 139,51
       SECP256k1: 0,00154 с 648,40
 BRAINPOOLP160r1: 0,00082 с 1220,70
 BRAINPOOLP192r1: 0,00105 с 956,75
 BRAINPOOLP224r1: 0,00136 с 734,52
 BRAINPOOLP256r1: 0,00178 с 563,32
 BRAINPOOLP320r1: 0,00252 с 397,23
 BRAINPOOLP384r1: 0,00376 с 266,27
 BRAINPOOLP512r1: 0,00733 с 136,35
       SECP112r1: 0,00046 с 2180,40
       SECP112r2: 0,00045 с 2229. 14
       SECP128r1: 0,00054 с 1868,15
       SECP160r1: 0,00080 с 1243,98
 

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ с Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΌ gmpy2 , ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ tox -e speedgmpy2 . На Ρ‚ΠΎΠΉ ΠΆΠ΅ машинС я ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ с gmpy2 :

 siglen keygen keygen/s Π·Π½Π°ΠΊ Π·Π½Π°ΠΊ/Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ/с Π½Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ПК Π½Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ПК/с
        NIST192p: 48 0,00017 с 5933,40 0,00017 с 5751,70 0,00032 с 3125,28 0,00067 с 1502,41
        NIST224p: 56 0,00021 с 4782,87 0,00022 с 4610,05 0,00040 с 2487,04 0,00089с 1126,90
        NIST256p: 64 0,00023 с 4263,98 0,00024 с 4125,16 0,00045 с 2200,88 0,00098 с 1016,82
        NIST384p: 96 0,00041 с 2449,54 0,00042 с 2399,96 0,00083 с 1210,57 0,00172 с 581,43
        NIST521p: 132 0,00071 с 1416,07 0,00072 с 1389,81 0,00144 с 692,93 0,00312 с 320,40
       SECP256k1: 64 0,00024 с 4245,05 0,00024 с 4122,09 0,00045 с 2206,40 0,00094 с 1068,32
 BRAINPOOLP160r1: 40 0,00014 с 6939,17 0,00015 с 6681,55 0,00029 с 3452,43 0,00057 с 1769,81
 BRAINPOOLP192r1: 48 0,00017 с 5920,05 0,00017 с 5774,36 0,00034 с 2979,00 0,00069 с 1453,19
 BRAINPOOLP224r1: 56 0,00021 с 4732,12 0,00022 с 4622,65 0,00041 с 2422,47 0,00087 с 1149,87
 BRAINPOOLP256r1: 64 0,00024 с 4233,02 0,00024 с 4115,20 0,00047 с 2143,27 0,00098 с 1015,60
 BRAINPOOLP320r1: 80 0,00032 с 3162,38 0,00032 с 3077,62 0,00063 с 1598,83 0,00136 с 737,34
 BRAINPOOLP384r1: 96 0,00041 с 2436,88 0,00042 с 2395,62 0,00083 с 1202,68 0,00178 с 562,85
 BRAINPOOLP512r1: 128 0,00063 с 1587,60 0,00064 с 1558,83 0,00125 с 799,96 0,00281 с 355,83
       SECP112r1: 28 0,00009 с 11118,66 0,00009 с 10775,48 0,00018 с 5456,00 0,00033 с 3020,83
       SECP112r2: 28 0,00009 с 11322,97 0,00009 с 10857,71 0,00017 с 5748,77 0,00032 с 3094,28
       SECP128r1: 32 0,00010 с 10078,39 0,00010 с 9665,27 0,00019 с 5200,58 0,00036 с 2760,88
       SECP160r1: 42 0,00015 с 6875,51 0,00015 с 6647,35 0,00029 с 3422,41 0,00057 с 1768,35
         Ed25519: 64 0,00030 с 3322,56 0,00018 с 5568,63 0,00046 с 2165,35 0,00153 с 654,02
           Ed448: 114 0,00060 с 1680,53 0,00039 с 2567,40 0,00096 с 1036,67 0,00350 с 285,62
                       ecdh ecdh/с
        NIST192Ρ€: 0,00050 с 1985,70
        NIST224p: 0,00066 с 1524,16
        NIST256p: 0,00071 с 1413,07
        NIST384p: 0,00127 с 788,89
        NIST521p: 0,00230 с 434,85
       SECP256k1: 0,00071 с 1409,95
 BRAINPOOLP160r1: 0,00042 с 2374,65
 BRAINPOOLP192r1: 0,00051 с 1960,01
 BRAINPOOLP224r1: 0,00066 с 1518,37
 BRAINPOOLP256r1: 0,00071 с 1399,90
 BRAINPOOLP320r1: 0,00100 с 997,21
 BRAINPOOLP384r1: 0,00129 с 777,51
 BRAINPOOLP512r1: 0,00210 с 475,99
       SECP112r1: 0,00022 с 4457,70
       SECP112r2: 0,00024 с 4252,33
       SECP128r1: 0,00028 с 3589. 31
       SECP160r1: 0,00043 с 2305,02
 

(Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ вСрсия gmpy , запуститС Π΅Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ tox -e speedgmpy )

Для сравнСния, высокооптимизированная рСализация (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ‡Π½ΡƒΡŽ для ΠΊΡ€ΠΈΠ²ΠΎΠΉ сборки для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΊΡ€ΠΈΠ²Ρ‹Ρ…), Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² OpenSSL 1.1.1d, обСспСчиваСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½Π° Ρ‚ΠΎΠΉ ΠΆΠ΅ машинС. ЗапуститС openssl speed ecdsa ΠΈ openssl speed ecdh , Ρ‡Ρ‚ΠΎΠ±Ρ‹ воспроизвСсти Π΅Π³ΠΎ:

 ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° подписи ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° подписи/с
 192 Π±ΠΈΡ‚Π° ecdsa (nistp192) 0,0002 с 0,0002 с 4785,6 5380,7
 224 Π±ΠΈΡ‚Π° ecdsa (nistp224) 0,0000 с 0,0001 с 22475,6 9822,0
 256 Π±ΠΈΡ‚ ecdsa (nistp256) 0,0000 с 0,0001 с 45069,6 14166,6
 384 Π±ΠΈΡ‚ ecdsa (nistp384) 0,0008 с 0,0006 с 1265,6 1648,1
 521 Π±ΠΈΡ‚ ecdsa (nistp521) 0,0003 с 0,0005 с 3753,1 1819,5
 256 Π±ΠΈΡ‚ ecdsa (brainpoolP256r1) 0,0003 с 0,0003 с 2983,5 3333,2
 384-Π±ΠΈΡ‚Π½Ρ‹ΠΉ ecdsa (brainpoolP384r1) 0,0008 с 0,0007 с 1258,8 1528,1
 512 Π±ΠΈΡ‚ ecdsa (brainpoolP512r1) 0,0015 с 0,0012 с 675,1 860,1
                              ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒ/ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ/ΠΈ
 253 Π±ΠΈΡ‚ EdDSA (Ed25519) 0,0000 с 0,0001 с 28 217,9 10 897,7
 456 Π±ΠΈΡ‚ EdDSA (Ed448) 0,0003 с 0,0005 с 3926,5 2147,7
                               оп оп/с
 192 Π±ΠΈΡ‚Π° ecdh (nistp192) 0,0002 с 4853,4
 224 Π±ΠΈΡ‚Π° ecdh (nistp224) 0,0001 с 15252,1
 256 Π±ΠΈΡ‚ ecdh (nistp256) 0,0001 с 18436,3
 384 Π±ΠΈΡ‚Π° ecdh (nistp384) 0,0008 с 1292,7
 521 Π±ΠΈΡ‚ ecdh (nistp521) 0,0003 с 2884,7
 256 Π±ΠΈΡ‚ ecdh (brainpoolP256r1) 0,0003 с 3066,5
 384-Π±ΠΈΡ‚Π½Ρ‹ΠΉ ecdh (brainpoolP384r1) 0,0008 с 1298,0
 512 Π±ΠΈΡ‚ ecdh (brainpoolP512r1) 0,0014 с 694,8
 

ΠšΠ»ΡŽΡ‡ΠΈ ΠΈ подпись ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ (см. ИспользованиС Π½ΠΈΠΆΠ΅). Для ΠΊΠ»ΡŽΡ‡Π° NIST192p для Ρ‚Ρ€Π΅Ρ… основных прСдставлСний Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ строки ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π»ΠΈΠ½Ρ‹ (Π² Π±Π°ΠΉΡ‚Π°Ρ…):

 to_string: signkey= 24, verifykey= 48, подпись=48
сТато: ΠΊΠ»ΡŽΡ‡ подписи = Π½/Π΄, ΠΊΠ»ΡŽΡ‡ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ = 25, подпись = Π½/Π΄
DER: ΠΊΠ»ΡŽΡ‡ подписи = 106, ΠΊΠ»ΡŽΡ‡ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ = 80, подпись = 55
PEM: signkey=278, verifykey=162 (Π½Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ подписСй PEM)
 

Π˜ΡΡ‚ΠΎΡ€ΠΈΡ

Π’ 2006 Π³ΠΎΠ΄Ρƒ ΠŸΠΈΡ‚Π΅Ρ€ ΠŸΠΈΡ€ΡΠΎΠ½ объявил ΠΎ своСй Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ECDSA Π½Π° чистом Python Π² сообщСниС для sci.crypt, доступноС Π½Π° Π΅Π³ΠΎ сайтС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ. Π’ 2010, Π‘Ρ€Π°ΠΉΠ°Π½ Π£ΠΎΡ€Π½Π΅Ρ€ написал ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΡƒ Π²ΠΎΠΊΡ€ΡƒΠ³ этого ΠΊΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ ΠΈ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅. бСзопаснСС Π² использовании. Π’ 2020 Π³ΠΎΠ΄Ρƒ Π₯ΡŒΡŽΠ±Π΅Ρ€Ρ‚ ΠšΠ°Ρ€ΠΈΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ» Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ эллиптичСского кривая криптография, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π―ΠΊΠΎΠ±ΠΈ, ΡƒΠ»ΡƒΡ‡ΡˆΠ°Ρ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² 20 Ρ€Π°Π·. Π’Ρ‹ просматриваСтС README для этой ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ.

ВСстированиС

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ тСстов, сдСлайтС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

 ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ tox -e
 

На Intel Core i7 4790K @ 4,0 Π“Π“Ρ† Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ тСстов Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠΊΠΎΠ»ΠΎ 18 сСкунд. Π’ Π½Π°Π±ΠΎΡ€Π΅ тСстов ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π³ΠΈΠΏΠΎΡ‚Π΅Π·Π° Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ присущая ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния Π½Π°Π±ΠΎΡ€Π° тСстов.

Одна Ρ‡Π°ΡΡ‚ΡŒ test_pyecdsa.py ΠΈ test_ecdh.py провСряСт ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с OpenSSL, запустив инструмСнт ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки Β«opensslΒ», ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ находится Π² вашСм PATH Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с Π½ΠΈΠΌ (Ссли OpenSSL отсутствуСт, слишком стар ΠΈΠ»ΠΈ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ всС ΠΊΡ€ΠΈΠ²Ρ‹Π΅, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ Π² Π²Ρ‹ΡˆΠ΅ΡΡ‚ΠΎΡΡ‰ΠΈΡ… выпусках, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Π΅ тСсты Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ запуска).

Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ

Π­Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π΅ Π±Ρ‹Π»Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π° с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ бСзопасности. Если Π²Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ, ΠΌΡ‹ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌ Π²Π°ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ Π²ΠΎΠΊΡ€ΡƒΠ³ OpenSSL. pyca/cryptography β€” ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Ρ‚Π°ΠΊΠΈΡ… ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ°. Основной Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ β€” пСрСносная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для тСстированиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ совмСстимости ΠΈ Π² качСствС ΡƒΡ‡Π΅Π±Π½ΠΎΠ³ΠΎ пособия.

Π­Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π΅ Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ ΠΎΡ‚ Π°Ρ‚Π°ΠΊ ΠΏΠΎ сторонним ΠΊΠ°Π½Π°Π»Π°ΠΌ.

НС позволяйтС Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠ°ΠΌ ΠΈΠ·ΠΌΠ΅Ρ€ΡΡ‚ΡŒ, сколько Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρƒ вас ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ Π½Π° Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ ΠΏΠ°Ρ€Ρ‹ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡˆΠΈΡ‚Π΅ сообщСниС. НС позволяйтС Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠ°ΠΌ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ физичСском машина, ΠΊΠΎΠ³Π΄Π° происходит гСнСрация ΠΈΠ»ΠΈ подписаниС ΠΏΠ°Ρ€Ρ‹ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ°ΡˆΠΈΠ½Ρ‹). НС позволяйтС Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠ°ΠΌ ΠΈΠ·ΠΌΠ΅Ρ€ΡΡ‚ΡŒ ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ вашСго ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΈ создании ΠΏΠ°Ρ€Ρ‹ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΈΠ»ΠΈ подписании сообщСния. НС позволяйтС Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠ°ΠΌ для измСрСния радиочастотных ΠΏΠΎΠΌΠ΅Ρ…, исходящих ΠΎΡ‚ вашСго ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° ΠΏΡ€ΠΈ создании ΠΏΠ°Ρ€Π° ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΈΠ»ΠΈ подписаниС сообщСния. ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: простая Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ гСнСрация ΠΏΠ°Ρ€Ρ‹ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ. Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ Π°Ρ‚Π°ΠΊΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ уязвимы для Π°Ρ‚Π°ΠΊ. Для ΠΎΠΏΡ‹Ρ‚Π½ΠΎΠ³ΠΎ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠ°, Π½Π°Π±Π»ΡŽΠ΄Π°ΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ достаточно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ .

Π’Π°ΠΊΠΆΠ΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ любая криптографичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Pure-python Π±ΡƒΠ΄Π΅Ρ‚ уязвима ΠΊ Ρ‚Π΅ΠΌ ΠΆΠ΅ Π°Ρ‚Π°ΠΊΠ°ΠΌ ΠΏΠΎ сторонним ΠΊΠ°Π½Π°Π»Π°ΠΌ. Π­Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Python Π½Π΅ прСдоставляСт бСзопасныС ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ ΠΏΠΎ ΠΏΠΎΠ±ΠΎΡ‡Π½ΠΎΠΌΡƒ ΠΊΠ°Π½Π°Π»Ρƒ (Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ hmac.compare_digest() ), Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ сторонним ΠΊΠ°Π½Π°Π»Π°ΠΌ бСзопасным Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ.

Π­Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° зависит ΠΎΡ‚ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ³ΠΎ источника случайных чисСл. НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π΅Π³ΠΎ Π½Π° систСма Π³Π΄Π΅ os.urandom() Π½Π΅ обСспСчиваСт ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π·Π°Ρ‰ΠΈΡ‚Ρƒ случайныС числа.

Usage

Π’Ρ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚Π΅ с создания SigningKey . Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это для подписи Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Π² Π΄Π°Π½Π½Ρ‹Ρ… Π² Π²ΠΈΠ΄Π΅ строки Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈ получСния подписи (Ρ‚Π°ΠΊΠΆΠ΅ строки Π±Π°ΠΉΡ‚ΠΎΠ²). Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ SigningKey ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π²Π°ΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ VerifyingKey . VerifyingKey ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ подписи, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Π΅Π³ΠΎ ΠΊΠ°ΠΊ строка Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ строка Π±Π°ΠΉΡ‚Π° подписи: ΠΎΠ½Π° Π»ΠΈΠ±ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ True, Π»ΠΈΠ±ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ BadSignatureError .

 ΠΈΠ· ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ecdsa SigningKey
sk = SigningKey.generate() # ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ NIST192p
vk = sk. verifying_key
подпись = sk.sign(b"сообщСниС")
ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Ρ‚ΡŒ vk.verify(подпись, Π±"сообщСниС")
 

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ SigningKey / VerifyingKey связан с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΊΡ€ΠΈΠ²ΠΎΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ NIST192p (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ). Π‘ΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Ρ‹ Π±ΠΎΠ»Π΅Π΅ бСзопасны, Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ для использования ΠΈ приводят ΠΊ Π±ΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡Π°ΠΌ ΠΈ подписям.

 ΠΈΠ· ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ecdsa SigningKey, NIST384p
sk = SigningKey.generate (кривая = NIST384p)
vk = sk.verifying_key
подпись = sk.sign(b"сообщСниС")
ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Ρ‚ΡŒ vk.verify(подпись, Π±"сообщСниС")
 

SigningKey ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сСриализован Π² нСсколько Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ²: самый ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ s=sk.to_string() , Π° Π·Π°Ρ‚Π΅ΠΌ воссоздании Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SigningKey.from_string(s, curve) . Π­Ρ‚Π° краткая Ρ„ΠΎΡ€ΠΌΠ° Π½Π΅ записываСт ΠΊΡ€ΠΈΠ²ΠΎΠΉ, поэтому Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ from_string() Ρ‚Ρƒ ΠΆΠ΅ ΡΠ°ΠΌΡƒΡŽ ΠΊΡ€ΠΈΠ²ΡƒΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ использовали для ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°. ΠšΡ€Π°Ρ‚ΠΊΠ°Ρ Ρ„ΠΎΡ€ΠΌΠ° ΠΊΠ»ΡŽΡ‡Π° подписи Π½Π° основС NIST192p β€” всСго 24 Π±Π°ΠΉΡ‚Ρ‹ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅. Если ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° Ρ‚ΠΎΡ‡ΠΊΠΈ Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Π° ΠΈΠ»ΠΈ Π½Π΅ Π»Π΅ΠΆΠΈΡ‚ Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ кривая, from_string() Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ MalformedPointError .

 ΠΈΠ· ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ecdsa SigningKey, NIST384p
sk = SigningKey.generate (кривая = NIST384p)
sk_string = sk.to_string()
sk2 = SigningKey.from_string (sk_string, кривая = NIST384p)
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (sk_string.hex())
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (sk2.to_string().hex())
 

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: хотя ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ to_string() , ΠΎΠ½ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Ρ‚ΠΈΠΏ Π½Π° самом Π΄Π΅Π»Π΅ Π±Π°ΠΉΡ‚ , «строковая» Ρ‡Π°ΡΡ‚ΡŒ ΠΎΡΡ‚Π°Π»Π°ΡΡŒ ΠΎΡ‚ Python 2.

sk.to_pem() ΠΈ sk.to_der() сСриализуСт ΠΊΠ»ΡŽΡ‡ подписи Π² ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ OpenSSL. Π€Π°ΠΉΠ» PEM выглядит ΠΊΠ°ΠΊ Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΉ Ρ„Π°ΠΉΠ» Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ASCII. "-----BEGIN EC PRIVATE KEY-----" Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ с ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ base64 ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ DER являСтся Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΉ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠΎΠΉ Ρ‚Π΅Ρ… ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…. SigningKey.from_pem()/.from_der() ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ эту ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ. Π­Ρ‚ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ имя ΠΊΡ€ΠΈΠ²ΠΎΠΉ, поэтому Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΡ€ΠΈΠ²ΡƒΡŽ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ дСсСриализатору. Если Ρ„Π°ΠΉΠ» ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½ from_der() ΠΈ from_pem() Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ UnexpectedDER ΠΈΠ»ΠΈ MalformedPointError .

 ΠΈΠ· ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ecdsa SigningKey, NIST384p
sk = SigningKey.generate (кривая = NIST384p)
sk_pem = sk.to_pem()
sk2 = ΠšΠ»ΡŽΡ‡ подписи.from_pem(sk_pem)
# sk ΠΈ sk2 - это ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠ»ΡŽΡ‡
 

Π’Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ VerifyingKey : vk.to_string()/VerifyingKey.from_string() , to_pem()/from_pem() ΠΈ to_der()/from_der() . Π’ΠΎΡ‚ ΠΆΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ curve= Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ VerifyingKey.from_string() .

 ΠΈΠ· ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ecdsa SigningKey, VerifyingKey, NIST384p
sk = SigningKey.generate (кривая = NIST384p)
vk = sk.verifying_key
vk_string = vk.to_string()
vk2 = VerifyingKey.from_string(vk_string, кривая=NIST384p)
# vk ΠΈ vk2 это ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠ»ΡŽΡ‡
ΠΈΠ· ecdsa ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ SigningKey, VerifyingKey, NIST384p
sk = SigningKey.generate (кривая = NIST384p)
vk = sk. verifying_key
vk_pem = vk.to_pem()
vk2 = VerifyingKey.from_pem(vk_pem)
# vk ΠΈ vk2 это ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠ»ΡŽΡ‡
 

БущСствуСт нСсколько способов вычислСния подписи. Π’ ΠΊΠΎΡ€Π½Π΅, ECDSA ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ число, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ подписываСмыС Π΄Π°Π½Π½Ρ‹Π΅, ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ°Ρ€Π° чисСл, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… подпись. АргумСнт hashfunc= для sk.sign() ΠΈ vk.verify() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для прСобразования ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ строки Π² дайдТСст фиксированной Π΄Π»ΠΈΠ½Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‚Π΅ΠΌ прСобразуСтся Π² число, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ECDSA, ΠΈ для подписи, ΠΈ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ hashlib.sha1 , Π½ΠΎ Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ NIST256p ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΠ½Π½ΡƒΡŽ ΠΊΡ€ΠΈΠ²ΡƒΡŽ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ВмСсто hashlib.sha256 .

БущСствуСт Ρ‚Π°ΠΊΠΆΠ΅ нСсколько способов прСдставлСния подписи. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ sk.sign() ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ vk.verify() ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π΅Π³ΠΎ Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΉ строки, для простота ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΡƒΡŽ схСму, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ sk.sign(sigencode=) ΠΈ vk.verify(sigdecode=) Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π•ΡΡ‚ΡŒ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ ecdsa.util , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ здСсь ΠΏΠΎΠ»Π΅Π·Π½Ρ‹.

Π’Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ SigningKey ΠΈΠ· Β«Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ числа», ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°Ρ…, Π³Π΄Π΅ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ согласованныС ΠΊΠ»ΡŽΡ‡ΠΈ подписи ΠΈΠ· ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ сСкрСта, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ‚Ρ€ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π° ΠΈ хотят Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π³Π»Π°Π²Π½Ρ‹ΠΉ сСкрСт. Π’Π°ΠΌ слСдуСт Π½Π°Ρ‡Π½ΠΈΡ‚Π΅ с Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ распрСдСлСнного Π½Π΅ΡƒΠ³Π°Π΄Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ числа ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ с curve.baselen Π±Π°ΠΉΡ‚ΠΎΠ² энтропии, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² ecdsa.util для ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² Ρ†Π΅Π»ΠΎΠ΅ число Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅, Π° Π·Π°Ρ‚Π΅ΠΌ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² SigningKey.from_secret_exponent() , Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

 import os
ΠΈΠ· ecdsa ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ NIST384p, SigningKey
ΠΈΠ· ecdsa. util ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ randrange_from_seed__trytryagain
ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ make_key (Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ число):
  secexp = randrange_from_seed__trytryagain(seed, NIST384p.order)
  Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ SigningKey.from_secret_exponent (secexp, кривая = NIST384p)
seed = os.urandom(NIST384p.baselen) # ΠΈΠ»ΠΈ другая отправная Ρ‚ΠΎΡ‡ΠΊΠ°
sk1a = make_key (Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ число)
sk1b = make_key (Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ число)
# ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: sk1a ΠΈ sk1b - это ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠ»ΡŽΡ‡
ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Ρ‚ΡŒ sk1a.to_string() == sk1b.to_string()
sk2 = make_key(b"2-"+seed) # Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠ»ΡŽΡ‡
ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Ρ‚ΡŒ sk1a.to_string() != sk2.to_string()
 

Π’ случаС, Ссли ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ подписСй, сдСланных ΠΎΠ΄Π½ΠΈΠΌ ΠΊΠ»ΡŽΡ‡, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ значСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° подписи Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ быстрСС. Π’ΠΎΡ‡ΠΊΠ° бСзубыточности наступаСт Π² ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½ΠΎ ΠΎΠΊΠΎΠ»ΠΎ 100 подписСй.

Для выполнСния ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… вычислСний ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ precompute() . Π½Π° экзСмплярС VerifyingKey :

 ΠΈΠ· ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ecdsa SigningKey, NIST384p
sk = SigningKey. generate (кривая = NIST384p)
vk = sk.verifying_key
vk.precompute()
подпись = sk.sign(b"сообщСниС")
ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Ρ‚ΡŒ vk.verify(подпись, Π±"сообщСниС")
 

ПослС Π²Ρ‹Π·ΠΎΠ²Π° precompute() всС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ подписи с этим ΠΊΠ»ΡŽΡ‡ΠΎΠΌ Π±ΡƒΠ΄ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ быстрСС Π² исполнСнии.

Π‘ΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с OpenSSL

Для создания подписСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ срСдствами OpenSSL, ΠΈΠ»ΠΈ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ подписи, созданныС этими инструмСнтами, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅:

 # openssl ecparam -name prime256v1 -genkey -out sk.pem
# openssl ec -in sk.pem -pubout -out vk.pem
# echo "Π΄Π°Π½Π½Ρ‹Π΅ для подписи" > Π΄Π°Π½Π½Ρ‹Π΅
# openssl dgst -sha256 -sign sk.pem -out data.sig data
# openssl dgst -sha256 -verify vk.pem -signature data.sig data
# openssl dgst -sha256 -prverify sk.pem -signature data.sig data
ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ…Π΅Ρˆ-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ
ΠΈΠ· ecdsa ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ SigningKey, VerifyingKey
ΠΈΠ· ecdsa.util ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ sigencode_der, sigdecode_der
с open("vk.pem") как f:
   vk = VerifyingKey.from_pem(f.read())
с open("data", "rb") как f:
   Π΄Π°Π½Π½Ρ‹Π΅ = f. read()
с open("data.sig", "rb") как f:
   подпись = f.read()
ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Ρ‚ΡŒ vk.verify(подпись, Π΄Π°Π½Π½Ρ‹Π΅, hashlib.sha256, sigdecode=sigdecode_der)
с open("sk.pem") как f:
   sk = SigningKey.from_pem(f.read(), hashlib.sha256)
new_signature = sk.sign_deterministic (Π΄Π°Π½Π½Ρ‹Π΅, sigencode = sigencode_der)
с open("data.sig2", "wb") как f:
   f.write (новая_подпись)
# openssl dgst -sha256 -verify vk.pem -signature data.sig2 data
 

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Ссли Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с OpenSSL 1.0.0 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½Π΅ΠΉ sigencode_string ΠΈ sigdecode_string ΠΈΠ· ecdsa.util ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для соотвСтствСнно запись ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ подписСй.

ΠšΠ»ΡŽΡ‡ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ записаны Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ openssl:

 ΠΈΠ· ecdsa import SigningKey, VerifyingKey
с open("sk.pem") как f:
    sk = SigningKey.from_pem(f.read())
с open("sk.pem", "wb") как f:
    f.write(sk.to_pem())
с open("vk.pem") как f:
    vk = VerifyingKey.from_pem(f.read())
с open("vk. pem", "wb") как f:
    f.write(vk.to_pem())
 

Entropy

Для создания ΠΊΠ»ΡŽΡ‡Π° подписи с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SigningKey.generate() трСбуСтся нСкоторая Ρ„ΠΎΡ€ΠΌΠ° энтропия (Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ from_secret_exponent / from_string / from_der / from_pem , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ источника энтропии). По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ источник os.urandom() , Π½ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π²Π΅Π΄Π΅Ρ‚ сСбя Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, os.urandom Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° энтропия = , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. Π­Ρ‚ΠΎΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Ρ… тСстах, Π³Π΄Π΅ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ воспроизводимых Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². 9Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° 0015 ecdsa.util.PRNG здСсь ΡƒΠ΄ΠΎΠ±Π½Π°: ΠΎΠ½Π° Π±Π΅Ρ€Π΅Ρ‚ сСмя ΠΈ Π²Ρ‹Π΄Π°Π΅Ρ‚ сильноС псСвдослучайный ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ· Π½Π΅Π³ΠΎ:

 ΠΈΠ· ecdsa.util import PRNG
ΠΈΠ· ecdsa ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ SigningKey
rng1 = PRNG(b"seed")
sk1 = SigningKey.generate (энтропия = rng1)
rng2 = PRNG(b"seed")
sk2 = SigningKey. generate (энтропия = rng2)
# sk1 ΠΈ sk2 - это ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠ»ΡŽΡ‡
 

Аналогично, для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ подписи ECDSA трСбуСтся случайноС число, ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ подпись Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ (использованиС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Π½ΠΎΠΌΠ΅Ρ€Π° Π΄Π²Π°ΠΆΠ΄Ρ‹ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Ρ€Π°ΡΠΊΡ€Ρ‹Ρ‚ΡŒ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ подписи). ΠœΠ΅Ρ‚ΠΎΠ΄ sk.sign() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ entropy= Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π΅Π΄Π΅Ρ‚ сСбя Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ SigningKey.generate(entropy=) .

Π”Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ подписи

Если Π²Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ SigningKey.sign_deterministic(data) вмСсто .sign(data) , ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ подпись вмСсто случайной. Π—Π΄Π΅ΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΈΠ· RFC6979 для бСзопасного создания ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния k , ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ· Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° ΠΈ подписываСмого сообщСния. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ подписываСтС ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ сообщСниС с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Ρ‚Ρƒ ΠΆΠ΅ подпись (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚ΠΎ ΠΆΠ΅ самоС ΠΊ ).

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΉ вСрсии, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ Π½Π΅ уязвимо для ΠΎΡ‚ΠΊΠ°Π·Ρ‹ источника энтропии.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΏΠ°Ρ€Ρƒ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ NIST192p ΠΈ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ сохранитС ΠΎΠ±Π° Π½Π° диск:

 ΠΈΠ· ecdsa import SigningKey
sk = SigningKey.generate()
vk = sk.verifying_key
с open("private.pem", "wb") как f:
    f.write(sk.to_pem())
с open("public.pem", "wb") как f:
    f.write(vk.to_pem())
 

Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ ΠΊΠ»ΡŽΡ‡ подписи с диска, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π΅Π³ΠΎ для подписи сообщСния (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ SHA-1) ΠΈ Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ подпись ΠΊ диску:

 ΠΈΠ· ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ecdsa SigningKey
с open("private.pem") как f:
    sk = SigningKey.from_pem(f.read())
с open("сообщСниС", "rb") ΠΊΠ°ΠΊ f:
    сообщСниС = f.read()
sig = sk.sign(сообщСниС)
с open("signature", "wb") как f:
    f.Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ (ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒ)
 

Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ ΠΊΠ»ΡŽΡ‡ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, сообщСниС ΠΈ подпись с диска ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ подпись (ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ…ΡΡˆ SHA-1):

 ΠΈΠ· ecdsa import VerifyingKey, BadSignatureError
vk = VerifyingKey.from_pem(open("public.pem").read())
с open("сообщСниС", "rb") ΠΊΠ°ΠΊ f:
    сообщСниС = f.read()
с open("signature", "rb") как f:
    сигнал = f. read()
ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ:
    vk.verify(подпись, сообщСниС)
    ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ "Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ подпись"
ΠΊΡ€ΠΎΠΌΠ΅ BadSignatureError:
    ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ "ΠŸΠ›ΠžΠ₯АЯ ΠŸΠžΠ”ΠŸΠ˜Π‘Π¬"
 

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΏΠ°Ρ€Ρƒ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ NIST521p:

 ΠΈΠ· ecdsa import SigningKey, NIST521p
sk = SigningKey.generate (кривая = NIST521p)
vk = sk.verifying_key
 

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ‚Ρ€ΠΈ нСзависимых ΠΊΠ»ΡŽΡ‡Π° подписи ΠΈΠ· основного Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ числа:

 ΠΈΠ· ecdsa import NIST192p, SigningKey
ΠΈΠ· ecdsa.util ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ randrange_from_seed__trytryagain
def make_key_from_seed (Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, кривая = NIST192p):
    secexp = randrange_from_seed__trytryagain(Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ число, кривая.порядок)
    Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ SigningKey.from_secret_exponent(secexp, кривая)
sk1 = make_key_from_seed("1:%s" % seed)
sk2 = make_key_from_seed("2:%s" % seed)
sk3 = make_key_from_seed("3:%s" % seed)
 

Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ ΠΊΠ»ΡŽΡ‡ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ с диска ΠΈ распСчатайтС Π΅Π³ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠ΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² нСсТатый ΠΈ сТатый Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ (ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π² стандартах X9.62 ΠΈ SEC1):

 ΠΈΠ· ecdsa import VerifyingKey
с open("public.

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *