Naor-Reingold Pseudo Random Function, यादृच्छिक संख्याएँ उत्पन्न करने का एक अन्य तरीका है।
मोनी नाओर और ओमर रींगोल्ड ने 1997 में निजी कुंजी के साथ-साथ सार्वजनिक-कुंजी क्रिप्टोग्राफ़ी में विभिन्न क्रिप्टोग्राफ़िक प्रिमिटिव के लिए कुशल निर्माण का वर्णन किया। मान लीजिए कि p और l अभाज्य संख्याएँ हैं l |p−1। गुणन क्रम l का एक तत्व g Fp* चुनें। फिर प्रत्येक n-आयामी वेक्टर के लिए a =(a0 .) ,a1 , ..., an )।
वे फ़ंक्शन को परिभाषित करते हैं
fa(x)=ga0.a1x1a2x2…..anxn ε Fp
जहां x =x<उप>1उप> ... एक्स<उप>एनउप> पूर्णांक 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