我一直在使用C和一些加密技术,无论如何我尝试动态分配一个字符串来输入一个纯文本和一个用来获取密文的密钥。程序一直有效,直到我决定释放分配的内存。然后产生一个错误陈述:HEAP CORRUPTION DETECTED:在此地址和此地址的正常阻止(#73)之后;检查了所有其他帖子,没有,我很困惑,请帮忙。这是代码:
int main(int argc, char *argv[])
{
int plainSize = 0;
int keySize = 0;
InputInteger(keySize,"key size");
InputInteger(plainSize,"plaintext size");
char *plaintext = (char*)malloc((plainSize + 1) * sizeof(char));
char *key = (char*)malloc((keySize + 1) * sizeof(char));
char *cypher = (char*)malloc((plainSize + 1) * sizeof(char));
InputString(plaintext, "plaintext");
InputString(key, "key");
cypher=ViginereEncrypt(plaintext, key);
printf("\n%s encypted with Viginere key %s is %s", plaintext, key, cypher);
printf("\n\n");
free(plaintext);
free(key);
free(cypher);
}
char *ViginereEncrypt(char *plaintext,char *key)
{
int i = 0;
char *cypherText = (char*)malloc((strlen(plaintext) + 1)*sizeof(char));
printf("\n%d\n", strlen(plaintext) + 1);
for (i = 0;i < strlen(plaintext);i++)
*cypherText++ =(*plaintext++ - 'A' + *key++ - 'A' -1) % ('Z' - 'A') + 'A';
cypherText[i] = '\0';
return cypherText;
}
void InputInteger(int myInteger,char name [100])
{
printf("Input a number for %s : ",name);
scanf("%d", &myInteger);
}
void InputString(char myString[],char name[100])
{
printf("Input a string for %s : ",name);
scanf("%s", myString);
}
函数内部的分配有问题吗?认为它不应该是因为我复制了#34;该函数的密码返回然后释放它。提前谢谢!
答案 0 :(得分:1)
函数调用InputInteger(keySize,"key size");
无法为keySize
添加值。 keySize
和plainSize
都将保留为0
。因此,您为每个字符串分配1个字节的内存,仅对终结符足够。电脑融化了。
我建议这些更改,首先要传回输入值
void InputInteger(int *myInteger, char name [100]) // add the *
{
printf("Input a number for %s : ", name);
scanf("%d", myInteger); // remove the &
}
然后改变你调用它的方式。
InputInteger(&keySize, "key size"); // add the &
InputInteger(&plainSize, "plaintext size"); // add the &
以便您传递要更改的变量的地址。
编辑:这并不是说代码中没有其他漏洞。字符串长度可能是负数,您应该进行一些输入验证。此外,InputString
功能对恶意攻击或意外故障开放,用户可以说字符串长度为2然后破坏堆栈,一些好奇的大输入接管机器,因为它是可执行代码, perp放在那里偷你的豆子。