در رمزنگاری، **مولد کوچک کننده** نوعی تولیدکننده عدد شبه تصادفی است که در رمزنگاری جریانی مورد استفاده قرارمی گیرد. این مولد برای اولین باردر کریپتو ۱۹۹۳ توسط دون کوپرزمیت، هوگو کراچزیک و ییشی منصور منتشر شده‌است.

مولد کوچک کننده از دو ثبات تغییر بازخورد خطی استفاده می‌کند. یکی با نام دنباله A، بیت‌های خروجی تولید می‌کند، و دیگری با نام دنباله S، خروجی آنها را کنترل می‌کند. هر دو A و S کلاک می‌خورند، اگر بیت S برابر ۱ باشد، بیت A خروجی است. S برابر ۱ باشد، A دور ریخته می‌شود، خروجی نخواهیم داشت، و رجیسترها دوباره کلاک می‌خورند. این کار اشکالاتی دارد که نرخ خروجی مولد به‌طور نامنظم متفاوت است و به گونه ای که به وضعیت S اشاره دارد. این مشکل را می‌توان با بافر کردن خروجی برطرف کرد. دنبالهٔ تصادفی تولید شده توسط LFSR نمی‌تواند عدم پیش‌بینی شدن سیستم ایمن را تضمین کند و روشهای مختلفی برای بهبود تصادفی بودن آن پیشنهاد شده‌است

با وجود این سادگی، در حال حاضر هیچ حملهٔ شناخته شده‌ای بهتر از Brute-force وقتی که چندجمله ای‌های بازخورد مخفی هستند وجود ندارد. اگر چندجمله‌های بازخورد شناخته شده باشند، بهترین حمله شناخته شده به خروجی باطول کمتر از A\*S نیاز دارد.

یک نوع جالب مولد خود کوچک کننده است.

پیاده‌سازی در پایتون
--------------------

در این مثال از دو ثبات تغییر بازخورد خطی گالیوس برای تولید جریان خروجی شبه تصادفی استفاده شده‌است. از این کد پایتون می‌توان برای رمزگذاری و رمزگشایی یک فایل یا هر نوع bytestream استفاده کرد. 

```
#!/usr/bin/env python

import sys
# ----------------------------------------------------------------------------
# Crypto4o functions start here
# ----------------------------------------------------------------------------

class GLFSR(object):
 """Galois linear-feedback shift register."""

    def \_\_init\_\_(self, polynom, initial\_value):
        print "Using polynom 0x%X, initial value: 0x%X." % (polynom, initial\_value)

        self.polynom = polynom | 1
        self.data = initial\_value
        tmp = polynom
        self.mask = 1

        while tmp != 0:
            if tmp & self.mask != 0:
                tmp ^= self.mask

            if tmp == 0:
                break

            self.mask <<= 1

    def next\_state(self):
        self.data <<= 1

        retval = 0

        if self.data & self.mask != 0:
            retval = 1
            self.data ^= self.polynom

        return retval

class SPRNG(object):
    def \_\_init\_\_(self, polynom\_d, init\_value\_d, polynom\_c, init\_value\_c):
        print "GLFSR D0: ",
        self.glfsr\_d = GLFSR(polynom\_d, init\_value\_d)
        print "GLFSR C0: ",
        self.glfsr\_c = GLFSR(polynom\_c, init\_value\_c)

    def next\_byte(self):
        byte = 0
        bitpos = 7

        while True:
            bit\_d = self.glfsr\_d.next\_state()
            bit\_c = self.glfsr\_c.next\_state()

            if bit\_c != 0:
                bit\_r = bit\_d
                byte |= bit\_r << bitpos

                bitpos -= 1

                if bitpos < 0:
                    break

        return byte

# ----------------------------------------------------------------------------
# Crypto4o functions end here
# ----------------------------------------------------------------------------

def main():
    prng = SPRNG(int(sys.argv[3], 16), int(sys.argv[4], 16),
                 int(sys.argv[5], 16), int(sys.argv[6], 16))

    with open(sys.argv[1], "rb") as f, open(sys.argv[2], "wb") as g:
        while True:
            input\_ch = f.read(1)

            if input\_ch == "":
                break

            random\_ch = prng.next\_byte() & 0xff
            g.write(chr(ord(input\_ch) ^ random\_ch))

if \_\_name\_\_ == '\_\_main\_\_':
    main()

```

جستارهای وابسته
---------------

* FISH، رمزنگاری جریانی (ناامن) براساس اصل مولد کوچک کننده
* مولد گام متناوب، مشابه رمزنگاری جریانی.

منابع
-----

1. ↑  Poorghanad, A. et al. Generating High Quality Pseudo Random Number Using Evolutionary methods *IEEE*, DOI: 10.1109/CIS.2008.220.
2. ↑  Caballero-Gil, P. et al. New Attack Strategy for the Shrinking Generator *Journal of Research and Practice in Information Technology*, Vol. 1, pages 331–335, Dec 2008.