我可以在其他Linux系统上的Linux Mint系统上运行c程序,而不会出现内存访问错误。
void digest_message(const unsigned char *message, size_t message_len, unsigned char **digest, unsigned int *digest_len)
{
EVP_MD_CTX *mdctx;
if((mdctx = EVP_MD_CTX_create()) == NULL)
handleErrors();
if(1 != EVP_DigestInit_ex(mdctx, EVP_sha1(), NULL))
handleErrors();
if(1 != EVP_DigestUpdate(mdctx, message, message_len))
handleErrors();
if((*digest = (unsigned char *)OPENSSL_malloc(EVP_MD_size(EVP_sha1()))) == NULL)
handleErrors();
if(1 != EVP_DigestFinal_ex(mdctx, *digest, digest_len))
handleErrors();
EVP_MD_CTX_destroy(mdctx);
}
void main ()
{
...
const unsigned char *message= (const unsigned char*) decryptedtext;
size_t mlen=x;
unsigned char *digest;
unsigned int dlen;
digest_message(message,mlen,&digest,&dlen);
// if i printf in a for loop i get this memmory access error
for(int i=0;i<dlen;i++)
printf("%x ",digest[i]);
}
我尝试过:
printf("%x ",digest[0]);
printf("%x ",digest[1]);
printf("%x ",digest[2]);
...
没有错误
为什么会这样?我该如何更改?
预先感谢
答案 0 :(得分:-1)
我可以发现以下(潜在)问题。
我可以在Linux Mint上运行c程序而没有问题
我认为这只是一个快乐的巧合,您没有看到这些问题。
const unsigned char *message= (const unsigned char*) decryptedtext;
如果decryptedtext
只是一个指针,那么使用message
进一步访问它是一个坏主意。通常,您应该已分配内存才能访问它。
size_t mlen=x;
理想情况下,mlen
应该与message
的长度有关。如果mlen
大于message
的实际长度,则会遇到麻烦(缓冲区溢出,内存损坏...)。
unsigned int dlen;
如何确保dlen
不大于digest
中可用的条目数?
printf("%x ",digest[i]);
为什么要printf
字符串(digest
)作为十六进制数字?
if(decryptedtext[0]==0x25 && //%
decryptedtext[1]==0x50 && //P
decryptedtext[2]==0x44 && //D
decryptedtext[3]==0x46) //F
{ printf("%s",decryptedtext);
break;
}
这很丑。 decryptedtext
不是以空值结尾的字符串,因此printf()
不会仅输出4个字符。
int x;
f = fopen("test.pdf", "w+b");
if(f == NULL) {
printf("Datei konnte nicht geoeffnet werden.\n");
}else {
while(x<decryptedtext_len) {
putc(decryptedtext[x],f);
x++;
}
x
在使用前未初始化。
unsigned char hasharrayone[20];
unsigned char hasharraytwo[20];
unsigned char hasharraythree[20];
您本可以使用:
unsigned char hasharray[3][20];
int xc;
file = fopen("sxxxxx-dest-cipher.bin", "w+b");
if(file == NULL) {
printf("Datei konnte nicht geoeffnet werden.\n");
}else {
while(xc<cpl) {
putc(cfbciphertext[xc],file);
xc++;
}
xc
未初始化。
答案 1 :(得分:-1)
您使用printf("%x ", digest[i])
有未定义的行为。
如this answer中所述,使用错误的格式说明符会导致未定义的行为。这可能是程序行为取决于运行的操作系统(它也可能取决于硬件和编译器)的原因。
由于我没有收到错误消息,所以很难知道您遇到的情况,但是由于“%x”格式说明符通常与unsigned int
一起使用,因此它应该读取4字节的内存。由于disgest[i]
是unsigned char
,因此它仅以1字节写入,这可能就是为什么出现内存访问错误的原因。
在使用unsigned char
之前将digest[i]
变量unsigned int
转换为printf
应该可以解决您的问题。
此外,this topic应该可以帮助您打印十六进制字符