首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用本地字母序号代替ascii

如何使用本地字母序号代替ascii
EN

Stack Overflow用户
提问于 2016-05-15 20:53:27
回答 1查看 75关注 0票数 2

如何在加密过程中使用字母顺序而不是ascii表编号?例如,如果我想使用one time pad encryption (text+key)modulo26,它似乎采用ASCII码。我在C语言中尝试了以下内容:

代码语言:javascript
复制
encrypted[i] = (text[i]+key[i])%26 

但是cmd给了我很多问号而不是密文。下面是我的完整代码:

代码语言:javascript
复制
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define clear_buffer while(getchar()!='\n');

char* encrypt(char texte[],char cle[]){
    char *encrypted;
    int i=0;
    texte=texte-'a';
    cle=cle-'a';
    while(texte[i]!='\0' && cle[i]!='\0'){
        encrypted[i]='a'+(texte[i]+cle[i])%26;
        i++;
    }
    encrypted[i+1]='\0';
    return encrypted;   

    }
char* decrypt(char encrypted[],char cle[]){
    char *decrypted;
    int i=0;

    while(encrypted[i]!='\0' && cle[i]!='\0'){
        decrypted[i]=(encrypted[i]-cle[i])%26;
        i++;
    }
    decrypted[i+1]=0;
    return decrypted;

}
int main()
{
    char reponse,texte[100],cle[100],encrypted[100];
    int i=0;

    do{
        printf("Voulez vous crypter ou decrypter un texte?(Ecrire C pour crypter et D pour decrypter)\n");
        scanf("%c",&reponse);
    }while (reponse!='C'&& reponse!='D'&& reponse!='c'&& reponse!='d');//controle pour obliger l'utilisateur à donner c ou d
    if(reponse=='C'||reponse=='c'){
            clear_buffer;//vider le buffer apres le scanf de la reponse
        printf("Donner un texte a crypter\n");
        fgets(texte,100,stdin);
        while(texte[i]!=0)
            i++;
        if (i>0 && texte[i-1]!='\n')
            clear_buffer;
        printf("Donner une cle de meme taille\n");
        fgets(cle,100,stdin);
        i=0;
        while(cle[i]!=0)
            i++;
        if (i>0 && cle[i-1]!='\n')
            clear_buffer;
        printf("Le texte crypte est:%s\n",encrypt(texte,cle));

    }else{
            clear_buffer;//vider le buffer apres le scanf de la reponse
            //do{
        printf("Donner un texte (deja crypte) à decrypter\n");
        fgets(encrypted,100,stdin); 
        i=0;
        while(encrypted[i]!=0)
            i++;
        if (i>0 && encrypted[i-1]!='\n')
            clear_buffer;
        printf("Donner la cle (deja utilisee pour crypter\n");
        fgets(cle,100,stdin);
        i=0;
        while(cle[i]!=0)
            i++;
        if (i>0 && cle[i-1]!='\n')
            clear_buffer;
    //  }while(sizeof encrypted!=sizeof cle);
        printf("Le texte decrypte est:%s\n",decrypt(encrypted,cle));
    }
    system("pause");
    return 0;
}
EN

回答 1

Stack Overflow用户

发布于 2016-05-15 21:11:52

假设您只使用小写字母,您可以减去ascii偏移量,并将文本和密钥转换为0-25之间的值,然后执行加密过程,并在末尾添加偏移量。

代码语言:javascript
复制
text = text - 'a';
key = key - 'a';
char encrypt = 'a' + ( text + key ) % 26

而且在你的代码中,你也没有为2个字符指针分配内存。

代码语言:javascript
复制
char *encrypted = (char*)malloc(100);

char *decrypted = (char*)malloc(100);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37238539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档