2013年5月8日水曜日

シーザー暗号・復号・暗号鍵つきプログラムの公開


シーザー暗号プログラムを公開します

このプログラム・ソースが仮に「ango.c」だとすると
端末にて

$ gcc -o ango ango.c
$ ./ango
と実行してください

最初に暗号鍵がランダムに表示されます
暗号鍵を変更するときは
3番を押してください

ふつう入力データーを暗号データーにするときは
1番を押して、入力データーを入れてください

暗号データーを復号するには
2番を押して、暗号データーをいれてください


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define randomize() srand(time(NULL))
#define random(x)   rand()%(x)

int menu();
void cipher();
void decode();
void keymodify();

char tableS[100]="7JjKk8LlZz9XxCcVvBbNnMmQqWw0EeRr1TtYy2UuIi3OoPp4AaSs5DdFf6GgHh!\"#$%&\'()*+,-./:;<=>?@[\\]^_{|}`";
/*空白はscanfで無効*/
char table[100];
int R;

int main(){
   int i,j,k,n=1;
   char t;
   randomize();
   R=random(10000);
   printf("暗号鍵:%d\n",R);
   strcpy(table,tableS);

   srand(R);
   for(i=0;i<3000;i++){
      j=random(92);
      k=random(92);
      t=table[j];
      table[j]=table[k];
      table[k]=t;
   }

   while(n) n=menu();
   return 0;
}

int menu(){
   char t[100];

   printf("0:終了        1:入力データを暗号に  2:暗号データを復号に\n");
   printf("3:暗号鍵の変更    0〜3を入力: ");

   scanf("%s",t);
   if(t[0]=='1') cipher();
   else if(t[0]=='2') decode();
   else if(t[0]=='3') keymodify();
   else{
      printf("プログラムを終了します\n");
      return 0;
   }
   return 1;
}

void cipher(){
   char s[100];
   int i,j,k;

   printf("入力データ: ");
   scanf("%s",s);
   printf("暗号データ: ");

   i=0;
   while(s[i]!='\0'&&s[i]!='\n'&&i<100){
      if('A'<=s[i]&&s[i]<='Z') j=s[i]-'A';
      else if('a'<=s[i]&&s[i]<='z') j=s[i]-'a'+26;
      else if('0'<=s[i]&&s[i]<='9') j=s[i]-'0'+52;
      else if(0x21<=s[i]&&s[i]<=0x2f) j=s[i]-'!'+62;
      else if(0x3a<=s[i]&&s[i]<=0x40) j=s[i]-':'+77;
      else if(0x5b<=s[i]&&s[i]<=0x5f) j=s[i]-'['+84;
      else if(0x7b<=s[i]&&s[i]<=0x7d) j=s[i]-'{'+89;
      else j=92;
      putchar(table[j]);
      i++;
   }
   putchar('\n');
}

void decode(){
   char s[100];
   int i,j,k;

   printf("暗号データ: ");
   scanf("%s",s);
   printf("復号データ: ");

   i=0;
   while(s[i]!='\0'&&s[i]!='\n'&&i<100){
      j=0;
      while(table[j]!=s[i]&&j<92) j++;
      if(0<=j&&j<26) putchar('A'+j);
      else if(26<=j&&j<52) putchar('a'+j-26);
      else if(52<=j&&j<62) putchar('0'+j-52);
      else if(62<=j&&j<77) putchar('!'+j-62);
      else if(77<=j&&j<84) putchar(':'+j-77);
      else if(84<=j&&j<89) putchar('['+j-84);
      else if(89<=j&&j<92) putchar('{'+j-89);
      else putchar('`');
      i++;
   }
   putchar('\n');
}

void keymodify(){
   int i,j,k,rr;
   char t;

   printf("暗号鍵を入力: ");
   scanf("%d",&rr);
   printf("暗号鍵:%d\n",rr);
   strcpy(table,tableS);

   srand(rr);
   for(i=0;i<3000;i++){
      j=random(92);
      k=random(92);
      t=table[j];
      table[j]=table[k];
      table[k]=t;
   }
}

0 件のコメント:

コメントを投稿