C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

Naor-Reingold擬似ランダム関数を実装するC++プログラム


Naor-Reingold疑似乱数関数は、乱数を生成するもう1つの方法です。

MoniNaorとOmerReingoldは、1997年に、秘密鍵と公開鍵暗号のさまざまな暗号プリミティブの効率的な構成について説明しました。pとlをl|p-1の素数とします。乗法次数lの要素gεFp*を選択します。次に、各n次元ベクトルに対してa =(a 0 、a 1 、...、a n

それらは関数を定義します

fa(x)=ga0.a1x1a2x2…..anxn ε Fp

ここで、x =x 1 …xn は整数xのビット表現であり、0≤x≤2 n-1

この機能は、対称暗号化、認証、デジタル署名など、多くの暗号化スキームの基礎として使用できます。

アルゴリズム

Begin
   Declare the variables p, l, g, n, x
   Read the variables p, l, g, n
   Declare array a[], b[]
   For i=0 to 10, do
      x = rand() mod 16;
      For j=g to 0, do
         b[j] = x mod 2;
         x =x divided by2;
      Done
      Assign mult = 1
      For k = 0 to n do
         mult = mult *(pow(a[k], b[k]))
      Done
      Print the random numbers
   Done
End

サンプルコード

#include <iostream>
using namespace std;
int main(int argc, char **argv) {
   int p = 7, l = 2, g = 3, n = 6, x;
   int a[] = { 1, 2, 2, 1 };
   int b[4];
   cout << "The Random numbers are: ";
   for (int i = 0; i < 10; i++) {
      x = rand() % 16;
      for (int j = 3; j >= 0; j--) {
         b[j] = x % 2;
         x /= 2;
      }
      int mult = 1;
      for (int k = 0; k < 6; k++)
         mult *= pow(a[k], b[k]);
      cout << pow(g, mult)<<" ";
   }
}

出力

The Random numbers are: 81 81 3 9 3 81 9 9 3 9

  1. AVLツリーを実装するためのC++プログラム

    AVLツリーは自己平衡二分探索木であり、左右のサブツリーの高さの差がすべてのノードで複数になることはありません。 ツリーの回転は、AVLツリーの要素の順序を妨げることなく構造を変更する操作です。ツリー内で1つのノードを上に移動し、1つのノードを下に移動します。これは、ツリーの形状を変更したり、小さいサブツリーを下に移動したり、大きいサブツリーを上に移動したりして高さを低くしたりするために使用され、多くのツリー操作のパフォーマンスが向上します。回転の方向は、木のノードが移動する側に依存しますが、他の人は、どの子がルートの場所をとるかに依存すると言います。これは、AVLツリーを実装するためのC+

  2. STLにSet_Symmetric_differenceを実装するC++プログラム

    これは、set_symmetric_differenceを実装するためのC++プログラムです。 2つのセットの対称差は、一方のセットには存在するが、もう一方のセットには存在しない要素によって構築されます。 一般的な集合演算は-です セットユニオン 交差点を設定 対称集合の差または排他的論理和 差または減算を設定 アルゴリズム Begin    Declare set vector v and iterator st.   Initialize st = set_symmetric_difference (set1, set1 + n, set2, se