কম্পিউটার টিউটোরিয়াল

C++ প্রোগ্রাম: নাওর-রেইনহোল্ড সুডো র‍্যান্ডম ফাংশন বাস্তবায়ন


নাওর-রেইনহোল্ড সুডো র‍্যান্ডম ফাংশন (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
  1. C++-এ সিজার সাইফার (Caesar Cipher) ইমপ্লিমেন্টেশন

  2. C++ প্রোগ্রাম: AVL ট্রি ইমপ্লিমেন্টেশন

  3. C++ STL-এ Set Symmetric Difference বাস্তবায়ন

  4. C++ প্রোগ্রাম: লিনিয়ার কনগ্রুয়েনশিয়াল জেনারেটর বাস্তবায়ন সুডো র‍্যান্ডম নম্বর জেনারেশনের জন্য