如何使密码更有效率

时间:2015-03-22 05:55:03

标签: c algorithm encryption big-o

我已经编写了铁栅栏密码解码器的代码,提供的输入是轨道数和已编码的文本。然而,解码器工作,它只适用于小输入或短字。如果我尝试输入一个轨道为10的段落,则不显示任何输出。

我仍在努力掌握功能顺序的概念,因此我不确定程序的顺序。如何提高效率或提高效率?

解密功能:

void decrypt(int rail,char *cipher) {
 int length = strlen(cipher);
 int i, j;
 int counter=0,num=0,in=1;

 int railfence[rail][100],count[100];

for(i=0;i < length;i++) 
          count[i]=0;

    for(i=0;i < length;i++){

        if(num + in == rail) in =- 1;

        else if(num + in == -1)in = 1;

        railfence[num][count[num]] = i;
        ++count[num];
        num += in;
    }
char buffer[1000];

for(i=0;i < rail;i++)
    for(j=0;j < count[i];j++){
        buffer[railfence[i][j]] = cipher[counter];
        ++counter;
    }

  buffer[length]='\0';
  printf("%s\n",buffer);
}

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:2)

当您的rail大于邮件长度时,您的每个磁道都有未初始化的字符串长度。您在从0到消息长度的循环中初始化count,但是您应该为每个轨道设置一个长度:

for (i = 0; i < rail; i++)
    count[i] = 0;

该更改应该可以解决您的错误。

您正在使用可变长度数组,并且您知道这些数组的大小。所以没有必要猜测尺寸(并且为了以防万一而使它们足够大)。您可以确定长度:

int zigzag[rail][length / (rail - 1) + 1];
int count[rail];

char buffer[length + 1];

zigzag阵列的内部导轨的两个外部导轨中的字母数量是两倍。考虑到顶部和底部导轨为一个,每个导轨必须最多满足length / (rail - 1) + 1。最后+ 1捕获了分区截止点。)

通过在没有额外的二维数组的情况下遍历消息,可以使算法更有效。使用i2 * (rail - 1 - i)的交替步幅遍历铁路2 * i。你必须注意不要对顶部和底部导轨的字母进行两次处理(当步幅为零时)。

答案 1 :(得分:1)

这应被视为最佳实施的预告片:

if (rail == 0 || rail == railCount - 1) {
    plaintextOffset = rail + offInRail * (iterfreq * 2);
} else {
    if (offInRail % 2 == 0) {
        plaintextOffset = rail + offInRail * iterfreq;
    } else {
        plaintextOffset = railCount - rail - 1 + offInRail * iterfreq;
    }
}

您需要迭代轨道,记住轨道的起始偏移量在密文中。然后你可以迭代轨道中可能的字符,同时测试plaintextOffset是否不是太高。

使用Wikipedia明文作为测试向量的示例输出:

Rails: 3, size 25
CT rail 0 : 0 + 0 = 0 <-> 0 PT
CT rail 0 : 0 + 1 = 1 <-> 4 PT
CT rail 0 : 0 + 2 = 2 <-> 8 PT
CT rail 0 : 0 + 3 = 3 <-> 12 PT
CT rail 0 : 0 + 4 = 4 <-> 16 PT
CT rail 0 : 0 + 5 = 5 <-> 20 PT
CT rail 0 : 0 + 6 = 6 <-> 24 PT
CT rail 0 : 7 + 7 = 14 <-> 28 PT (too high)
CT rail 1 : 7 + 0 = 7 <-> 1 PT
CT rail 1 : 7 + 1 = 8 <-> 3 PT
CT rail 1 : 7 + 2 = 9 <-> 5 PT
CT rail 1 : 7 + 3 = 10 <-> 7 PT
CT rail 1 : 7 + 4 = 11 <-> 9 PT
CT rail 1 : 7 + 5 = 12 <-> 11 PT
CT rail 1 : 7 + 6 = 13 <-> 13 PT
CT rail 1 : 7 + 7 = 14 <-> 15 PT
CT rail 1 : 7 + 8 = 15 <-> 17 PT
CT rail 1 : 7 + 9 = 16 <-> 19 PT
CT rail 1 : 7 + 10 = 17 <-> 21 PT
CT rail 1 : 7 + 11 = 18 <-> 23 PT
CT rail 1 : 19 + 12 = 31 <-> 25 PT (too high)
CT rail 2 : 19 + 0 = 19 <-> 2 PT
CT rail 2 : 19 + 1 = 20 <-> 6 PT
CT rail 2 : 19 + 2 = 21 <-> 10 PT
CT rail 2 : 19 + 3 = 22 <-> 14 PT
CT rail 2 : 19 + 4 = 23 <-> 18 PT
CT rail 2 : 19 + 5 = 24 <-> 22 PT
CT rail 2 : 25 + 6 = 31 <-> 26 PT (too high)
WECRLTEERDSOEEFEAOCAIVDEN
Rails: 3, size 25
CT rail 0 : 0 + 0 = 0 <-> 0 PT
CT rail 0 : 0 + 1 = 1 <-> 4 PT
CT rail 0 : 0 + 2 = 2 <-> 8 PT
CT rail 0 : 0 + 3 = 3 <-> 12 PT
CT rail 0 : 0 + 4 = 4 <-> 16 PT
CT rail 0 : 0 + 5 = 5 <-> 20 PT
CT rail 0 : 0 + 6 = 6 <-> 24 PT
CT rail 0 : 7 + 7 = 14 <-> 28 PT (too high)
CT rail 1 : 7 + 0 = 7 <-> 1 PT
CT rail 1 : 7 + 1 = 8 <-> 3 PT
CT rail 1 : 7 + 2 = 9 <-> 5 PT
CT rail 1 : 7 + 3 = 10 <-> 7 PT
CT rail 1 : 7 + 4 = 11 <-> 9 PT
CT rail 1 : 7 + 5 = 12 <-> 11 PT
CT rail 1 : 7 + 6 = 13 <-> 13 PT
CT rail 1 : 7 + 7 = 14 <-> 15 PT
CT rail 1 : 7 + 8 = 15 <-> 17 PT
CT rail 1 : 7 + 9 = 16 <-> 19 PT
CT rail 1 : 7 + 10 = 17 <-> 21 PT
CT rail 1 : 7 + 11 = 18 <-> 23 PT
CT rail 1 : 19 + 12 = 31 <-> 25 PT (too high)
CT rail 2 : 19 + 0 = 19 <-> 2 PT
CT rail 2 : 19 + 1 = 20 <-> 6 PT
CT rail 2 : 19 + 2 = 21 <-> 10 PT
CT rail 2 : 19 + 3 = 22 <-> 14 PT
CT rail 2 : 19 + 4 = 23 <-> 18 PT
CT rail 2 : 19 + 5 = 24 <-> 22 PT
CT rail 2 : 25 + 6 = 31 <-> 26 PT (too high)
WEAREDISCOVEREDFLEEATONCE

答案 2 :(得分:0)

我对这个算法并不是很熟悉,但是如果你首先找到字符串的长度,然后找到空格的数量(可能使用{{3),你似乎可以节省大量的时间和内存。减去这两个数字,然后用铁路划分(让我们调用结果数字numCols)。然后,您只需创建一个2D char数组,其中包含rails rows和numCols列。通过两个for循环(嵌套在行内的列)按顺序插入字符(确保避免使用空格) 完成后,只需将它们读出来,除了这次,将行循环嵌套在列循环中。