ΠΡΠ±ΠΎΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ±Π΅Π΄ΠΈΡΠ΅Π»Ρ Π² ΠΊΠΎΠ½ΠΊΡΡΡΠ΅ ΠΈΠ· ΠΏΡΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π²ΡΠΈΡ ΠΠΠΎΠ½ΡΠ°ΠΊΡΠ΅
ΠΡΠ±ΠΎΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ±Π΅Π΄ΠΈΡΠ΅Π»Ρ Π² ΠΊΠΎΠ½ΠΊΡΡΡΠ΅ ΠΈΠ· ΠΏΡΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π²ΡΠΈΡ ΠΠΠΎΠ½ΡΠ°ΠΊΡΠ΅{{user.first_name}}
{{#if user.paid_date}}({{user.paid_date}}){{/if}}
{{/if}} {{#if !user.first_name}}ΠΡ ΠΎΠ΄ / ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ
{{/if}} Π’Π°ΡΠΈΡΡ ΠΈ ΠΎΠΏΠ»Π°ΡΠ° ΠΠ°Π½Π½ΡΠ΅ ΠΏΠΎ Π»ΡΠ±ΠΎΠΉ ΡΡΡΠ»ΠΊΠ΅ ΠΈΠ· ΠΠ ΠΠΈΠ΄ΠΆΠ΅Ρ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ ΠΠ Π’ΠΎΠΊΠ΅Π½ ΡΠ°ΡΡ.Π’Π°ΡΠ³Π΅Ρ ΠΡΠ»ΡΡΠΈΠ²Π°ΡΠΎΡ
— ΠΏΠ°ΡΡΠ΅Ρ ΠΠΠΎΠ½ΡΠ°ΠΊΡΠ΅ ΠΈ ΠΠ½ΡΡΠ°Π³ΡΠ°ΠΌ
- ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΡΠ±Π΅ΡΠ΅Ρ Π² Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ±Π΅Π΄ΠΈΡΠ΅Π»Ρ Π²Π°ΡΠ΅Π³ΠΎ ΠΊΠΎΠ½ΠΊΡΡΡΠ° ΠΈΠ· ΡΠ΅Ρ , ΠΊΡΠΎ ΠΏΡΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π» Π² Π³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΊ ΠΏΠΎΡΡΡ!
- ΠΠΎΠ»ΠΎΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΠΠΠΠΠ Π±ΡΡΡ ΠΠ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΠΌ!
- ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΡΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°ΡΡ Π² ΠΎΠΏΡΠΎΡΠ΅, ΡΡΠΎΠ±Ρ Π²ΠΈΠ΄Π΅ΡΡ ΡΠ΅Π·Π°Π»ΡΡΠ°ΡΡ!
- ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ±ΠΈΡΠ°ΡΡ ΠΏΠΎΠ±Π΅Π΄ΠΈΡΠ΅Π»Π΅ΠΉ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ· ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ² ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²Π°(ΠΎΡ ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ΄Π΅Π»Π°Π½ ΠΏΠΎΡΡ)
- ΠΡΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π²ΡΡΡΠΏΠ»Π΅Π½ΠΈΠ΅ Π² Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π³ΡΡΠΏΠΏΡ — ΡΠΊΠ°ΠΆΠΈΡΠ΅ ΠΈΡ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ ΠΏΠΎΠ»Π΅(ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ Π² ΡΡΡΠΎΠΊΡ)
- ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΡΠ΅ΠΏΠ΅ΡΡ (ΠΏΠΎ Π½ΠΎΠ²ΠΎΠ²Π²Π΅Π΄Π΅Π½ΠΈΡΠΌ ΠΠ) Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΠΊΡΡΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π’ΠΎΠΊΠ΅Π½ ΡΠ°ΡΡ. ΠΏΡΠ°Π² ΠΈ Π½Π°ΠΆΠ°ΡΡ «Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ»
- ΠΠ»Ρ ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΠΊΡΡΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠΈΠΎΠ±ΡΠ΅ΡΡΠΈ ΡΠ°ΡΠΈΡ
ΠΠ²Π΅Π΄ΠΈΡΠ΅ ΡΡΡΠ»ΠΊΡ Π½Π° ΠΏΠΎΡΡ
ΠΡΠΎΠ²Π΅ΡΡΡΡ Π½Π° Π²ΡΡΡΠΏΠ»Π΅Π½ΠΈΠ΅ Π² Π΄ΡΡΠ³ΠΈΠ΅ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²Π°
{{#if vk_groups_info. view==’repost’}}ΠΡΠ΅Π³ΠΎ ΡΠ΅ΠΏΠΎΡΡΠΎΠ²: {{vk_groups_info.all_reposts}}
Π Π΅ΠΏΠΎΡΡΠΎΠ² ΠΎΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ: {{vk_groups_info.user_reposts}}
ΠΡΠ΅Π³ΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅Π²: {{vk_groups_info.all_reposts}}
ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅Π² ΠΎΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ: {{vk_groups_info.user_reposts}}
ΠΡΠ΅Π³ΠΎ Π»Π°ΠΉΠΊΠΎΠ²: {{vk_groups_info.user_reposts}}
ΠΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π²ΡΠΈΡ
: {{vk_groups_info.total_poll}}
ΠΡΠ±ΠΈΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ· ΠΏΡΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π²ΡΠΈΡ Π·Π° ΠΎΡΠ²Π΅Ρ
ΠΡΠ±ΠΎΠΉ ΠΎΡΠ²Π΅Ρ ΠΎΠΏΡΠΎΡΠ° {{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.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 ΡΠΏΠΎΡΠΎΠ±Π°
ΠΠΎΠ½ΠΊΡΡΡΡ Π² ΡΠΎΡΠΈΠ°Π»ΡΠ½ΡΡ ΡΠ΅ΡΡΡ β ΡΡΠΎ Π½Π΅ΠΎΡΡΠ΅ΠΌΠ»Π΅ΠΌΠ°Ρ ΡΠ°ΡΡΡ ΠΏΡΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ΄ΡΠΊΡΠ°, Π±ΡΠ΅Π½Π΄Π°, ΡΠΎΡΡΠ° Π°ΡΠ΄ΠΈΡΠΎΡΠΈΠΈ ΠΈ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ. ΠΡΠΎΠ²ΠΎΠ΄ΠΈΡΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠ΅ ΠΌΠ΅ΡΠΎΠΏΡΠΈΡΡΠΈΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ, Π½ΠΎ ΠΈ ΠΏΡΠΈΡΡΠ½ΠΎ. ΠΠ»Π°Π²Π½ΠΎΠ΅, ΠΎΡΡΠ°Π²Π°ΡΡΡΡ ΡΠ΅ΡΡΠ½ΡΠΌΠΈ ΠΏΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΏΠΎΠ±Π΅Π΄ΠΈΡΠ΅Π»Π΅ΠΉ. ΠΠ°ΠΊ ΡΠ΄Π΅Π»Π°ΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΠ°Π·Π±Π΅ΡΡΠΌΡΡ Π΄Π°Π»Π΅Π΅ Π² ΡΡΠ°ΡΡΠ΅.
Π‘ΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² VK
- ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² Π² ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΠ΅
- Π‘ΡΠ°ΡΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ Ρ Π·Π°ΠΏΠΈΡΡΡ Π½Π° Π²ΠΈΠ΄Π΅ΠΎ
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² VK
ΠΠΎΠ³ΠΎΡΠΈΠΏ Lucky you!ΠΠ»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΠΎΠ±Π΅Π΄ΠΈΡΠ΅Π»Π΅ΠΉ Π² ΠΊΠΎΠ½ΠΊΡΡΡΠ΅, ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ Π² VK, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠ°ΠΌΡΠΌ ΠΏΡΠΎΡΡΡΠΌ ΠΈ Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ β ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΠ° ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ², ΠΏΠΎΠΌΠΎΠ³Π°ΡΡΠΈΡ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΡΡΠ΅Π³ΠΎ Π²ΠΎΠΏΡΠΎΡΠ°. Π‘ΡΠ΅Π΄ΠΈ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΡ Π²ΡΠ΄Π΅Π»ΡΡΡΡΡ:
- RandomApp. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΡΠΈΡΠ°Π΅ΡΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΠ°ΠΌΡΡ ΠΏΡΠΎΠ³ΡΠ΅ΡΡΠΈΠ²Π½ΡΡ Π² ΠΏΠ»Π°Π½Π΅ Π°Π½Π°Π»ΠΈΡΠΈΠΊΠΈ, ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ, Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ ΡΡΠ»ΠΎΠ²ΠΈΠΉ ΡΡΡΡΠ°. ΠΠ»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ Π²ΡΠ±ΠΎΡΠ° ΠΏΠΎΠ±Π΅Π΄ΠΈΡΠ΅Π»Ρ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠΏΠΈΡΠΎΠΊ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ² ΠΈ Π½Π°ΠΆΠ°ΡΡ ΠΊΠ½ΠΎΠΏΠΊΡ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ. ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π° Π² Π³ΡΡΠΏΠΏΠ΅, ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΡΠ°Π΄ΡΡΡ Π²ΡΠ΅Ρ .
- Lucky you! ΠΡΡ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΠ΅ ΠΈ ΡΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΏΠΎΠΌΠΎΠ³Π°ΡΡΠ΅Π΅ ΡΠΎΠ·Π΄Π°ΡΠ΅Π»ΡΠΌ ΠΊΠΎΠ½ΠΊΡΡΡΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π»ΡΡΡΠ΅Π³ΠΎ ΠΈ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ±Π΅Π΄ΠΈΡΠ΅Π»Ρ. ΠΠΏΡΡΡ ΠΆΠ΅, Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠΏΠΈΡΠΎΠΊ ΠΈ Π½Π°ΠΆΠ°ΡΠΈΠ΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ ΡΠ°Π½Π΄ΠΎΠΌΠΈΠ·Π°ΡΠΈΠΈ. ΠΠ»Ρ ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠΎΠ·Π΄Π°Π½ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π», Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΏΡΠΎΡΠ°ΡΡΠΈΠΉ ΡΠΈΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠΎΠ².
- Π‘Π»ΡΡΠ°ΠΉΠ½ΡΠΉ ΠΏΠΎΠ±Π΅Π΄ΠΈΡΠ΅Π»Ρ Π² ΡΠΎΠ·ΡΠ³ΡΡΡΠ΅ ΠΏΡΠΈΠ·ΠΎΠ² β ΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π΄ΠΎΡΡΠΎΠΉΠ½ΠΎΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ·-Π·Π° Π½Π°Π·Π²Π°Π½ΠΈΡ. Π‘Π΅ΡΠ²ΠΈΡ ΠΌΠ΅Π½Π΅Π΅ ΡΠ°Π·Π²ΠΈΡΡΠΉ, ΡΠ΅ΠΌ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΠΠ, Π½ΠΎ Π΄Π»Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΡ ΠΊΠΎΠ½ΠΊΡΡΡΠΎΠ² ΠΏΠΎΠ΄ΠΎΠΉΠ΄ΡΡ Π½Π° ΠΎΡΠ»ΠΈΡΠ½ΠΎ.
ΠΠ°ΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ ΡΡΠΎ Π½Π΅ Π²ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ. ΠΠ΄Π΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ΄Π΅Π»ΠΈΡΡ 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
, ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ Π±ΠΎΠ»Π΅Π΅ Π±ΡΡΡΡΠΎΠΉ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΠΊΠΈ.
ΠΡΠ±ΡΡ ΠΈΠ· Π½ΠΈΡ
ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΠΎΡΠ»Π΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΡΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ,
ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡ ΠΈΡ
ΠΏΡΠΈΡΡΡΡΡΠ²ΠΈΠ΅ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΈΡ
Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ.
ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠ΅ΡΡΡ 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.