Difference between revisions of "Упражнение 10. Цифров подпис"

From Ilianko
 
(11 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 +
== Основни понятия ==
 +
 +
Първите три понятия, които трябва да знаем, за да можем да разберем какво представлява сигурността при ползване на цифрови услуги са: идентификация, автентификация и оторизация.
 +
 +
*'''Идентификация''' – Установяване на нашата самоличност. Това е личността, която сме или за която се представяме. Както в реалния свят, така и в цифровия може да използваме фалшива самоличност. Като цифровата самоличност това просто е потребителското име – то е уникална (за организацията, която ни го издава) комбинация от символи и може да служи за достъп до мрежата, компютрите или услугите на тази организация. 
 +
*'''Автентификация''' – Удостоверяване на истинността на личността. Това е всичко, което доказва и с което доказваме, че личността, за която се представяме, сме наистина ние. В реалния свят може да представим лична карта или шофьорска книжка, в цифровия може да имаме парола или цифров подпис.
 +
*'''Оторизация''' – Упълномощаване. Потребителят на дадената система  има присвоена самоличност. В зависимост от политиката за сигурност и точката на достъп се използват различни методи за автентификация. Следващата стъпка е определяне на нивото и правата на достъп, с които разполага въпросната личност в системата.
 +
 +
 +
== Презентация Цифров/Електронен Подспис ==
 +
 +
[http://ilianko.com/images/others/DS.pdf Презентация Цифров/Електронен Подспис]
 +
 +
== Модулна аритметика ==
 
'''Задача 1.''' Да се намери остатъкът на числото 3^256 разделено на 4 ( 3^256%4=?):
 
'''Задача 1.''' Да се намери остатъкът на числото 3^256 разделено на 4 ( 3^256%4=?):
  
'''Задача 2.''' Да се намери остатъкът на числото 85^256 разделено на 83 ( 85^256%83=?):
 
  
 +
'''Задача 2.''' Да се напише програма, която да намира остатъкът на числото 85^256 разделено на 83 ( 85^256%83=?):
  
'''Задача 3.''' Да се тества програмата. Допълнете програмата, така че да генерира и избира автоматично стойност за експонентата на публичния ключ
+
== RSA пример ==
<code><pre>
+
 
/*********************************************************************\
+
 
 +
'''Задача 3.''' Да се тества програмата. Допълнете програмата така, че да генерира и избира автоматично стойност за експонентата на публичния ключ
 +
<code><pre>/*********************************************************************\
 
  * Title: RSA
 
  * Title: RSA
 
  * Description: Генериране на ключове, криптиране и декриптиране с RSA  
 
  * Description: Генериране на ключове, криптиране и декриптиране с RSA  
Line 15: Line 31:
  
 
#include <stdio.h>
 
#include <stdio.h>
 +
#include <unistd.h>
  
 
int r; // pRivate key exponent
 
int r; // pRivate key exponent
 
int u; // pUblic key exponent
 
int u; // pUblic key exponent
 
int phi; // phi(s) = (v-1)*(t-1) - Euler's totient function
 
int phi; // phi(s) = (v-1)*(t-1) - Euler's totient function
int M; // Message
+
long int M; // Message
int C; // encrypted message
+
long int C; // encrypted message
 
int s; // modulus for both the public and private keys, модул (делител) на ключовете
 
int s; // modulus for both the public and private keys, модул (делител) на ключовете
  
Line 26: Line 43:
 
int check()
 
int check()
 
{
 
{
   int i, iMax;
+
   int i;
   iMax = ( u > phi) ? u : phi;
+
   if ( u > phi) return 1;
   for( i=3; i < iMax ; i = i+2)
+
 
 +
  if ( u%2 == 0) return 1;
 +
 
 +
   for( i=3; i <= u ; i = i+2)
 
   {
 
   {
 +
 
     if(u%i==0 && phi%i==0) return 1;
 
     if(u%i==0 && phi%i==0) return 1;
 +
 
 
   }
 
   }
 +
 
 
   return 0;
 
   return 0;
 +
 +
 
};
 
};
  
Line 44: Line 69:
 
    
 
    
 
   C = C%s;
 
   C = C%s;
   printf( "\n\tEncrypted keyword : %d", C );
+
   printf( "\n\tКодирано число : %ld", C );
 
}
 
}
  
Line 53: Line 78:
 
   for(i=0; i < r;i++)
 
   for(i=0; i < r;i++)
 
     M=M*C%s;
 
     M=M*C%s;
 +
 
 
   M = M%s;
 
   M = M%s;
   printf("\n\tDecrypted keyword : %d",M);
+
   printf("\n\tДекодирано число : %ld",M);
 
}
 
}
  
Line 62: Line 88:
 
             * колкото по-големи, толкова "по-изчислителноемко" е разбиването. */
 
             * колкото по-големи, толкова "по-изчислителноемко" е разбиването. */
 
   int temp = 0;
 
   int temp = 0;
   printf("Enter Two Prime Numbers\t: ");
+
   printf("Въведете две прости числа: ");
 
   scanf("%d%d",&v,&t);
 
   scanf("%d%d",&v,&t);
 
    
 
    
Line 69: Line 95:
 
    
 
    
 
   printf("\n\t Phi(s)\t= %i", phi);
 
   printf("\n\t Phi(s)\t= %i", phi);
 +
 
 
    
 
    
 
   do
 
   do
 
   {
 
   {
     printf("\n\n Enter public key exponent\t: ");
+
     printf("\n\n Въведете експонента на публичния ключ: ");
 
     scanf("%d",&u);
 
     scanf("%d",&u);
 
   }while( check() ); //Проверка дали избраната експонента е относително проста
 
   }while( check() ); //Проверка дали избраната експонента е относително проста
  
 
    
 
    
   r = 1;
+
   r = 0;
 
   while(temp != 1 )
 
   while(temp != 1 )
 
   {
 
   {
 +
    r++;
 
     temp = (r*u)%phi;
 
     temp = (r*u)%phi;
    r++;
 
 
   };
 
   };
  r--;
 
 
    
 
    
  printf("\n\tPublic Key\t: {%d,%d}",u,s);
 
  printf("\n\tPrivate Key\t: {%d,%d}",r,s);
 
 
    
 
    
   printf("\n\nEnter The Plain Text\t: ");
+
   printf("\n\tПубличен ключ\t: {%d,%d}",u,s);
   scanf("%d",&M);
+
  printf("\n\tЧастен ключ\t: {%d,%d}",r,s);
 +
 
 +
  printf("\n\nЧисло за криптиране\t: ");
 +
   scanf("%ld",&M);
 
   encrypt();
 
   encrypt();
 
    
 
    
   printf("\n\nEnter the Cipher text\t: ");
+
   printf("\n\nЧисло за декриптиране\t: ");
   scanf("%d",&C);
+
   scanf("%ld",&C);
 
   decrypt();
 
   decrypt();
 
    
 
    
 
   return 0;
 
   return 0;
 
}
 
}
</code></pre>
+
</pre></code>
 +
Цифровият подпис не е [[Упражнение 8. Scanner|сканиран подпис]].
 +
 
 +
http://www.bgitsecurity.org/pkcs_gui.html
  
 
[[Category:Компютърна периферия]]
 
[[Category:Компютърна периферия]]

Latest revision as of 18:12, 17 May 2013

Основни понятия

Първите три понятия, които трябва да знаем, за да можем да разберем какво представлява сигурността при ползване на цифрови услуги са: идентификация, автентификация и оторизация.

  • Идентификация – Установяване на нашата самоличност. Това е личността, която сме или за която се представяме. Както в реалния свят, така и в цифровия може да използваме фалшива самоличност. Като цифровата самоличност това просто е потребителското име – то е уникална (за организацията, която ни го издава) комбинация от символи и може да служи за достъп до мрежата, компютрите или услугите на тази организация.
  • Автентификация – Удостоверяване на истинността на личността. Това е всичко, което доказва и с което доказваме, че личността, за която се представяме, сме наистина ние. В реалния свят може да представим лична карта или шофьорска книжка, в цифровия може да имаме парола или цифров подпис.
  • Оторизация – Упълномощаване. Потребителят на дадената система има присвоена самоличност. В зависимост от политиката за сигурност и точката на достъп се използват различни методи за автентификация. Следващата стъпка е определяне на нивото и правата на достъп, с които разполага въпросната личност в системата.


Презентация Цифров/Електронен Подспис

Презентация Цифров/Електронен Подспис

Модулна аритметика

Задача 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;
}

Цифровият подпис не е сканиран подпис.

http://www.bgitsecurity.org/pkcs_gui.html