C替换密码

时间:2016-12-08 15:04:40

标签: c substitution

我在c中创建替换密码,从文本文件中读取字符并加密它们。但是,当我运行该程序时,文件中的文本未加密。但是,我不确定我到底错过了什么。任何和所有的帮助表示赞赏。

     #include <stdio.h>
     #include <string.h>
     #include <ctype.h>



    void encrypt(char *inchar)
    {
    while (*inchar)
    {

    if (isalpha(*inchar) && isupper(*inchar))
    {

    if (*inchar == 'A') {*inchar = 'G';}
    if (*inchar == 'B') {*inchar = 'H';}
    if (*inchar == 'C') {*inchar = 'B';}
    if (*inchar == 'D') {*inchar = 'I';}
    if (*inchar == 'E') {*inchar = 'A';}
    if (*inchar == 'F') {*inchar = 'L';}
    if (*inchar == 'G') {*inchar = 'U';}
    if (*inchar == 'H') {*inchar = 'F';}
    if (*inchar == 'I') {*inchar = 'P';}
    if (*inchar == 'J') {*inchar = 'J';}
    if (*inchar == 'K') {*inchar = 'K';}
    if (*inchar == 'L') {*inchar = 'T';}
    if (*inchar == 'M') {*inchar = 'V';}
    if (*inchar == 'N') {*inchar = 'M';}
    if (*inchar == 'O') {*inchar = 'M';}
    if (*inchar == 'P') {*inchar = 'O';}
    if (*inchar == 'Q') {*inchar = 'E';}
    if (*inchar == 'R') {*inchar = 'S';}
    if (*inchar == 'S') {*inchar = 'N';}
    if (*inchar == 'T') {*inchar = 'Q';}
    if (*inchar == 'U') {*inchar = 'D';}
    if (*inchar == 'V') {*inchar = 'R';}
    if (*inchar == 'W') {*inchar = 'W';}
    if (*inchar == 'S') {*inchar = 'Z';}
    if (*inchar == 'Y') {*inchar = 'S';}


    }                     
    }
    inchar++;
    }


    int main (void)
    {


    FILE *inputFile;
    char inputBuffer[80];
    char *inputPtr = inputBuffer;
    char inchar;





    inputFile = fopen("code.txt", "r");


    if (inputFile == NULL)
    {
            printf("Failed to open\n");
            return(0);

    }

    while ((inchar = fgetc(inputFile)) != EOF)
    {
            putchar(inchar);
    }

    inputBuffer[strlen(inputBuffer) - 1] = 0;


    encrypt(&inchar);
    putchar(inchar);

    return(0);

}

3 个答案:

答案 0 :(得分:1)

文件没有变化,因为你的程序没有做任何可以改变文件内容的内容。

您所做的只是打印(使用putchar())加密字符,没有文件编写代码。

您应该打开第二个文件进行写入,并在那里写入结果字符。然后,一旦完成,您可以重命名已写入的文件以替换输入。

答案 1 :(得分:0)

你正在做的事情(以及你所要问的)有几个问题。

  1. 您的encrypt功能实际上不是转换密码。移位密码是密钥 K的加密方案; K&lt; alphabet_size 其中每个字母被字母 K 替换为字母表中的字母(环绕)。你对encrypt函数的所作所为更多是一种加密密码。

    例如,使用键6和英文字母的实际移位密码将如下所示:

    char shift_tbl[27] = "GHIJKLMNOPQRSTUVWXYZABCDEF"; // shift cipher with key = 6

  2. 加密方案中的“加密”不起作用。

    • 输出'M'显示两个不同的输入字符
    • 输入'S'
    • 有两种可能的输出
    • 没有处理字符'X''Z'
  3. 您无法将输出写回文件。现在,由于您要用一个其他字符替换每个单个字符,因此在覆盖同一文件时很容易实现。

  4. 这是C中正确的移位密码实现,密钥 K = 6

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    char shift_tbl_u[27] = "GHIJKLMNOPQRSTUVWXYZABCDEF"; 
    char shift_tbl_l[27] = "ghijklmnopqrstuvwxyzabcdef"; 
    char encrypt(char inchar)
    {
            if(isalpha(inchar) && isupper(inchar))
        {
            return shift_tbl_u[inchar-'A'];
        }
        else if(isalpha(inchar) && islower(inchar)) 
        {
            return shift_tbl_l[inchar-'a'];
        }
        return inchar; // non alphabetic = no change;
    }
    
    
    int main (void)
    {
        FILE *fp = fopen("code.txt", "rb+");
        char *buffer = NULL;    
        size_t s_file;
        int i;
    
        if(!fp)
        {
            puts("Could not open code.txt");
            exit(EXIT_FAILURE);
        }
    
        fseek(fp, 0, SEEK_END);
        s_file = ftell(fp);
        rewind(fp);
        buffer = malloc(s_file + 1);
        if(!buffer)
        {
            perror("malloc");
            exit(EXIT_FAILURE);
        }
    
        fread(buffer, 1, s_file, fp);
    
        fseek(fp, 0, SEEK_SET);
    
        for(i = 0; i < s_file; i++)
        {
            char c = encrypt(buffer[i]);
            fwrite(&c, 1, 1, fp);
        }
        free(buffer);
        buffer = NULL;
    
        fclose(fp);
    
        return 0;
    }
    

    使用示例:

    C:\Temp>cl encrypt.c
    Microsoft (R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    encrypt.c
    Microsoft (R) Incremental Linker Version 14.00.24215.1
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    /out:encrypt.exe
    encrypt.obj
    
    C:\Temp>type con > code.txt
    Hello World
    ^Z
    
    C:\Temp>encrypt
    
    C:\Temp>type code.txt
    Nkrru Cuxrj
    
    C:\Temp>
    

    现在,您可以通过加密所有buffer来加速执行此程序,然后再将其写回fp,而不是一次加密和写入一个字符,但是您有一般的想法现在

答案 2 :(得分:0)

您的代码中存在一些错误/错误:

  1. 它不加密任何东西,因为你不打印任何东西,如 有人在评论中说你只打印你读过的字符串。
  2. 您还在加密()中遇到了与while循环的混淆:执行被卡在第一个开始时。 提示:如果您无法找到程序无效的位置,请尝试在执行的不同位置打印消息,这会有很大帮助。
  3. 你不需要所有的循环,只需读取字符串并加密每一个字符(这适用于短句,加密长文本,这种方法可能需要花费太多时间)。
  4. 以下代码有效,它从文件中获取一个字符串,并使用6个字符的简单替换/转置对其进行加密(例如A - > G)。

    注意:您之前的替换将两个不同的字符更改为相同的

    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    
    void encrypt(char inchar)
    {
      //Changing chars
      inchar = inchar + 6; //This is a simple sobstution
    
      //print encrypted char
      printf("%c",inchar);
    }
    
    
    int main(int argc, char** argv[])
    {
        FILE *inputFile;
        char inputBuffer[80];
        char *inputPtr = inputBuffer;
        char inchar;
        int i;
    
        inputFile = fopen("code.txt", "r");
    
        //check file
        if (inputFile == NULL){ 
          printf("Failed to open\n");
          return 0;
        }else{
          //inputFile is valid so I read a string
          //and store it in inputBuffer
          fgets(inputBuffer, 80, inputFile);
    
          //pass every character of inputBuffer to encrypt()
          for(i=0; i<strlen(inputBuffer); i++){
        encrypt(inputBuffer[i]);
          }
    
        }
    
        printf("\n\n");
        return 0;
    }
    

    我没有对字符格式(大写,仅限字母数字,ecc ...)实施任何控制,您可以轻松更改加密算法。