Difference between revisions of "Упражнение 10. Цифров подпис"
From Ilianko
m (Protected "Упражнение 10. DS" ([edit=sysop] (indefinite) [move=sysop] (indefinite))) |
|||
(15 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
− | <code><pre> | + | == Основни понятия == |
− | /* | + | |
+ | Първите три понятия, които трябва да знаем, за да можем да разберем какво представлява сигурността при ползване на цифрови услуги са: идентификация, автентификация и оторизация. | ||
+ | |||
+ | *'''Идентификация''' – Установяване на нашата самоличност. Това е личността, която сме или за която се представяме. Както в реалния свят, така и в цифровия може да използваме фалшива самоличност. Като цифровата самоличност това просто е потребителското име – то е уникална (за организацията, която ни го издава) комбинация от символи и може да служи за достъп до мрежата, компютрите или услугите на тази организация. | ||
+ | *'''Автентификация''' – Удостоверяване на истинността на личността. Това е всичко, което доказва и с което доказваме, че личността, за която се представяме, сме наистина ние. В реалния свят може да представим лична карта или шофьорска книжка, в цифровия може да имаме парола или цифров подпис. | ||
+ | *'''Оторизация''' – Упълномощаване. Потребителят на дадената система има присвоена самоличност. В зависимост от политиката за сигурност и точката на достъп се използват различни методи за автентификация. Следващата стъпка е определяне на нивото и правата на достъп, с които разполага въпросната личност в системата. | ||
+ | |||
+ | |||
+ | == Презентация Цифров/Електронен Подспис == | ||
+ | |||
+ | [http://ilianko.com/images/others/DS.pdf Презентация Цифров/Електронен Подспис] | ||
+ | |||
+ | == Модулна аритметика == | ||
+ | '''Задача 1.''' Да се намери остатъкът на числото 3^256 разделено на 4 ( 3^256%4=?): | ||
+ | |||
+ | |||
+ | '''Задача 2.''' Да се напише програма, която да намира остатъкът на числото 85^256 разделено на 83 ( 85^256%83=?): | ||
+ | |||
+ | == RSA пример == | ||
+ | |||
+ | |||
+ | '''Задача 3.''' Да се тества програмата. Допълнете програмата така, че да генерира и избира автоматично стойност за експонентата на публичния ключ | ||
+ | <code><pre>/*********************************************************************\ | ||
+ | * Title: RSA | ||
+ | * Description: Генериране на ключове, криптиране и декриптиране с RSA | ||
+ | * Edited by: ilianko | ||
+ | * Idea: http://cppgm.blogspot.com/2008/01/rsa-algorithm.html | ||
+ | * | ||
+ | \*********************************************************************/ | ||
#include <stdio.h> | #include <stdio.h> | ||
− | + | #include <unistd.h> | |
+ | |||
+ | int r; // pRivate key exponent | ||
+ | int u; // pUblic key exponent | ||
+ | int phi; // phi(s) = (v-1)*(t-1) - Euler's totient function | ||
+ | long int M; // Message | ||
+ | long int C; // encrypted message | ||
+ | int s; // modulus for both the public and private keys, модул (делител) на ключовете | ||
− | |||
int check() | int check() | ||
{ | { | ||
int i; | int i; | ||
− | for(i=3; | + | if ( u > phi) return 1; |
+ | |||
+ | if ( u%2 == 0) return 1; | ||
+ | |||
+ | for( i=3; i <= u ; i = i+2) | ||
{ | { | ||
− | + | ||
− | + | if(u%i==0 && phi%i==0) return 1; | |
+ | |||
} | } | ||
− | + | ||
return 0; | return 0; | ||
+ | |||
+ | |||
}; | }; | ||
Line 22: | Line 63: | ||
{ | { | ||
int i; | int i; | ||
+ | |||
C = 1; | C = 1; | ||
− | for(i=0;i< | + | for(i=0; i < u; i++) |
− | + | C = C*M%s; // modular arithmetic | |
− | C = C% | + | |
− | printf("\n\ | + | C = C%s; |
+ | printf( "\n\tКодирано число : %ld", C ); | ||
} | } | ||
Line 33: | Line 76: | ||
int i; | int i; | ||
M = 1; | M = 1; | ||
− | for(i=0;i< | + | for(i=0; i < r;i++) |
− | + | M=M*C%s; | |
− | M = M% | + | |
− | printf("\n\ | + | M = M%s; |
+ | printf("\n\tДекодирано число : %ld",M); | ||
} | } | ||
int main() | int main() | ||
{ | { | ||
− | int | + | int v,t; /* Изходящи праметри, избират се две произволни прости числа, |
− | + | * колкото по-големи, толкова "по-изчислителноемко" е разбиването. */ | |
− | printf(" | + | int temp = 0; |
− | scanf("%d%d",& | + | printf("Въведете две прости числа: "); |
− | + | scanf("%d%d",&v,&t); | |
− | phi=( | + | |
− | printf("\n\ | + | s = v*t; // модул на ключовете |
+ | phi=(v-1)*(t-1); // Euler's totient function | ||
+ | |||
+ | printf("\n\t Phi(s)\t= %i", phi); | ||
+ | |||
+ | |||
do | do | ||
{ | { | ||
− | printf("\n\ | + | printf("\n\n Въведете експонента на публичния ключ: "); |
− | scanf("%d",& | + | scanf("%d",&u); |
− | + | }while( check() ); //Проверка дали избраната експонента е относително проста | |
− | } | + | |
− | |||
− | |||
− | + | r = 0; | |
+ | while(temp != 1 ) | ||
{ | { | ||
− | + | r++; | |
− | + | temp = (r*u)%phi; | |
− | } | + | }; |
+ | |||
+ | |||
+ | printf("\n\tПубличен ключ\t: {%d,%d}",u,s); | ||
+ | printf("\n\tЧастен ключ\t: {%d,%d}",r,s); | ||
− | + | printf("\n\nЧисло за криптиране\t: "); | |
− | + | scanf("%ld",&M); | |
− | |||
− | printf("\n\ | ||
− | scanf("% | ||
encrypt(); | encrypt(); | ||
− | printf("\n\ | + | |
− | scanf("% | + | printf("\n\nЧисло за декриптиране\t: "); |
+ | scanf("%ld",&C); | ||
decrypt(); | decrypt(); | ||
− | + | ||
return 0; | return 0; | ||
} | } | ||
</pre></code> | </pre></code> | ||
+ | Цифровият подпис не е [[Упражнение 8. Scanner|сканиран подпис]]. | ||
+ | |||
+ | http://www.bgitsecurity.org/pkcs_gui.html | ||
+ | |||
+ | [[Category:Компютърна периферия]] |
Latest revision as of 18:12, 17 May 2013
Contents
Основни понятия
Първите три понятия, които трябва да знаем, за да можем да разберем какво представлява сигурността при ползване на цифрови услуги са: идентификация, автентификация и оторизация.
- Идентификация – Установяване на нашата самоличност. Това е личността, която сме или за която се представяме. Както в реалния свят, така и в цифровия може да използваме фалшива самоличност. Като цифровата самоличност това просто е потребителското име – то е уникална (за организацията, която ни го издава) комбинация от символи и може да служи за достъп до мрежата, компютрите или услугите на тази организация.
- Автентификация – Удостоверяване на истинността на личността. Това е всичко, което доказва и с което доказваме, че личността, за която се представяме, сме наистина ние. В реалния свят може да представим лична карта или шофьорска книжка, в цифровия може да имаме парола или цифров подпис.
- Оторизация – Упълномощаване. Потребителят на дадената система има присвоена самоличност. В зависимост от политиката за сигурност и точката на достъп се използват различни методи за автентификация. Следващата стъпка е определяне на нивото и правата на достъп, с които разполага въпросната личност в системата.
Презентация Цифров/Електронен Подспис
Презентация Цифров/Електронен Подспис
Модулна аритметика
Задача 1. Да се намери остатъкът на числото 3^256 разделено на 4 ( 3^256%4=?):
Задача 2. Да се напише програма, която да намира остатъкът на числото 85^256 разделено на 83 ( 85^256%83=?):
RSA пример
Задача 3. Да се тества програмата. Допълнете програмата така, че да генерира и избира автоматично стойност за експонентата на публичния ключ
/*********************************************************************\
* Title: RSA
* Description: Генериране на ключове, криптиране и декриптиране с RSA
* Edited by: ilianko
* Idea: http://cppgm.blogspot.com/2008/01/rsa-algorithm.html
*
\*********************************************************************/
#include <stdio.h>
#include <unistd.h>
int r; // pRivate key exponent
int u; // pUblic key exponent
int phi; // phi(s) = (v-1)*(t-1) - Euler's totient function
long int M; // Message
long int C; // encrypted message
int s; // modulus for both the public and private keys, модул (делител) на ключовете
int check()
{
int i;
if ( u > phi) return 1;
if ( u%2 == 0) return 1;
for( i=3; i <= u ; i = i+2)
{
if(u%i==0 && phi%i==0) return 1;
}
return 0;
};
void encrypt()
{
int i;
C = 1;
for(i=0; i < u; i++)
C = C*M%s; // modular arithmetic
C = C%s;
printf( "\n\tКодирано число : %ld", C );
}
void decrypt()
{
int i;
M = 1;
for(i=0; i < r;i++)
M=M*C%s;
M = M%s;
printf("\n\tДекодирано число : %ld",M);
}
int main()
{
int v,t; /* Изходящи праметри, избират се две произволни прости числа,
* колкото по-големи, толкова "по-изчислителноемко" е разбиването. */
int temp = 0;
printf("Въведете две прости числа: ");
scanf("%d%d",&v,&t);
s = v*t; // модул на ключовете
phi=(v-1)*(t-1); // Euler's totient function
printf("\n\t Phi(s)\t= %i", phi);
do
{
printf("\n\n Въведете експонента на публичния ключ: ");
scanf("%d",&u);
}while( check() ); //Проверка дали избраната експонента е относително проста
r = 0;
while(temp != 1 )
{
r++;
temp = (r*u)%phi;
};
printf("\n\tПубличен ключ\t: {%d,%d}",u,s);
printf("\n\tЧастен ключ\t: {%d,%d}",r,s);
printf("\n\nЧисло за криптиране\t: ");
scanf("%ld",&M);
encrypt();
printf("\n\nЧисло за декриптиране\t: ");
scanf("%ld",&C);
decrypt();
return 0;
}
Цифровият подпис не е сканиран подпис.