この文書はRFC2777の日本語訳(和訳)です。 この文書の翻訳内容の正確さは保障できないため、 正確な知識や情報を求める方は原文を参照してください。 翻訳者はこの文書によって読者が被り得る如何なる損害の責任をも負いません。 この翻訳内容に誤りがある場合、訂正版の公開や、 誤りの指摘は適切です。 この文書の配布は元のRFC同様に無制限です。


Network Working Group                                    D. Eastlake 3rd
Request for Comments: 2777                                      Motorola
Category: Informational                                    February 2000


              Publicly Verifiable Nomcom Random Selection
                   公的に証明可能なNomcomランダム選択

Status of this Memo
この文書の状態



   This memo provides information for the Internet community.  It does
   not specify an Internet standard of any kind.  Distribution of this
   memo is unlimited.
   このメモはインターネット共同体のための情報を供給します。これはインター
   ネット標準を指定しません。このメモの配布は無制限です。

Copyright Notice
著作権表示

   Copyright (C) The Internet Society (2000).  All Rights Reserved.

Abstract
概要

   This document describes a method for making random selections in such
   a way that the unbiased nature of the choice is publicly verifiable.
   As an example, the selection of the voting members of the IETF
   Nominations Committee from the pool of eligible volunteers is used.
   Similar techniques would be applicable to other cases.
   この文書は選択の公平な性質が公的に証明可能である方法でランダムに選択
   をする方法を記述します。例として、適格なボランティアの集まりからのI
   ETF指名委員会の投票メンバーの選択で使われます。類似のテクニックは
   他の場合に応用できるでしょう。

Acknowledgement
謝辞

   Matt Crawford made major contributions to this document.
   マット・クロウフォードはこの文書に主要な貢献をしました。

Table of Contents
目次

   1. Introduction
   1. はじめに
   2. General Flow of a Publicly Verifiable Process
   2. 公的に証明可能な手順の一般的な流れ
   2.1 Determination of the Pool
   2.1 候補者決定
   2.2 Publication of the Algorithm
   2.2 アルゴリズムの発表
   2.3 Publication of Selection
   2.3 選択公開
   3. Randomness
   3. 乱雑さ
   3.1 Sources of Randomness
   3.1 乱雑情報源
   3.2 Skew
   3.2 ゆがみ
   3.3 Entropy Needed
   3.3 必要なエントロピー
   4. A Suggested Precise Algorithm
   4. 提案された正確なアルゴリズム
   5. Fully Worked Example
   5. 完全な仕事の例
   6. Security Considerations
   6. セキュリティ考慮
   7.  Reference Code
   7.  参照コード
   Appendix: History of NomCom Member Selection
   付録:NomComメンバー選択の歴史
   References
   参考文献
   Author's Address
   著者のアドレス
   Full Copyright Statement
   著作権表示全文


1. Introduction
1. はじめに

   Under the IETF rules, each year 10 persons are randomly selected from
   among the eligible persons who volunteer to be the voting members of
   the nominations committee (NomCom) to nominate members of the
   Internet Engineering Steering Group (IESG) and the Internet
   Architecture Board (IAB) [RFC 2727].  The number of eligible
   volunteers in recent years has varied in the approximate range of 40
   to 60.
   IETF規則下で、インターネット管理運営グループ(IESG)とインター
   ネットアーキテクチャ委員会(IAB)[ RFC 2727]のメンバーを推薦
   するために指名委員会(NomCom)の投票メンバーに、各年10人の人
   々が適格なボランティアの人々の間からランダムに選択されます。近年の適
   格なボランティアの数はおよそ40から60の範囲です。

   It is highly desireable that the random selection of the voting
   NomCom be done in a unimpeachable fashion so that no reasonable
   charges of bias or favoritism can be brought.  This is for the
   protection of the IETF from bias and protection of the administrator
   of the selection (currently, the appointed non-voting NomCom chair)
   from suspicion of bias.
   NomCom投票のランダム選択は、偏見やえこひいきの合理的な申し立て
   が発生することができないように、非の打ちどころがない方法でされるのは
   大いに望ましいです。これはIETFを偏見から保護するのと、選択管理者
   (現在は、投票権がない任命されたNomCom議長)を偏見の嫌疑から保
   護するためです。

   A method such that public information will enable any person to
   verify the randomness of the selection meets this criterion.  This
   document gives an example of such a method.
   公共の情報を使うことで、どんな人でも選択のランダムさを確かめられる方
   法がこの基準を満たします。この文書はこのような方法の例を与えます。

2. General Flow of a Publicly Verifiable Process
2. 公的に証明可能な手順の一般的な流れ

   In general, a selection of NomCom members publicly verifiable as
   unbiased or similar selection could follow the three steps given
   below.
   一般に、公平、あるいは類似の選択として、公的に証明可能なNomCom
   メンバの選択が下記の3ステップに従うことでできます。

2.1 Determination of the Pool
2.1 候補者決定

   First, you need to determine the pool from which the selection is to
   be made.
   最初に、あなたは選択を行う元になる候補者を決定する必要があります。

   Volunteers are solicited by the appointed (non-voting) NomCom chair.
   Their names are then passed through the IETF Secretariat to check
   eligibility.  (Current eligibility criteria relate to IETF meeting
   attendance, records of which are maintained by the Secretariat.)  The
   full list of eligible volunteers is made public early enough that
   there is a reasonable time to resolve any disputes as to who should
   be in the pool, probably a week to ten days before the selection.
   ボランティアが任命された(投票権がない)NomCom議長によって要請
   されます。それらの名前はIETF事務局の資格検査を通してに渡されます。
   (現在の資格基準はIETFミーティング出席、事務局によって持続される
   記録に関連しています。)適格なボランティアの完全なリストは、選択の前
   に誰が候補者であるべきかについてどんな論争でも解決する合理的な時間が
   あるほど十分に早く、恐らく1週間から10日前に、公にされます。

2.2 Publication of the Algorithm
2.2 アルゴリズムの発表

   The exact algorithm to be used, including the public future sources
   of randomness, is made public.  For example, the members of the final
   list of eligible volunteers are ordered by publicly numbering them,
   several public future sources of randomness such as government run
   lotteries are specified, and an exact algorithm is specified whereby
   eligible volunteers are selected based on a strong hash function [RFC
   1750] of these future sources of randomness.
   使われる厳密なアルゴリズムは、ランダムさの元になる未来の公共の情報を
   含めて、公表にされます。例えば、適格なボランティアの最終のリストのメ
   ンバーは公的番号で並べられる、政府の行う抽選のようないくつかの乱雑さ
   公共の未来の情報源が指定され、そしてこれらの未来の乱雑さ情報源の強い
   ハッシュ関数[RFC 1750]に基づいて適格なボランティアを選択する厳密なア
   ルゴリズムが指定されます。


2.3 Publication of Selection
2.3 選択公開

   When the prespecified sources of randomness produce their output,
   those values plus a summary of the execution of the algorithm for
   selection should be announced so that anyone can verify that the
   correct randomness source values were used and the algorithm properly
   executed.  A cut off time for any complaint that the algorithm was
   run with the wrong inputs or not faithfully executed should be
   specified to finalize the output and provide a stable NomCom.
   乱雑さの事前指定情報源が出力を作り出す時、それらの値と選択のアルゴリ
   ズムの実行結果が、だれもが乱雑さの正しい情報源が使われ、そしてアルゴ
   リズムが正確に実行したことを確かめることができるように、発表されるべ
   きです。アルゴリズムが間違った入力で動作したか、あるいは誠実に実行さ
   れなかったことへの苦情のための、分離時間が出力を完成させ、NomCo
   mの安定供給をするために指定されるべきです。

3. Randomness
3. 乱雑さ

   The crux of the unbiased nature of the selection is that it is based
   exactly on random information which will be revealed in the future
   and thus can not be known to the person specifying the algorithm by
   which that random information will be used to select the NomCom
   members.   The random information must be such that it will be
   publicly revealed in a timely fashion.
   選択の公平な性質要点は、正確に将来明らかにされるランダム情報に基き、
   そしてそのランダム情報がNomComメンバーを選ぶために使われるアル
   ゴリズムを指定している人に知られていないということです。ランダム情報
   はそれがタイムリーな方法で公的に明らかにされなければなりません。

   The random sources should not include anything that any reasonable
   person would believe to be under the control or influence of the IETF
   or its components, such as IETF meeting attendance statistics,
   numbers of documents issued, or the like.
   ランダムな情報源は、合理的な人がIETFやその構成要素の制御や影響下
   にあると信じるかもしれないもの、例えばIETFミーティング出席統計値
   や、出版文書数などを含むべきではありません。

3.1 Sources of Randomness
3.1 乱雑情報源

   Examples of good information to use are lottery winning numbers for
   specified runnings of specified lotteries.  Particularly for
   government run lotteries, great care is usually taken to see that
   they produce random quantities.  Even in the unlikely case one were
   to have been rigged, it would almost certainly be in connection with
   winning money in the lottery, not in connection with IETF use.
   使うべき良い情報の例は指定された抽選の指定された実行の抽選の勝数です。
   特に政府実行抽選の、大きい注意が乱数を作り出すために通常とられます。
   ありそうもない場合で1つが不正に操作された場合も、それはIETFの使
   用に関連してではなく、抽選でほとんど確実に勝利金を得るためでしょう。

   Other possibilities are such things as the closing price of a stock
   on a particular day, daily balance in the US Treasury on a specified
   day, the volume of trading on the New York Stock exchange on a
   specified day, etc. (However, the reference code given below will not
   handle integers that are too large.) Sporting events can be used but
   only with care to specify exactly what quantities are being presumed
   random and what will be done if they are cancelled or delayed.
   他の可能性は特定の日の株の終値、指定された日の合衆国財務省債券の日残
   高、指定された日にニューヨーク株式取引所の取引量などです。(しかしな
   がら、下に与えられた参考コードはあまりにも大きい整数を処理しないでしょ
   う。)スポーツイベントも使えますが、しかし正確に何の量が擬似乱数と見
   なせるか、そしてもし中止や延期されるならどうすか、を明示する注意がひ
   つようです。

   It is important that the last source of randomness, chronologically,
   produce a substantial amount of the entropy needed.  If most of the
   randomness has come from the earlier of the specified sources, and
   someone has even limited influence on the final source, they might do
   an exhaustive analysis and exert such influence so as to bias the
   selection in the direction they wanted.  Thus it is best for the last
   source to be an especially strong and unbiased source of a large
   amount of randomness such as a government run lottery.
   乱雑の最後の情報源が、時系列に、必要とされるエントロピーの相当な量を
   作り出すことは重要です。もし乱雑の大部分が指定された情報源の過去の状
   況から来て、そして誰かが最終の情報源上に限定された影響力を持っている
   なら、彼らは徹底的な分析をして、そして彼らが欲した方向に選択をゆがめ
   るように影響を及ぼすかもしれません。それで大きい量の政府実行抽選のよ
   うな乱雑さの特に強く、そして公平な情報源であることは最後の源にとって
   最も良いです。

   It is best not to use too many different sources.  Every additional
   source increases the probability that it might be delayed or
   cancelled calling into play contingency plans or, worst of all,
   possibly creating a situation that was not anticipated.  This would
   either require arbitrary judgement by the Nomcom chair, defeating the
   randomness of the selection, or a re-run with a new set of sources,
   causing much delay.  Probably a good number of sources is three.
   あまりに多くの異なった情報源を使わないことは最も良いです。すべての追
   加の情報源が偶発的な事で延期や中止になる可能性があり、最悪、予期でき
   ない状態を作る可能性があります。これは選択のランダムさを破ってNom
   Com議長の独断的な判断を必要とするか、多くの遅れを起す情報源の新し
   い選択が必要でしょう。恐らく情報源の良い数が3です。

3.2 Skew
3.2 ゆがみ

   Many of the sources of randomness suggested above produce data which
   is not uniformly distributed.  This is certainly true of stock prices
   and horse race results, for example.  However, use of a strong mixing
   function [RFC 1750] will extract the available entropy and produce a
   hash value whose bits, remainder modulo a small divisor, etc., are
   uniformly distributed.
   上で示唆した乱雑さの情報源の多くが一様分布でないデータを生成します。
   これは例えば株価と競馬結果で確かに本当です。しかしながら、強い混合関
   数[RFC 1750]の使用が利用可能なエントロピーを引きだし、残りの小さい数
   でモジュロなどが、一様分布のハッシュ値を生成するでしょう。

3.3 Entropy Needed
3.3 必要なエントロピー

   What we are doing is selection N items without replacement from a
   population of P items.  The number of different ways to do this is as
   follows, where "!" represents the factorial function:
   我々がしていることはP個の項目からの順不動のN個の項目選択です。この
   結果の可能な数は以下です、「!」は階乗関数です:

                                    P!
                               -------------
                               N! * (P - N)!

   To do this in a completely random fashion requires as many random
   bits as the logarithm base 2 of that quantity.  Some sample
   calculated approximate number of random bits for the selection of 10
   nomcom members from various pool sizes is given below:
   完全にランダムな方法でこれをするには、この量の2を基とした対数ぐらい
   の数のランダムビットを必要とします。種々な候補者サイズからの10人の
   nomcomメンバーの選択に必要なランダムビットの計算されたおよその数の例
   が以下です:

                  Random Selection of Ten Items From Pool

   Pool size     20   25   30   35   40   50   60   75  100
   Bits needed   18   22   25   28   30   34   37   40   44

   Using an inadequate number of bits means that not all of the possible
   selections would be available.  For a substantially inadequate amount
   of entropy, there would be substantial correlations between the
   selection of two members of the pool, for example.  However, as a
   practical matter, for pool sizes likely to be encountered in IETF
   nomcom membership selection, 40 bits of entropy should always be
   adequate.  Even if there is a large pool and theoretically more bits
   are needed for complete randomness, 40 bits of entropy will assure
   that the probability of selection of each pool member differs from
   that of other pool members, the correlation between the selection of
   any pair of pool members, etc., differs only insignificantly from
   that for completely random selection.
   不適当なビット数を使うことは可能な選択のすべてが利用可能ではないこと
   を意味します。不適当な量のエントロピーでは、例えば、候補者の2人のメ
   ンバーの選択の間に相当な相互関係があるでしょう。しかしながら、実際的
   な問題として、IETFのnomcomメンバー選択で遭遇する可能性が高い候補
   者サイズのためのエントロピーは40ビットが常に適切であるべきです。た
   とえ大きい候補者サイズで、そして理論的にもっと多くのビットが完全な乱
   雑さのために必要とされるとしても、40ビットのエントロピーは、対の候
   補者の選択の間の相互関係とは違い、それぞれの候補者の選択の可能性が他
   の候補者の選択の可能性と、完全なランダムな選択と比べて、わずかに違う
   ことを確実にするでしょう。

   An MD5 [RFC 1321] hash has 128 bits and therefore can produce no more
   than that number of bits of entropy.  However, this is three times
   what is likely to ever been needed for IETF nomcom membership
   selection.
   MD5[RFC 1321]ハッシュが128ビットを持ち、そしてそのエントロピー
   のビットの数以上の何も引き起こすことができません。しかしながら、これ
   は3回、IETFのnomcomメンバー選択に必要なものの有望した。

4. A Suggested Precise Algorithm
4. 提案された正確なアルゴリズム

   It is important that a precise algorithm be given for mixing the
   random sources specified and making the selection based thereon.
   Sources suggested above each produce either a single positive number
   (i.e., closing price for a stock) or a small set of positive numbers
   (many lotteries provide 6 numbers in the range of 1 through 40 or the
   like, a sporting event could produce the scores of two teams, etc.).
   A sample precise algorithm is as follows:
   指定されたランダムな情報源を混ぜて、それに基づいて選択をする、正確な
   アルゴリズムが与えられることは重要です。上に提案された情報源がそれぞ
   れがひとつの正の数(例えば、株の終値)や、正数の小さい集合を作り出し
   ます(多くの抽選で1から40までの範囲の6つの数を供給、スポーツのイ
   ベントが2つのチームの得点を引き起こす、など)。正確なアルゴリズムの
   サンプルが次の通りです:

   For each source producing multiple numeric values, represent each as
   a decimal number terminated by a period (or with a period separating
   the whole from the fractional part) and without leading zeroes
   (except for a single leading zero if the integer part is zero) or
   trailing zeroes after the period.  Order them from smallest to the
   largest and concatenate them and follow the results by a "/".  For
   each source producing a single number, simply represent it as above
   with a trailing "/".  At this point you have a string for each
   source, say s1/, s2/, ...  Concatenate these strings in a pre-
   specified order and represent each character as its ASCII code
   producing s1/s2/.../.
   かく情報源が生成した多数の数について、それぞれピリオドで終わる10進
   数(又は、ピリオドが小数部を区切る)で、そして先頭にゼロがなく(整数
   部がゼロの場合に、先頭のゼロを設定するのは例外)、ピリオドの後に終わ
   りのゼロがないように表現してください。それらを小さいものから大きいも
   のの順に並べ、それらと続く「/」を連結します。ひとつの数を作り出す各
   情報源について、単純に上記と後続する「/」で表現してください。この時
   点であなたは各情報源で文字列を持っています、s1/, s2/,...。前もって指
   定された順序でこれらの文字列を連結し、そしてそれぞれの文字をASCI
   Iコードで表現し、s1/s2/.../とします。

   You can then produce a sequence of random values derived from a
   strong mixing of these sources by calculating the MD5 hash [RFC 1321]
   of this string prefixed and suffixed with a zero byte for the first
   value, the string prefixed and suffixed by a 0x01 byte for the second
   value, etc.  Treat each of these derived random values as a positive
   multiprecision integer.  If there are P eligible volunteers, select
   the first voting member by dividing the first derived random value by
   P and using the remainder plus one as the position of the selectee in
   the ordered list or volunteers.  Select the second voting member by
   dividing the second derived random value by P-1 and using the
   remainder plus one as the position of the selectee in the list with
   the first selectee eliminated.  Etc.
   あなたはこの文字列の先頭と最後に最初はゼロのバイトを付け、次は0x01
   のバイトを付け、これを繰り返し、MD5ハッシュ[RFC 1321] によってこれ
   らの情報源を強力に混合することから得られたランダム値の連続を作り出す
   ことができます。これらの得られるランダムな値のそれぞれを正の多精度の
   整数と扱います。もしP人の適格なボランティアがいるなら、最初に得られ
   たランダム値をPで割り、余りに1を足して、順序リスト又はボランティア
   のその値の位置の人を最初の投票メンバーを選択します。2番目の投票メン
   バーは、2番目のランダム値をP−1で割り、余りに1を足して、最初の投
   票メンバーを除いたリストから、のその値の位置の人を次の投票メンバーに
   選択します。繰り返します。

   It is recommended that alphanumeric random sources be avoided due to
   the greater difficulty in canonicalizing them in an independently
   repeatable fashion; however, if any are used, all white space,
   punctuation, and special characters should be removed and all letters
   set to upper case. This will leave only an unbroken sequence of
   letters A-Z and digits 0-9 which can be treated as a canonicalized
   number above and suffixed with a "/".
   英数字のランダムな情報源が独立して再現可能な形式でそれらを正規化する
   のが困難なため、避けられることが勧められます;しかしながら、もし使わ
   れるなら、すべての空白スペースと句読点と特別な文字が除かれ、すべての
   文字は大文字に設定するべきです。これはただAからZの文字と0から9の
   数字の列だけを残し、これは上記の様に正規化数と扱われ、後に「/」が付
   けられます。

5. Fully Worked Example
5. 完全な仕事の例

   Assume the following ordered list of 25 eligible volunteers is
   published in advance of selection:
   次の25人の適格なボランティアの順序づけられたリストが選択の前に発表
   されると想定してください:。

         1. John         11. Pollyanna       21. Pride
         2. Mary         12. Pendragon       22. Sloth
         3. Bashful      13. Pandora         23. Envy
         4. Dopey        14. Faith           24. Anger
         5. Sleepy       15. Hope            25. Kasczynski
         6. Grouchy      16. Charity
         7. Doc          17. Love
         8. Sneazy       18. Longsuffering
         9. Handsome     19. Chastity
        10. Cassandra    20. Smith

   Assume the following (fake example) ordered list of randomness
   sources:
   次の乱雑の順序づけられたリスト(偽りの例)の入手を仮定してください:

    1. The People's Democracy of Betastani State Lottery six winning
       numbers (ignoring the seventh "extra" number) for 1 October 1998.
    1. ベータステイン州民族民主主義宝くじの1998年10月1日の6つの
       勝ち番号(7番目の「余分」番号を無視)。
    2. Numbers of the winning horses at Hialeia for all races for the
       first day on or after x September 1998 on which at least two
       races are run.
    2. ヒアレイアにおいて、1998年9月X日以降の、少なくとも2つの競
       馬が開催された最初日の、勝馬番号。
    3. The Republic of Alphaland State Lottery daily number for 1
       October 1998 treated as a single four digit integer.
    3. 1998年10月1日のアルファランド州公共宝くじの毎日の番号、4
       桁整数と扱います。
    4. Closing price of Example Corporation stock on the Lunar Stock
       Exchange for the first business day after x September 1998 when
       it trades.
    4. x1998年9月X日以降の最初の仕事日の株式取引所でのエグザンプ
       ル株式会社株の終値、取引がある場合。

   Randomness publicly produced:
   公的に作り出された乱雑さ:

       Source 1:  9, 18, 26, 34, 41, 45
       Source 2:  2, 5, 12, 8, 10
       Source 3:  9319
       Source 4:  13 11/16

   Resulting key string:
   生成された鍵文字列:

       9.18.26.34.41.45./2.5.8.10.12./9319./13.6875/

   The table below gives the hex of the MD5 of the above key string
   bracketed with a byte whose value is successively 0x00, 0x01, 0x02,
   through 0x09.  The divisor for the number size of the remaining pool
   at each stage is given and the index of the selectee as per the
   original number of those in the pool.
   下表は上記の鍵文字列の前後を、1バイトの連続数、0x00、0x01、0x02・・
   ・0x09、でそれぞれ囲んたものにMD5を適用した結果の16進数です。そ
   れぞれの段階においての残っている候補者番号サイズの割り数、そして候補
   者の中から選択されたもののインデックス。

   index        hex value of MD5        div  selected
    1  746612D0A75D2A2A39C0A957CF825F8D  25  -> 12 <-
    2  95E31A4429ED5AAF7377A15A8E10CD9D  24  ->  6 <-
    3  AFB2B3FD30E82AD6DC35B4D2F1CFC77A  23  ->  8 <-
    4  06821016C2A2EA14A6452F4A769ED1CC  22  ->  3 <-
    5  94DA30E11CA7F9D05C66D0FD3C75D6F7  21  ->  2 <-
    6  2FAE3964D5B1DEDD33FDA80F4B8EF45E  20  -> 24 <-
    7  F1E7AB6753A773EFE46393515FDA8AF8  19  -> 11 <-
    8  700B81738E07DECB4470879BEC6E0286  18  -> 19 <-
    9  1F23F8F8F8E5638A29D332BC418E0689  17  -> 15 <-
   10  61A789BA86BF412B550A5A05E821E0ED  16  -> 22 <-

   Resulting selection, in order selected:
   選択順での選択結果:

         1. Pendragon (12)     6. Anger (24)
         2. Grouchy (6)        7. Pollyanna (11)
         3. Sneazy (8)         8. Chastity (19)
         4. Bashful (3)        9. Hope (15)
         5. Mary (2)          10. Sloth (22)

6. Security Considerations
6. セキュリティ考慮

   Careful choice of should be made of randomness inputs so that there
   is no reasonable suspicion that they are under the control of the
   administrator.  Guidelines given above to use a small number of
   inputs with a substantial amount of entropy from the last shoud be
   followed.  And equal care needs to be given that the algorithm
   selected is faithfully executed with the designated inputs values.
   Publication of the results and a week or so window for the community
   of interest to duplicate the calculations should give a reasonable
   assurance against implementation tampering.
   乱雑さの入力について、それらが管理者の制御下にあるという合理的な嫌疑
   がないように、注意深い選択がされるべきです。相当な量のエントロピーの
   少ない数の入力を使うために上に与えられたガイドラインに従うでしょう。
   そして同様の注意で、指名された入力で選択されたアルゴリズムが誠実に実
   行される必要があります。興味の共同体の興味をもった人が計算を再現し、
   実行が改ざんされていないことに対して合理的な保証に与えるため、結果の
   発表と1・2週間の期間を取ります。

   To maintain the unpredictable character of selections, should a
   member of the nomcom need to be replaced due to death, resignation,
   expulsion, etc., new publicly announced future random sources should
   be used for the selection of their replacement.
   選択の予想できない特徴を持続するために、もしnomcomメンバーが死、辞職、
   追放などで代わる必要があるなら、新しい公的に発表された未来のランダム
   な情報源が代わりの選択のために使われるべきです。

7.  Reference Code
7.  参照コード

   This code makes use of the MD5 reference code from [RFC 1321] ("RSA
   Data Security, Inc. MD5 Message-Digest Algorithm").  The portion of
   the code dealing with multiple floating point numbers was written by
   Matt Crawford.
   このコードは[RFC 1321](「RSAデータセキュリティ社MD5メッセージ
   ダイジェストアルゴリズム」)からMD5参照コードを利用します。多数の
   浮動小数点数を扱うコードの部分がMatt Crawfordによって書かれました。

   /****************************************************************
    *
    *  Reference code for
    *      "Publicly Verifiable Nomcom Random Selection"
    *          Donald E. Eastlake 3rd
    *  参照コード
    *      「公的に証明可能なNomcom無作為選択」
    *          Donald E. Eastlake 3rd
    *
    ****************************************************************/
   #include <limits.h>
   #include <math.h>
   #include <stdio.h>
   #include <stdlib.h>
   #include <string.h>

   #include "global.h"
   #include "MD5.h"

   /* local prototypes */
   /* ローカルプロトタイプ */
   int longremainder ( unsigned char divisor,
                       unsigned char dividend[16] );
   int getinteger ( char *string );
   double NPentropy ( int N, int P );

   /* limited to 16 inputs of up to sixteen integers each */
   /* それぞれ最大16の16整数に制限 */
   /****************************************************************/

   main ()
   {
   int         i, j,  k, k2, err, keysize, pool, selection;
   unsigned char   unch, uc16[16], remaining, *selected;
   long int    temp, array[16];
   MD5_CTX ctx;
   char        buffer[257], key [800], sarray[16][256];

   pool = getinteger ( "Type size of pool:\n" );
   if ( pool > 255 )
       {
       printf ( "Pool too big.\n" );
       exit ( 1 );
       }
   selected = (unsigned char *) malloc ( pool );
   if ( !selected )
       {
       printf ( "Out of memory.\n" );
       exit ( 1 );
       }
   selection = getinteger ( "Type number of items to be selected:\n" );
   if ( selection > pool )
       {
       printf ( "Pool too small.\n" );
       exit ( 1 );
       }
   if ( selection == pool )
       {
       printf ( "All of the pool is selected.\n" );
       exit ( 0 );
       }
   err = printf ( "Approximately %.1f bits of entropy needed.\n",
                  NPentropy ( selection, pool ) + 0.1 );
   if ( err <= 0 ) exit ( 1 );
   for ( i = 0, keysize = 0; i < 16; ++i )
       {
       if ( keysize > 500 )
           {
           printf ( "Too much input.\n" );
           exit ( 1 );
           }
       /* get the "random" inputs. echo back to user so the user may
          be able to tell if truncation or other glitches occur.  */
       /* 「ランダム」入力を得る。もし文字欠けや他の障害が存在する場
          合に、ユーザーに告げることが可能なように、ユーザーにエコー
          バック。*/
       err = printf (
           "\nType #%d randomness or 'end' followed by new line.\n"
           "Up to 16 integers or the word 'float' followed by up\n"
           "to 16 x.y format reals.\n", i+1 );
       if ( err <= 0 ) exit ( 1 );
       gets ( buffer );
       j = sscanf ( buffer,
               "%ld%ld%ld%ld%ld%ld%ld%ld%ld%ld%ld%ld%ld%ld%ld%ld",
           &array[0], &array[1], &array[2], &array[3],
           &array[4], &array[5], &array[6], &array[7],
           &array[8], &array[9], &array[10], &array[11],
           &array[12], &array[13], &array[14], &array[15] );
       if ( j == EOF )
           exit ( j );
       if ( !j )
           if ( buffer[0] == 'e' )
               break;
           else
               {   /* floating point code by Matt Crawford */
                   /* Matt Crawfordによる浮動小数点コード */
               j = sscanf ( buffer,
                   "float %ld.%[0-9]%ld.%[0-9]%ld.%[0-9]%ld.%[0-9]"
                   "%ld.%[0-9]%ld.%[0-9]%ld.%[0-9]%ld.%[0-9]"
                   "%ld.%[0-9]%ld.%[0-9]%ld.%[0-9]%ld.%[0-9]"
                   "%ld.%[0-9]%ld.%[0-9]%ld.%[0-9]%ld.%[0-9]",
                   &array[0], sarray[0], &array[1], sarray[1],
                   &array[2], sarray[2], &array[3], sarray[3],
                   &array[4], sarray[4], &array[5], sarray[5],
                   &array[6], sarray[6], &array[7], sarray[7],
                   &array[8], sarray[8], &array[9], sarray[9],
                   &array[10], sarray[10], &array[11], sarray[11],
                   &array[12], sarray[12], &array[13], sarray[13],
                   &array[14], sarray[14], &array[15], sarray[15] );
               if ( j == 0 || j & 1 )
                   printf ( "Bad format." );
               else {
                    for ( k = 0, j /= 2; k < j; k++ )
                    {
                          /* strip trailing zeros */
                          /* 後続するゼロをはぐ */
                    for ( k2=strlen(sarray[k]); sarray[k][--k2]=='0';)
                          sarray[k][k2] = '\0';
                    err = printf ( "%ld.%s\n", array[k], sarray[k] );
                    if ( err <= 0 ) exit ( 1 );
                    keysize += sprintf ( &key[keysize], "%ld.%s",
                                         array[k], sarray[k] );
                    }
                    keysize += sprintf ( &key[keysize], "/" );
                    }
               }
       else
           {   /* sort values, not a very efficient algorithm */
               /* それほど効率的ではない、値ソート */
           for ( k2 = 0; k2 < j - 1; ++k2 )
               for ( k = 0; k < j - 1; ++k )
                   if ( array[k] > array[k+1] )
                       {
                       temp = array[k];
                       array[k] = array[k+1];
                       array[k+1] = temp;
                       }
           for ( k = 0; k < j; ++k )
               { /* print for user check */
                 /* ユーザ検査の印刷 */
               err = printf ( "%ld ", array[k] );
               if ( err <= 0 ) exit ( 1 );
               keysize += sprintf ( &key[keysize], "%ld.", array[k] );
               }
           keysize += sprintf ( &key[keysize], "/" );
           }
       }   /* end for i */

   /* have obtained all the input, now produce the output */
   /* すべての入力を得て、今出力を作り出す */
   err = printf ( "Key is:\n %s\n", key );
   if ( err <= 0 ) exit ( 1 );
   for ( i = 0; i < pool; ++i )
       selected [i] = i + 1;
   printf ( "index        hex value of MD5        div  selected\n" );
   for (   unch = 0, remaining = pool;
           unch < selection;
           ++unch, --remaining )
       {
       MD5Init ( &ctx );
       MD5Update ( &ctx, &unch, 1 );
       MD5Update ( &ctx, (unsigned char *)key, keysize );
       MD5Update ( &ctx, &unch, 1 );
       MD5Final ( uc16, &ctx );
       k = longremainder ( remaining, uc16 );
   /* printf ( "Remaining = %d, remainder = %d.\n", remaining, k ); */
       for ( j = 0; j < pool; ++j )
           if ( selected[j] )
               if ( --k < 0 )
                   {
                   printf ( "%2d  "
   "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X  "
   "%2d  -> %2d <-\n",
   unch+1, uc16[0],uc16[1],uc16[2],uc16[3],uc16[4],uc16[5],uc16[6],
   uc16[7],uc16[8],uc16[9],uc16[10],uc16[11],uc16[12],uc16[13],uc16[14],
   uc16[15], remaining, selected[j] );
                   selected[j] = 0;
                   break;
                   }
       }
   printf ( "\nDone, type any character to exit.\n" );
   getchar ();
   return 0;
   }

   /* prompt for an integer input */
   /* 整数入力を促すプロンプト */
   /****************************************************************/
   int getinteger ( char *string )
   {
   int     i, j;
   char    tin[257];

   while ( 1 )
   {
   printf ( string );
   printf ( "(or 'exit' to exit) " );
   gets ( tin );
   j = sscanf ( tin, "%d", &i );
   if (    ( j == EOF )
       ||  ( !j && ( ( tin[0] == 'e' ) || ( tin[0] == 'E' ) ) )
           )
       exit ( j );
   if ( j == 1 )
       return i;
   }   /* end while */
   }

   /* get remainder of dividing a 16 byte unsigned int
      by a small positive number */
   /* 16バイト符号なし整数を、小さい正数で割った余りを得る */
   /****************************************************************/
   int longremainder ( unsigned char divisor,
                       unsigned char dividend[16] )
   {
   int i;
   long int kruft;

   if ( !divisor )
       return -1;
   for ( i = 0, kruft = 0; i < 16; ++i )
       {
       kruft = ( kruft << 8 ) + dividend[i];
       kruft %= divisor;
       }
   return kruft;
   }   /* end longremainder */

   /* calculate how many bits of entropy it takes to select N from P */
   /* PからNを選択するために必要なエントロピーのビットを計算 */
   /****************************************************************/
   /*             P!
     log  ( ----------------- )
        2    N! * ( P - N )!
   */

   double NPentropy ( int N, int P )
   {
   int         i;
   double      result = 0.0;

   if (    ( N < 1 )   /* not selecting anything? */
      ||   ( N >= P )  /* selecting all of pool or more? */
      )
       return 1.0;     /* degenerate case */
   for ( i = P; i > ( P - N ); --i )
       result += log ( i );
   for ( i = N; i > 1; --i )
       result -= log ( i );
   /* divide by [ log (base e) of 2 ] to convert to bits */
   result /= 0.69315;
   return result;
   }   /* end NPentropy */


Appendix: History of NomCom Member Selection
付録:NomComメンバー選択の歴史

   For reference purposes, here is a list of the IETF Nominations
   Committee member selection techniques and chairs so far:
   参考の目的のために、これまでのIETF指名委員会メンバーの選択テクニッ
   クと議長のリストがあります:。

           YEAR      CHAIR               SELECTION METHOD

        1993/1994  Jeff Case             Clergy
        1994/1995  Fred Baker            Clergy
        1995/1996  Guy Almes             Clergy
        1996/1997  Geoff Huston          Spouse
        1997/1998  Mike St.Johns         Algorithm
        1998/1999  Donald Eastlake 3rd   This Algorithm
        1999/2000  Avri Doria            This Alogrithm

   Clergy = Names were written on pieces of paper, placed in a
   receptacle, and a member of the clergy picked the Nomcom members.
   Clergy = 名前がいくつかの紙の上に書かれ、容器に置かれ、そして聖職者の
   メンバーがNomcomメンバーを選びました。

   Spouse = Same as Clergy except chair's spouse made the selection.
   Spouse = 議長の配偶者選択した以外、Clergyと同じです。

   Algorithm = Algorithmic selection based on the same concepts as
   documented herein.
   Algorithm = ここに文書化されたのと同じ概念に基づいたアルゴリズムでの
   選択。

   This Algorithm = Algorithmic selection using the algorithm and
   reference code (but not the fake example sources of randomness)
   described herein.
   This Algorithm = がここに記述したアルゴリズムと参照コードを使ったア
   ルゴリズム選択(しかし例の乱雑の偽物の情報源ではなく)。

References
参考文献

   RFC 1321  Rivest, R., "The MD5 Message-Digest Algorithm", RFC 1321,
             April 1992.

   RFC 1750  Eastlake, D., 3rd, Crocker, S. and J. Schiller, "Randomness
             Recommendations for Security", RFC 1750, December 1994.

   RFC 2727  Galvin, J., "IAB and IESG Selection, Confirmation, and
             Recall Process: Operation of the Nominating and Recall
             Committees", BCP 10, RFC 2727, February 2000.

Author's Address
著者のアドレス

   Donald E. Eastlake, 3rd
   Motorola
   65 Shindegan Hill Road, RR #1
   Carmel, NY 10512 USA

   Phone:  +1-914-276-2668 (h)
           +1-508-261-5434 (w)
   Fax:    +1-508-261-4447 (w)
   EMail:  Donald.Eastlake@motorola.com

Full Copyright Statement
著作権表示全文

   Copyright (C) The Internet Society (2000).  All Rights Reserved.
   著作権(C)インターネット学会(2000)。すべての権利は保留される。

   This document and translations of it may be copied and furnished to
   others, and derivative works that comment on or otherwise explain it
   or assist in its implementation may be prepared, copied, published
   and distributed, in whole or in part, without restriction of any
   kind, provided that the above copyright notice and this paragraph are
   included on all such copies and derivative works.  However, this
   document itself may not be modified in any way, such as by removing
   the copyright notice or references to the Internet Society or other
   Internet organizations, except as needed for the purpose of
   developing Internet standards in which case the procedures for
   copyrights defined in the Internet Standards process must be
   followed, or as required to translate it into languages other than
   English.
   上記著作権表示とこの段落が全ての複写や派生的な仕事につけられていれば、
   この文書と翻訳は複写や他者への提供ができ、そしてコメントや説明や実装
   を支援する派生的な仕事のためにこの文書の全部か一部を制約なく複写や出
   版や配布できます。しかし、この文書自身は、英語以外の言葉への翻訳やイ
   ンターネット標準を開発する目的で必要な場合以外は、インターネット学会
   や他のインターネット組織は著作権表示や参照を削除されるような変更がで
   きません、インターネット標準を開発する場合はインターネット標準化プロ
   セスで定義された著作権の手順に従われます。

   The limited permissions granted above are perpetual and will not be
   revoked by the Internet Society or its successors or assigns.
   上に与えられた限定された許可は永久で、インターネット学会やその後継者
   や譲渡者によって無効にされません。

   This document and the information contained herein is provided on an
   "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
   TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
   BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
   HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
   この文書とここに含む情報は無保証で供給され、そしてインターネット学会
   とインターネット技術標準化タスクフォースは、特別にも暗黙にも、この情
   報の利用が権利を侵害しないことや商業利用や特別の目的への利用に適当で
   ある事の保障を含め、すべての保証を拒否します。

Acknowledgement
謝辞

   Funding for the RFC Editor function is currently provided by the
   Internet Society.
   RFCエディタ機能のための資金供給が現在インターネット学会によって
   供給されます。

Japanese translation by Ishida So