首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vigenere密码进入无限循环

问Vigenere密码进入无限循环
EN

Stack Overflow用户
提问于 2015-09-18 21:55:16
回答 2查看 52关注 0票数 0

我最初有一个凯撒的密码,看起来像这样:

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>

int main (int argc, char const *argv[])
{
        printf("Insira a frase:\n");
        char frase [256];
        //strcpy(frase, argv[1]);
        scanf("%s", frase);
        int size = (int)strlen(frase);
        printf("Insira o tamanho da divergência: \n");
        int diff = 0;
        scanf("%i", &diff);
        char fraseout [size+1];
        int i = 0;
        for (i = 0; i<=size-1; i++)
        {
                int val = (int)frase[i];
                if (val + diff > 126)
                {
                        while (val + diff >126)
                        {
                                val = 31+diff-(126-val);
                        }
                }
                else if (val + diff < 32)
                {
                        while (val + diff < 32)
                        {
                                val = 127 + diff+(val-32);
                        }
                }
                else
                {
                        val +=diff;
                }
                fraseout [i] = (char)val;
        }
        fraseout[size] = '\0';
        printf("\"%s\" -> \"%s\"\n", frase, fraseout);
        return 0;
}

然后,我决定将其转换为Vinegere的密码码,其中每个字符的编码数由密码给出,并在单词的长度上迭代。所以,如果我的单词是"abcde“,而我的密码是"zx”,则对(char,diff)将是(a,z)(b,x)(c,z)(d,x).代码如下:

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>

int main(int argc, char const *argv[]) {
        /* code */
        char senha [256];
        if (argv[1] != NULL)
        {
                strcpy(senha, argv[1]);
        }
        char frase [256];
        printf("Insira a frase: \n");
        scanf("%s", frase);
        int sizeS = (int)strlen(senha);
        int sizeF = (int)strlen(frase);
        char fraseout [sizeF+1];
        int i;
        int j;
        for (i=0; i<=sizeF-1; i++)
        {
                if(j>sizeS)
                {
                        j=0;
                }
                int valF = (int)frase[i];
                int valS = (int)senha[i];
                printf(" F = %c = %i \n S = %c = %i\n", frase[i], valF, senha[i], valS);
                if (valF+valS > 126)
                {
                        while (valF+valS >126)
                        {
                                printf("ValF = %i\n", valF);
                                printf("ValS = %i\n", valS);
                                valF = 31 + valS-(valF-126);
                                printf("NewV = %i\n", valF);
                        }
                }
                else if (valF+valS < 32)
                {
                        while (valF+valS<32)
                        {
                                valF = 127 + valS+(valF-32);
                        }
                }
                else
                {
                        valF += valS;
                }
                printf("OUT = %i = %c\n",valF, (char)valF);
                printf("_________________________________\n");
                fraseout[i] = (char)valF;
                j++;
        }
        fraseout[sizeF] = '\0';
        printf("\"%s\" -> \"%s\"\n", frase, fraseout);
        return 0;
}

然而,出于某种原因,这段代码只是在第一个while()语句上进入一个无限循环,我不明白为什么。我怎么才能解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-18 22:23:19

我能看到两个问题:

首先,senha[i]应该是senha[j]。

第二,if (j > sizeS)应该是if (j >= sizeS)。否则,您将尝试访问包含空终止符的senha[sizeS],而不是字符串中的一个字符。

我认为所有用于处理超出打印范围的字符添加的代码都可以替换为:

代码语言:javascript
复制
valF = 32 + ((valF - 32) + (valS - 32)) % (128-32);
票数 2
EN

Stack Overflow用户

发布于 2015-09-18 22:35:36

这是:

代码语言:javascript
复制
while (a + b > 126)
    a = 31 + b - (a-126);

是一个无限循环,当:

代码语言:javascript
复制
a + b = 127  && a < 95    
a + b = 128  && a < 96    
etc.

在a + b = 127和a = 94的情况下,我们得到了a + b的127和129的交替值。对于a = 96,它在127和132之间交替使用,并且这个第二个值只会随着a下降或b上升而上升。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32661622

复制
相关文章

相似问题

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