密码学——仿射密码实验报告

实验目的及要求

熟练掌握多表古典密码仿射密码加密算法原理及实现

实验设备环境及要求

Windows 7 VC6.0

实验报告实验内容与步骤

基于古典密码中的仿射密码的加解密算法,编写程序进行加解密

创建一个明文信息,再确定k1,k2,编写实现程序,实现加密和解密操作
仿射密码原理使用以下公式来加密一个字母:
E(x) = (ax + b) mod 26
解密仿射密码:
D(x) = a^-1(x - b) mod 26

登录实验场景的操作

新建一个C++ Source File,文件名为fangshe

将下面的代码输入。

```

#include<bits/stdc++.h>

#include <string.h>
#include<conio.h>
int gcd(int a, int b) //辗转相除法求a,b的最大公因数/

{

int k=0;

do

{

k=a%b;

          a=b;

          b=k;

   }while(k!=0);

   return a;
}

int Ni(int a, int b) //求a相对于b的逆/

{

   int i=0;

   while(a*(++i)%b!=1);

   return i;
}

void Affine() //仿射密码/

{

   char c[100];

   int length, i=0, ka=0, kb=0;

   system("cls");

   printf("********仿射密码*********n请输入最初的明文: ");

   gets(c);

   length = strlen(c);

   printf("请输入密钥(两数字):");

   scanf("%d%d", &ka, &kb);

   getchar();

   while(gcd(ka,26)!=1)

   {

          printf("密钥输入错误,请重新输入");

          scanf("%d%d", &ka, &kb);

          getchar();
   }
for(i=0; i<length; i++)
   {
          if(c[i]>96&&c[i]<123)
                 c[i]=(ka*(c[i]-97)+kb)%26+97;
          else if(c[i]>64&&c[i]<91)
                 c[i]=(ka*(c[i]-65)+kb)%26+65;
   }
   printf("n密文为:n%sn", c);
   printf("按任何键返回……");
   getch();
}
void exAffine() //仿射解密/
{
   char c[100];
   int length, i=0, ka=0, kb=0, tmp;
   system("cls");
   printf("********仿射密码********n请输入最初的密文:");
   gets(c);
   length = strlen(c);
   printf("请输入密钥(两数字): ");
   scanf("%d%d", &ka, &kb);
   getchar();
   while(gcd(ka,26)!=1)
   {
          printf("密钥输入错误,请重新输入");
          scanf("%d%d", &ka, &kb);
          getchar();
   }
   for(i=0; i<length; i++)
   {
          if(c[i]>64&&c[i]<91)
          {
                 tmp= Ni(ka, 26)*((c[i]-65)-kb);
                 if(tmp<0)
                        c[i]= tmp%26+26+65;
                 else
                        c[i]= tmp%26+65;
          }
          else if(c[i]>96&&c[i]<123)
          {
          tmp= Ni(ka, 26)*((c[i]-97)-kb);
                 if(tmp<0)
                        c[i]= tmp%26+26+97;
                 else
                        c[i]= tmp%26+97;
          }
   }
   printf("n明文为:n%sn", c);
   printf("按任何键返回……");
   getch();
}
int main()
{
   char i= '0';
   printf("********请按1~3选择:********n");
   printf("1.仿射加密n2.仿射解密n3.退出n");
   i= getch();
   while(i!='3')
   {

          if(i=='1')

                 Affine();

          else if(i=='2')

                 exAffine();

          i=getch();

   }
return 0;

}

实验结果

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值