5

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

さらに情報が必要な場合はお知らせください。

4

2 に答える 2

3

prngd は EGD と同じインターフェイスを使用することに注意して、ここにある手順を確認してください。興味深い引用は次のとおりです。

カーネルからエントロピーを提供する /dev/*random デバイスのないシステム

あるいは、EGD インターフェース互換のデーモン PRNGD を使用することもできます。

OpenSSL は、ソケットが /var/run/egd-pool、/dev/egd-pool、または /etc にある場合、RAND_bytes() を介してエントロピーが要求されたとき、または RAND_status() を介して初めてステータスがチェックされたときに、自動的に EGD をクエリします。 /egd-プール。

したがって、prngd を実行するときは、次のように実行するprngd /dev/egd-poolか、他の代替手段のいずれかを実行します。

于 2013-02-21T22:33:05.563 に答える
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 ベースの接続はもう少し複雑で、ソケットをローカル アドレスにバインドし、リモート アドレスに接続する必要がありますが、そのタイプのコードの例はインターネット上にたくさんあります。

于 2013-02-21T22:22:28.673 に答える