Naor-Reingold 의사 난수 함수는 난수를 생성하는 또 다른 방법입니다.
Moni Naor와 Omer Reingold는 1997년에 개인 키와 공개 키 암호화에서 다양한 암호화 기본 요소에 대한 효율적인 구성을 설명했습니다. p와 l을 l |p−1의 소수라고 합시다. 승법 차수 l의 요소 g ε Fp*를 선택합니다. 그런 다음 각 n차원 벡터에 대해 a =(a0 ,a1 , ..., an ).
그들은 기능을 정의합니다
fa(x)=ga0.a1x1a2x2…..anxn ε Fp
여기서 x =x1 ... 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