Упражнение 10. Цифров подпис

From Ilianko
(Redirected from Упражнение 10. DS)

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

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

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


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

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

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

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