简易的对数据进行加密——C和指针

首先选定一个单词作为密钥,例如TRAILBLAZERS,通过下面的语句去除掉其中重复的字母。

这里默认了输入的全是大写字母。

复制代码
 1 int j = 0;
 2 for (j = 0; j < i; j++)
 3 {
 4     int k = j+1;
 5     for (; k < i; k++)
 6          {
 7         if (key[j] == key[k])          //这里我将重复的元素,用空白字符代替
 8         key[k] = ' ';
 9     }
10 }
11 
12 int index = 0;
13 for (int i = 0; key[i] != '\0'; i++)    //再通过循环将空白字符从数组中排除
14 {
15     if (isspace(key[i]))
16         continue;
17     else
18     {
19         key[index] = key[i];
20         index++;        }
21     }
22 key[index] = '\0'
复制代码

通过上述方法得到:TRAILBZES

其次,我们用同样的方法将26字母表中与上述字母对应的字母删去。

利用strcat()函数,将两者拼接,得到密匙:TRAILBZESCDFGHJKMNOPQUVWXY

所输入的信息,将依据此密匙进行加密,例如字母A,将被加密为T。

表1:A B C D E F G H  I  J K  L M N O P Q R S T U V W X  Y  Z

表2:T R A  I  L B Z  E S C D  F G H J K M N O P Q U V W X Y

例如输入:ATTACK AT DAWN

通过确认字母A在表1的下标,进而搜寻表2中相应下标的元素:T

得出加密信息:TPPTAD TP ITVH

 

 

复制代码
void encrypt(char* data, char const* key)    
{
    int len = strlen(data);
    int ch;

    for (int j = 0; j < len; j++)
    {
        int index = 0;
        if (isalpha(data[j]))
        {   
            ch = toupper(data[j]);
            while (alpha_rel[index] != ch)
                index++;
            if (isupper(data[j]))             //这里是为了还原字母大小,例如输入attACK,那么给出的信息就是tppTAD
                data[j] = key[index];
            else
                data[j] = tolower(key[index]);        
        }
        else
            data[j] = data[j];
    }
}
复制代码

 

 

 

完整代码如下:

复制代码
# include <stdio.h>
# include <ctype.h>
# include <stdlib.h>


char alpha_rel[]= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char alpha[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

int prepare_key(char* key);
void encrypt(char* data, char const* key);
char* s_gets(char* str, int n);

int main()
{
    
    char* key = (char*)malloc(27 * sizeof(char));          //密匙单词
    if (key == NULL)
    {
        puts("Fail to allocate the memory");
        exit(1);
    }

    char encryption[50];  //需要加密的信息

    puts("Enter the key");
    s_gets(key,27);

    prepare_key(key);
    
    puts(key);   //密匙

    puts("Enter your info need to encryption");
    if (s_gets(encryption, 50))
        encrypt(encryption,key);

    puts(encryption);

    free(key);

    return 0;
}

# include <string.h>

int prepare_key(char* key)             //密钥函数
{
    
    if (*key == '\0')
        return -1;

    int i = 0;
    while (key[i] != '\0')
    {
        if (isalpha(*key))
        {
            key[i] = toupper(key[i]);
            i++;
        }
        else
            return -1;
    }

    int j = 0;
    for (j = 0; j < i; j++)
    {
        int k = j+1;
        for (; k < i; k++)
        {
            if (key[j] == key[k])
                key[k] = ' ';
        }
    }

    int index = 0;
    for (int i = 0; key[i] != '\0'; i++)
    {
        if (isspace(key[i]))
            continue;
        else
        {
            key[index] = key[i];
            index++;
        }
    }
    key[index] = '\0';

    int len = strlen(key);
    for (j = 0; j < len; j++)
    {
        int k = 0;
        for (; k < 27; k++)
        {
            if (key[j] == alpha[k])
            {
                alpha[k] = ' ';
                break;
            }

        }
    }

    int new_index = 0;
    for (int pre_index = 0; alpha[pre_index] != '\0'; pre_index++)
    {
        if (isspace(alpha[pre_index]))
            continue;
        else
        {
            alpha[new_index] = alpha[pre_index];
            new_index++;
        }
    }
    alpha[new_index] = '\0';
    
    strcat(key, alpha);

    return 1;
}

void encrypt(char* data, char const* key)        //加密函数
{
    int len = strlen(data);
    int ch;

    for (int j = 0; j < len; j++)
    {
        int index = 0;
        if (isalpha(data[j]))
        {   
            ch = toupper(data[j]);
            while (alpha_rel[index] != ch)
                index++;
            if (isupper(data[j]))
                data[j] = key[index];
            else
                data[j] = tolower(key[index]);
        }
        else
            data[j] = data[j];
    }
}

 char* s_gets(char* str, int n)           //输入函数
{
    char* ret_val;
    int i = 0;
    ret_val = fgets(str, n, stdin);

    if (ret_val)
    {
        while (str[i] != '\n' && str[i] != '\0')
            i++;
        if (str[i] == '\n')
            str[i] = '\0';
        else
            while (getchar() != '\n')
                ;
    }

    return ret_val;
}
复制代码

 

posted @   Tolerieren  阅读(174)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示