নাওর-রেইনহোল্ড সুডো র্যান্ডম ফাংশন (Naor-Reingold Pseudo Random Function) র্যান্ডম সংখ্যা জেনারেট করার আরেকটি পদ্ধতি।
মনি নাওর ও ওমার রেইনহোল্ড ১৯৯৭ সালে প্রাইভেট কি এবং পাবলিক-কি ক্রিপ্টোগ্রাফিতে বিভিন্ন ক্রিপ্টোগ্রাফিক প্রিমিটিভের দক্ষ কনস্ট্রাকশন বর্ণনা করেছিলেন। p এবং l কে মৌলিক সংখ্যা ধরে নিলে l | p-1। গুণাত্মক ক্রম l 가진 একটি এলিমেন্ট g ∈ Fp* নির্বাচন করুন। তারপর প্রতিটি n-ডাইমেনশনাল ভেক্টর a = (a₀, a₁, ..., aₙ) এর জন্য।
তারা ফাংশনটি সংজ্ঞায়িত করেন:
fₐ(x) = g^(a₀·a₁ˣ¹·a₂ˣ²...aₙˣⁿ) ∈ Fp
যেখানে x = x₁ ... xₙ হলো পূর্ণসংখ্যা x-এর বিট রিপ্রেজেন্টেশন, ০ ≤ x ≤ 2ⁿ⁻¹
এই ফাংশনটি সিমেট্রিক এনক্রিপশন, অথেন্টিকেশন, এবং ডিজিটাল সিগ্নেচার সহ অনেক ক্রিপ্টোগ্রাফিক স্কিমের ভিত্তি হিসেবে ব্যবহার করা যায়।
অ্যালগরিদম
শুরু
p, l, g, n, x ভেরিয়েবল ঘোষণা করুন
p, l, g, n পড়ুন
a[], b[] অ্যারে ঘোষণা করুন
i=0 থেকে 10 পর্যন্ত
x = rand() mod 16
j=g থেকে 0 পর্যন্ত
b[j] = x mod 2
x = x / 2
শেষ
mult = 1 অ্যাসাইন করুন
k = 0 থেকে n পর্যন্ত
mult = mult * (pow(a[k], b[k]))
শেষ
র্যান্ডম সংখ্যা প্রিন্ট করুন
শেষ
শেষ
উদাহরণ কোড
#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