C语言英文文本加密

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言英文文本加密相关的知识,希望对你有一定的参考价值。

1、试着编写一个程序,实现英文文本的加密功能。该程序必须包含以下功能:(1)、通过编写程序在电脑上自动建立一个文件,文件自动命名为你的姓名加学号。(2)、通过程序在建立的文件中输入一段文字。(3)、在程序运行过程中,提示输入加密的密钥(例如输入数字1,或者数字2,或者其他任何数字)后,输入密码(钥)后把文件的文字加密成密文(即:人家看不懂的乱码,如 “I LOVE YOU” 所有字母都按照英文字母顺序后移一位,就变成“J MPWF ZPV”),加密完成程序中提示 “加密成功”(用英文表示)。(4)、还可以附加你认为的其他功能,如果没有可以更多的想法,也可以不做。(注意:这道题分步骤计分,一共三十分,如果你不能完成所有步骤,那就实现一部分功能和步骤也可以得到部分分数)。

#include "stdio.h"

#include <stdlib.h>

int main(int argc,char *argv[])

FILE *fp,*fq;

int k,t;

fp=fopen("AAA12345678901.txt","w+");

if(!fp || (fq=fopen("tmp.txt","w"))==NULL)

printf("Failed to open the file and exit...\\n");

return 0;

printf("Please enter a short passage(letters+space+punctuation,'Enter' end)...\\n");

while((t=getchar())!='\\n')//为文件输入内容

fputc(t,fp);

printf("Please enter the encryption key(int >0)...\\nk=");

while(scanf("%d",&k)!=1 || k<1)//输入加密密钥并判断是否正确

printf("Input error, redo: ");

fflush(stdin);

rewind(fp);

while(t=fgetc(fp),!feof(fp))//加密

if(t>='A' && t<='Z')

fputc(((t-'A')+k)%26+'A',fq);

else if(t>='a' && t<='z')

fputc(((t-'a')+k)%26+'a',fq);

else

fputc(t,fq);

fclose(fp);//关闭原文件

fclose(fq);//关闭加密后的文件

remove("AAA12345678901.txt");//删除原文件

rename("tmp.txt","AAA12345678901.txt");//将加密后的文件更换为原文件名

printf("\\n");

if(fp=fopen("AAA12345678901.txt","r"))

while((t=fgetc(fp))!=EOF)

printf("%c",t);

printf("\\nEncryption success!\\n");

else

printf("\\nFailed to open the encrypted file...\\n");

fclose(fp);

return 0;

代码格式和运行样例图片:

参考技术A

刚好,这学期做了一个DES的加密程序。其中DES算法主体不是我写的,我只写了调用它的部分。

程序开源在Github上,你搜InformationSecurityTechnology就能搜到。

至于你的要求嘛,123点都没有直接达到,不过自己改一改不难的。主要就是第4点,实现了DES的CBC模式加密。

CBC.c:

#include "Common.c"

int CBCEncrypt(Context *con)

    InitScope();
    char buffer[8]; // 因为DES_EncryptBlock允许明文和密文相同,其实也可以直接使用密文数组,但仍需memcpy一次
    for (int i = 0; i < con->length; i += 8)
    
        memcpy(buffer, plaintext + i, 8);
        DES_XOR(buffer, prep, 8);
        DES_EncryptBlock(buffer, subkeys, ciphertext + i);
        prep = ciphertext + i;
    
    memcpy(con->pre, prep, 8);
    return 0;


int CBCDecrypt(Context *con)

    InitScope();
    for (int i = 0; i < con->length; i += 8)
    
        DES_DecryptBlock(ciphertext + i, subkeys, plaintext + i);
        DES_XOR(plaintext + i, prep, 8);
        prep = ciphertext + i;
    
    memcpy(con->pre, prep, 8);
    return 0;


int main(void)

    Run(CBCEncrypt, CBCDecrypt);
    return 0;

Common.c:

#ifndef _DES_c
#define _DES_c
#include "DES.c"
#endif
#include "MakeKeys.c"
#include <assert.h>

typedef struct

    size_t length;
    ElemType plainText[BUFSIZ];
    ElemType cipherText[BUFSIZ];
    ElemType subKeys[16][48];
    ElemType pre[8];
 Context;

#define InitScope()                         \\
    assert(con->length % 8 == 0);           \\
    ElemType *prep = con->pre;              \\
    ElemType *plaintext = con->plainText;   \\
    ElemType *ciphertext = con->cipherText; \\
    ElemType(*subkeys)[48] = con->subKeys

// void SetPre(ElemType pre[8]);
int InitContext(Context *con, const char *pw)

    static_assert(BUFSIZ % 8 == 0, "BUFSIZ is not an integer multiple of eight");

    // TODO: pw长度大于7
    if (strlen(pw) > 7)
    
        perror("pw too long!");
        return 1;
    
    char pwbuffer[7] = 0;
    strncpy(pwbuffer, pw, 7);
    MakeSubKeys(pwbuffer, con->subKeys);
    // SetPre(con->pre);
    memcpy(con->pre, "12345678", 8);

    return 0;


int (*Encrypter)(Context *con);
int (*Decrypter)(Context *con);

#define InitIO(srcf, destf)                  \\
    FILE *srcfile = fopen((srcf), "rb");     \\
    FILE *destfile = fopen((destf), "wb");   \\
    if (srcfile == NULL || destfile == NULL) \\
                                            \\
        perror("File opening failed.");      \\
        return 1;                            \\
    

int DES_Encrypt(char *plainFile, char *keyStr, char *cipherFile)

    InitIO(plainFile, cipherFile);
    Context context;
    InitContext(&context, keyStr);

    while (0 != (context.length = fread(context.plainText, sizeof(char), BUFSIZ - 1, srcfile)))
    
        // context.plainText[context.length++] = '\\0';
        // if (context.length % 8 != 0)
        // 
        //     int rest = 8 - context.length % 8;
        //     memset(context.plainText + context.length, '\\0', rest);
        //     context.length += rest;
        // 

        int rest = 8 - context.length % 8;
        memset(context.plainText + context.length, '\\0', rest);
        context.length += rest;

        assert(context.length % 8 == 0);
        assert(Encrypter != NULL);

        Encrypter(&context);
        fwrite(context.cipherText, sizeof(ElemType), context.length, destfile);
    

    fclose(srcfile);
    fclose(destfile);
    return 0;


int DES_Decrypt(char *cipherFile, char *keyStr, char *plainFile)

    InitIO(cipherFile, plainFile);
    Context context;
    InitContext(&context, keyStr);

    while (0 != (context.length = fread(context.cipherText, sizeof(char), BUFSIZ, srcfile)))
    
        assert(context.length % 8 == 0);
        assert(Decrypter != NULL);

        Decrypter(&context);
        // fwrite(context.plainText, sizeof(ElemType), context.length, destfile);
        // fprintf(destfile, "%s", context.plainText);
        fputs(context.plainText, destfile);
    

    fclose(srcfile);
    fclose(destfile);
    return 0;


int Run(int (*encrypter)(Context *con), int (*decrypter)(Context *con))

    Encrypter = (encrypter);
    Decrypter = (decrypter);
    char *plainfile = "plain.txt";
    char *cipherfile = "cipher.bin";
    char *decreptedfile = "restored.txt";
    char *pw = "1234567";

    DES_Encrypt(plainfile, pw, cipherfile);
    DES_Decrypt(cipherfile, pw, decreptedfile);

    return 0;

MakeKeys.c:

#ifndef _DES_c
#define _DES_c
#include "DES.c"
#endif

int MakeRawKey(const char pw[7], char rawkey[56])

    for (int i = 0; i < 7; i++)
        ByteToBit(pw[i], rawkey + i * 8);
    return 0;


int MakeKey(const char rawkey[56], ElemType key[64])

    for (int i = 0; i < 8; i++)
    
        memcpy(key + 8 * i, rawkey + 7 * i, 7);
        char check = 0;
        for (int j = 8 * i; j < 8 * i + 7; j++)
            check ^= key[j];
        key[8 * i + 7] = check; // 奇数个1时check为1,即偶校验
    
    return 0;


int MakeSubKeys(const char pw[7], ElemType subkeys[16][48])

    char rawkey[56];
    MakeRawKey(pw, rawkey);
    ElemType key[64];
    MakeKey(rawkey, key);
    DES_MakeSubKeys(key, subkeys);
    return 0;


#define GetProperSize(x) ((x) % 8 == 0 ? (x) : ((x) + 8 - (x) % 8))
#define Length(x) (sizeof(x) / sizeof(*x))

// 不需要使用,DES_DecryptBlock中已经反向使用子密钥了
int SwapSubKeys(ElemType subkeys[16][48])

    ElemType temp[48];
    for (int i = 0; i < 8; i++)
    
        memcpy(temp, subkeys[i], Length(temp));
        memcpy(subkeys[i], subkeys[15 - i], 48);
        memcpy(subkeys[15 - i], temp, Length(temp));
    
    return 0;

而DES.c不是我写的,就不发了。要看去Github看。

以上是关于C语言英文文本加密的主要内容,如果未能解决你的问题,请参考以下文章

C 语言文件操作 ( 读文本文件 | 文本加密解密 )

求一个用c语言写的DES加密算法~~

如何用C语言对文件进行加密和解密?急求......................

用c语言写des加密算法

C语言如何写入文本文件

c语言中的openssl aes解密