zoukankan      html  css  js  c++  java
  • 仿射密码

    加密函数: Y=(AX+B)%26 
    解密函数: X=(A的逆元)*(Y-B)%26

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<map>
    #include<string>
    using namespace std;
    map<char,int>letter;
    map<int,int>num;
    int numa[20]={1,3,5,7,9,11,15,17,19,21,23,25};
    void init()
    {
        for(int i=0;i<=26;i++)
        {
            char l='a'+i;
            letter[l]=i;
        }
        num[1]=1;
        num[3]=9;num[9]=3;
        num[5]=21;num[21]=5;
        num[7]=15;num[15]=7;
        num[11]=19;num[19]=11;
        num[17]=23;num[23]=17;
        num[25]=25;
    }
    void ac(char s[],int a,int b)
    {
        int len=strlen(s);
        string ans="";
        for(int i=0;i<len;i++)
        {
            int c=letter[s[i]];
            int d=(a*c+b)%26;
            ans+=('a'+d);
        }
        cout<<ans<<endl;
    }
    
    void solve(char s[],int a,int b)
    {
        int len=strlen(s);
        string ans="";
        for(int i=0;i<len;i++)
        {
            int c=letter[s[i]];
            int d=(num[a]*(c-b))%26;
            if(d<0) d+=26;
            ans+=('a'+d);
        }
        cout<<ans<<" "<<"a="<<a<<",b="<<b<<endl;
    }
    
    int main()
    {
        init();
        printf("请输入明文:
    ");
        char s[15000],m[15000];
        scanf("%s",&s);
        int a,b;
        printf("请输入密钥:
    ");
        scanf("%d %d",&a,&b);
        printf("输出密文:
    ");
        ac(s,a,b);
        printf("请输入密文:
    ");
        scanf("%s",m);
        printf("请输入密钥:
    ");
        printf("请输明文:
    ");
        solve(m,a,b);
        system("pause");
        return 0;
    }
  • 相关阅读:
    git 本地仓库操作
    git学习一——Pro-Git
    React Router
    webpack详述
    webpack入门
    折半查找法
    String的常见操作(面试题)
    Java集合(五)—HashMap源码
    Java常见操作符
    Java随机数
  • 原文地址:https://www.cnblogs.com/Tangent-1231/p/10576996.html
Copyright © 2011-2022 走看看