好的,我知道当程序试图访问不允许访问的内存位置时会发生分段错误。所以,我检查了我的代码以查看是否存在问题,但在我看来,它能够访问所有必需的内存位置,那么为什么会出错?
这就是我所做的:
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include "aes.h"
#include <string.h>
#define CCHMAXPATH 100
void encrypt(const char *fileIn, const char *fileOut, const unsigned char *key);
int main(int argc, char *argv[])
{
unsigned char key[100];
char buffer[CCHMAXPATH];
int i;
srand(time(NULL));
for (i=0; i<argc; i++)
printf("%d: %s\n", i, argv[i]);
aes_init();
snprintf(key,100,"/home/ankita/bin/python/project/encrypt/%s.encrypted", argv[1]);
encrypt(argv[1], key, argv[2]);
return 0;
}
void encrypt(const char *fileIn, const char *fileOut,const unsigned char *key)
{
int i;
aes_encrypt_ctx ctx[1];
unsigned char iv[16]; /* initialisation vector */
unsigned char inBuffer[200], outBuffer[200];
FILE *inFile = fopen(fileIn,"rb");
FILE *outFile = fopen(fileOut, "wb");
/* pick a random initialisation vector */
for(i = 0; i < 16; ++i)
iv[i] = rand() & 0xFF;
fwrite(iv, 1, 16, outFile);
aes_encrypt_key256(key, ctx);
while((i = fread(inBuffer, 1, sizeof(inBuffer), inFile)) > 0)
{
aes_ofb_crypt(inBuffer, outBuffer, i, iv, ctx);
fwrite(outBuffer, 1, i, outFile);
}
aes_ofb_crypt(inBuffer, outBuffer, i, iv, ctx);
fwrite(outBuffer, 1, i, outFile);
fclose(inFile);
fclose(outFile);
}
现在这是命令行发生的事情:
$./amaze /home/ubuntu/Documents/txt/2mb.txt abc
0: ./amaze
1: /home/ubuntu/Documents/txt/2mb.txt
2: abc
Segmentation fault (core dumped)
所以,就像我说的那样,我使用'进行'循环检查,正如预期的那样, argv [1] 是文件路径以及文件名, argv [2] 是关键。那有什么不对?内存的哪一部分无法访问?为什么我仍然会收到“Segmentation fault(core dumped)”?
答案 0 :(得分:1)
首先,你对参数名称感到困惑。您将输出文件名放在名为key
的变量中,并将key
作为fileOut
的{{1}}参数传递,并将encrypt()
传递为argv[2]
参数。这种混乱不会破坏事情,但应该修复。
此外,您通过key
调用粘贴整个绝对路径“/home/ubuntu/Documents/txt/2mb.txt”,导致snprintf
包含key
,这几乎是当然不是你的意图。可能是您的"/home/ankita/bin/python/project/encrypt//home/ubuntu/Documents/txt/2mb.txt.encrypted"
来电失败并返回fopen(fileOut, "rb")
,但您没有查看。
你正在使用NULL
key
,这可能需要256位密钥素材,但是你传入的aes_encrypt_key256
只能保证有效的4个字节({{1} }})。该函数试图从关键参数中拉出32个字节。