围栏密码算法c

围栏密码算法c,c,algorithm,memory-management,cryptography,C,Algorithm,Memory Management,Cryptography,我正在用c写一个围栏密码算法,这是为了好玩,也是为了提高我的c编程技能。我有它的小输入短语工作得很好,但由于某种原因,当输入短语是大的 代码如下:(对不起,我无法将其简化为SSCCE,我不知道算法的哪一部分导致了问题) #包括 #包括 #包括 /*函数将字符附加到字符数组*/ 无效附加(字符*s,字符c) { int len=strlen(s); s[len]=c; s[len+1]='\0'; } 内部主(空) { int num_轨道; 对于(num_rails=2;num_rails

我正在用c写一个围栏密码算法,这是为了好玩,也是为了提高我的c编程技能。我有它的小输入短语工作得很好,但由于某种原因,当输入短语是大的

代码如下:(对不起,我无法将其简化为SSCCE,我不知道算法的哪一部分导致了问题)

#包括
#包括
#包括
/*函数将字符附加到字符数组*/
无效附加(字符*s,字符c)
{
int len=strlen(s);
s[len]=c;
s[len+1]='\0';
}
内部主(空)
{
int num_轨道;
对于(num_rails=2;num_rails<6;num_rails++)
{
char*message=“特别是当输入的密码长为cdefghijklmnopqrstuvwxyzblerpblorp时的密码保护”;
int word_len=strlen(消息);
字符*行[num_rails];
char*rails[num_rails];
int len_rails[num_rails];
memset(len_rails,0,num_rails*sizeof(int));
int i,j,k,mod;
int重复;
int period=(2*num_rails)-2;
printf(“%d个字符,%d个轨道:\n”,word\u len,num\u rails);
printf(“\n绘图文本:%s\n”,消息);
/*加密*/
对于(i=0;i-1;j--)
{
len_轨道[j]++;
i++;
}
printf(“\n邮件长度:”);
对于(i=0;i0;j--)
{
if(轨道[j][(i*2)+1])
追加(解密,rails[j][(i*2)+1]);
}
}
printf(“\n已加密:%s\n”,已解密);
printf(“=============================================================\n”);
}
}
它应该编译并运行良好,以便您可以测试它

它应该打印纯文本,然后对其进行加密并打印,然后将加密后的文本解码回纯文本并打印2、3、4、5个轨道,但它应该适用于任意数量的轨道

问题是,如果输入变量“message”对于不同数量的rails超过了一定的大小,那么输出就会变得混乱

例如

2个rails在63个字符处变得混乱

3个rails在64个字符处变得混乱

4个rails在95个字符处变得混乱

5个rails在126个字符处变得混乱

等等

我所能找到的最接近于找出错误的地方是,每当len_rails[]的任何值超过31时,该数量的rails的输出就会被乱码

有人知道为什么会这样吗?这与我如何分配内存有关吗?我已经有一段时间没有做任何C编程了,我的内存处理有点生疏

如果您有任何帮助,我们将不胜感激。

请拨打此热线:

if ((lines[i] = malloc(sizeof(char))) == NULL)
您只为单个字符分配内存,然后尝试使用缓冲区来存储远不止一个
char
数据。将
sizeof(char)
(顺便说一句,始终为1)乘以计划存储在数组中的字符数


记住在结束前释放()内存。

哈哈哈,我是个白痴,对不起,我把它乘以输入长度的一半,结果成功了,再次感谢!您需要声明一些字符串数组,其大小至少为5*126,大于600,因此**字符输入[1024];**依此类推,这取决于最长的字符串将增长到多大。
if ((lines[i] = malloc(sizeof(char))) == NULL)