crypt_r()示例?

时间:2012-02-17 21:38:19

标签: c

这里有人能举例说明如何使用函数crypt_r()?

从手册页中,不清楚返回的char *字符串是指向函数本身内部(在堆中)分配的内存块,还是指向静态内存,如crypt()?

3 个答案:

答案 0 :(得分:6)

来自GNU手册:

  

crypt_r函数与crypt的功能相同,但需要额外的功能   参数包括其结果的空间(等等),所以   它可以是可重入的。 data-> initialized必须先清零   第一次调用crypt_r。

Kernel.org提供了更多详细信息:

  

crypt_r()是crypt()的可重入版本。结构指向   数据用于存储结果数据和簿记信息。   除了分配它之外,调用者应该做的唯一事情   使用这种结构是在数据之前将data->初始化为零   首先调用crypt_r()。

cryptcrypt_r都返回指向加密密码的指针。当然,如果您使用crypt_r,那么内存将位于您传递的crypt_data内。

编辑示例,根据要求:

struct crypt_data data;
data.initialized = 0;

char *enc = crypt_r(key, salt, &data);
printf("EncryptedL %s\n", enc);

答案 1 :(得分:1)

GNU函数的_r版本的重点是使它们可重入(在这种情况下是线程安全的);消除非_r版本使用的内部静态缓冲区并返回指针。

返回的char*指向您分配和传入的数据结构。

答案 2 :(得分:1)

#define _GNU_SOURCE
#include <crypt.h>
#include <stdio.h>

int main(void) {
  struct crypt_data data[1] = {0};
  char *res;

  res = crypt_r("password", "QX", data);
  printf("return value from crypt_r was %s\n", res);
  return 0;
}

在我的系统上使用gcc版本4.6.2进行编译

gcc crypttest.c -lcrypt

结果是

return value from crypt_r was QXZx61KdaYegc