weixin_43352534 2018-11-24 11:39 采纳率: 0%
浏览 1418

C语言加密,明文暗文的无规则转化。

让我们选一个英文短语, 称其为密钥字(key word)或密钥短语(key phrase),如HAPPY NEWYEAR,按顺序去掉重复字母和空格得HAPYNEWR。将它依次写在明文字母表之下, 而后再将明文字母表中未在短语中出现过的字母依次写在此短语之后, 就可构造出一个代替表, 如下所示:
明文:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密文:HAPYNEWRBCDFGIJKLMOQSTUVXZ
请编写一个程序,可以通过用户输入密码(一个字符串)生成密码表(即上面的那个表),然后可以对用户输入的明文进行加密。
输入样例:
明文:ILoveHuiwen
输出样例:
密文:BFjtnRsbuni

  • 写回答

2条回答 默认 最新

  • harkbox 2018-11-27 15:13
    关注

    #include
    #include
    #include
    char* mishi(char a[], char b[]);//设置一个函数用来改变密匙.
    char* duizhaobiao(char a);//得到对照表
    char
    miwen(char a[], char b[]);
    int main()
    {
    char ch1[50];
    char ch[100];
    char ch2[27];
    gets(ch);//输入密匙
    char p = mishi(ch, ch1);//得到密匙
    char *p1 = duizhaobiao(p);
    strcpy(ch2, p);
    strcat(ch2, p1);
    printf("该表是对应表%s", ch2);
    printf("请输入明文\n");
    char in[100];
    gets(in);
    miwen(ch2, in);
    getch();
    return 0;
    }
    char
    mishi(char a[], char b[])
    {

    for (int i = 0; i <= strlen(a); i++)
    {
        for (int j = 0; j <= strlen(a); j++)
        if (a[i] == a[j] && i != j)
            a[j] = ' ';
    }
    int j = 0;
    for (int i = 0; i <= strlen(a); i++)//处理空格
    {
        if (a[i] != ' ')
        {
            b[j] = a[i];//用另一个数组保持密匙
            j++;
        }
        else
            continue;
    }
    b[j] = '\0';//使数组b成为字符串。
    return b;
    

    }
    char* duizhaobiao(char a[])
    {

    char ch1[26] = { 0 };//初始化全为0,对照字母表只要重复为1.
    char ch2[25];
    for (int i = 0; i < strlen(a); i++)
    {
        int j = 0;
        for (char ch = 'A'; ch <= 'Z'; ch++)
        {
            if (a[i] == ch)
                ch1[j]++;//参考桶排法.
            else
                j++;
        }
    }
    char ch = 'A';
    int b = 0;
    for (int i = 0; i < 26; i++)
    {
        for (int j = 0; j >= ch1[i]; j--)
        {
            ch2[b] = ch;
            b++;
        }
        ch++;
    }
    ch2[b] = '\0';
    return ch2;
    

    }
    char* miwen(char a[], char b[])
    {
    for (int i = 0; i <= strlen(b); i++)
    {
    int j = 0;
    for (char ch1 = 'A'; ch1 <= 'Z'; ch1++)
    if (b[i] == ch1)
    {
    printf("%c", a[j]);
    }
    else
    j++;
    }

    }
    记住只能大写,如果需要小写使用头文件

    评论

报告相同问题?

悬赏问题

  • ¥15 arduino控制ps2手柄一直报错
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥85 maple软件,solve求反函数,出现rootof怎么办?
  • ¥15 求chat4.0解答一道线性规划题,用lingo编程运行,第一问要求写出数学模型和lingo语言编程模型,第二问第三问解答就行,我的ddl要到了谁来求了
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿