RSA_generate_key() с использованием prngd вместо /dev/random или /dev/urandom

Я хочу использовать RSA_generate_key() на HP-UX 11.11. Но hp-ux 11.11 не предоставляет /dev/random или /dev/urandom, поэтому мне нужно использовать openssl prngd.

Пожалуйста, дайте мне знать, как использовать его по умолчанию в коде C. У меня установлен openssl и доступен prngd.

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

Дайте мне знать, если вам нужна дополнительная информация.


person Naga    schedule 18.02.2013    source источник


Ответы (2)


Обратите внимание, что prngd использует тот же интерфейс, что и EGD, ознакомьтесь с инструкциями, найденными здесь . Интересная цитата:

В системах без устройств /dev/*random, обеспечивающих энтропию из ядра

В качестве альтернативы можно использовать демон PRNGD, совместимый с интерфейсом EGD.

OpenSSL автоматически запрашивает EGD, когда энтропия запрашивается через RAND_bytes() или статус проверяется через RAND_status() в первый раз, если сокет находится в /var/run/egd-pool, /dev/egd-pool или /etc. /egd-пул.

Поэтому, когда вы запускаете prngd, запускайте его как prngd /dev/egd-pool или один из других вариантов.

person Voider    schedule 21.02.2013

prngd имитирует «/dev/random» и «/dev/urandom» через сетевое соединение. Он поддерживает либо сокет домена на основе потока Unix ("/var/run/egd-pool"), либо (если настроено) или IP с использованием TCP-портов 708 или 4840 (значения по умолчанию --- можно изменить).

Итак, при использовании сокета домена 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 немного более сложное, требующее привязки сокета к локальному адресу и подключения к удаленному адресу, но в Интернете есть множество примеров для такого типа кода.

person Sean Conner    schedule 21.02.2013