2013-02-18 1 views
5

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

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

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

Сообщите мне, если вам нужна дополнительная информация.

ответ

2

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; 
} 

Это возвращает дескриптор файла можно передать следующим образом() для получения случайных данных (примечание: это код не проверен). Соединение на основе TCP/IP более активно, требуя привязки сокета к локальному адресу и подключения к удаленному адресу, но в этом коде есть много примеров для Интернета.

3

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

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

В качестве альтернативы, ЭГД-интерфейс, совместимого демон PRNGD может быть использовано.

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

Итак, когда вы запускаете prngd, запустить его как prngd /dev/egd-pool или один из других альтернатив

Смежные вопросы