密码学——乘法密码实现

乘法密码

简介:实现了乘法密码的加密和解密,能够通过功能3输入加密密钥,得到解密密钥。但是具有局限性,只支持26位英文字母。目的是为了体验乘法密码,所有程序的可靠性不做要求。

#include <iostream>
#include <stdio.h>
#include <string.h>
//#include<math.h>
using namespace std;
char mingwen[1000];
char miwen[1000];
//int ke = 5;
//int kd = 21;
void Shouye();
void Jiami();
void Jiemi();
void Find_Kd();
int gcd(int a,int b);
int main()
{
    Shouye();
}
void Shouye()
{
	//首页
    int choice=0;
    printf("------------首页------------\n");
    printf("请选择加密(1)或解密(2)或求密钥Kd(3):");
    scanf("%d",&choice);
    if(choice == 1)
    {
        Jiami();
    }
    else if(choice == 2)
    {
        Jiemi();
    }
    else if(choice == 3)
    {
        Find_Kd();
    }
    else
    {
        printf("输入有误!");
    }
}

void Jiami()
{   //加密函数
    int ke;
    printf("请输入明文:");
    scanf("%s",mingwen);
    printf("请输入加密密钥ke(0<ke<26):");
    scanf("%d",&ke);
    //printf("%s",mingwen);
    int l;
    l = strlen(mingwen);
    //printf("%d",l);
    for(int i = 0;i < l;i++)
    {
        miwen[i] = ((mingwen[i]-96)*ke%26)+96;
    }
    for(int i = 0;i < l;i++)
    {
        printf("%c",miwen[i]);
    }
}

void Jiemi()
{	//解密函数
    int kd;
    printf("请输入密文:");
    scanf("%s",miwen);
     printf("请输入解密密钥kd(0<kd<26):");
    scanf("%d",&kd);
    //printf("%s",miwen);
    int l;
    l = strlen(miwen);
    //printf("%d",l);
    for(int i = 0;i < l;i++)
    {
        mingwen[i] = ((miwen[i]-96)*kd%26)+96;
    }
    for(int i = 0;i < l;i++)
    {
        printf("%c",mingwen[i]);
    }
}

void Find_Kd()
{	//计算解密密钥kd
    printf("输入加密密钥:");
    int ke;
    scanf("%d",&ke);
    int res;
    for(int i=1;i<26;i++)
    {
        //printf("%d,%d\n",i,gcd(26,i));
        if(gcd(26,i)==1)
        {
            if(ke*i%26==1)
                res = i;
        }
    }
    printf("%d",res);
}

int gcd(int a,int b)
{	//求最大公约数
    if(a%b==0) return b;
    return gcd(b,a%b);
}
  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值