RSA_generate_key()使用prngd而不是/ dev / random或/ dev / urandom

时间:2013-02-18 07:15:38

标签: c cryptography openssl rsa hp-ux

我想在HP-UX 11.11上使用RSA_generate_key()。但是hp-ux 11.11不提供/ dev / random或/ dev / urandom,所以我需要使用openssl prngd。

请在C代码中告诉我如何使用它。我安装了openssl,可以使用prngd。

$ ls /opt/openssl/prngd/prngd  
/opt/openssl/prngd/prngd

如果您需要更多信息,请与我们联系。

2 个答案:

答案 0 :(得分:3)

注意到prngd使用与EGD相同的界面,请查看找到的here指令。感兴趣的是:

  

在没有/ dev / *随机设备的系统上提供内核的熵

     

或者,可以使用兼容EGD接口的守​​护程序PRNGD。

     

OpenSSL在通过RAND_bytes()请求熵时自动查询EGD,或者如果套接字位于/ var / run / egd-pool,/ dev / egd-pool,则首次通过RAND_status()检查状态或/ etc / egd-pool。

因此,当您运行prngd时,请将其作为prngd /dev/egd-pool或其他替代方案

运行

答案 1 :(得分:2)

prngd通过网络连接模拟“/ dev / random”和“/ dev / urandom”。它支持基于Unix流的域套接字(“/ var / run / egd-pool”)或(如果配置为)或使用TCP端口708或4840的IP(默认值---可以更改)。

因此,在使用Unix域套接字时,它看起来像:

#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>

int devrandom(void)
{
  union 
  {
    struct sockaddr    sa;
    struct sockaddr_un path;
  } location;
  int sock;               

  memset(&location,0,sizeof(location));
  location.path.sun_family = AF_UNIX;
  strcpy(location.path.sun_path,"/var/run/egd-pool");

  sock = socket(AF_UNIX,SOCK_STREAM,0);
  if (sock < 0)
    return -1; 

  if (connect(sock,&location.sa,sizeof(struct sockaddr_un)) < 0)
    return -1;

  return sock;
}

这将返回一个文件描述符,您可以传递给read()以获取随机数据(注意:此代码未经测试)。基于TCP / IP的连接涉及更多,需要将套接字绑定到本地地址并连接到远程地址,但是Internet上有大量关于该类型代码的示例。