縮小ジェネレータ
暗号学において、縮小生成器(シュリンク生成器)は、ストリーム暗号での使用を意図した擬似乱数生成器の一種である。1993年にドン・コッパースミス、ヒューゴ・クラウチク、イシャイ・マンスールによってCrypto誌に掲載された。[1]
シュリンクジェネレータは、2つの線形フィードバックシフトレジスタを使用します。1つはAシーケンスと呼ばれ、出力ビットを生成し、もう1つはSシーケンスと呼ばれ、その出力を制御します。AとSの両方がクロックされます。Sビットが1の場合、 Aビットが出力されます。Sビットが0の場合、 Aビットは破棄され、何も出力されず、レジスタは再びクロックされます。これには、ジェネレータの出力レートが不規則に変化し、Sの状態を暗示するという欠点があります。この問題は、出力をバッファリングすることで克服できます。LFSRによって生成されるランダムシーケンスは、セキュアシステムにおける予測不可能性を保証することができず、そのランダム性を向上させるためのさまざまな方法が提案されています[2] 。
この単純さにもかかわらず、フィードバック多項式が秘密である場合、網羅的探索よりも優れた攻撃法は現在のところ知られていません。しかし、フィードバック多項式が既知の場合、最もよく知られている攻撃法はA・Sビット未満の出力を必要とします。[3]
バリエーションとしては、自己収縮ジェネレータがあります。
Pythonでの実装
この例では、2つのガロアLFRSを使用して擬似乱数ビットストリームを生成します。このPythonコードは、ファイルまたは任意のバイトストリームの暗号化と復号に使用できます。
#!/usr/bin/env python3インポートシステム # ---------------------------------------------------------------------------- # Crypto4o 関数はここから始まります# ----------------------------------------------------------------------------クラスGLFSR : 「ガロア線形フィードバックシフトレジスタ」 def __init__ ( self , polynom , initial_value ): print "多項式 0x %Xを使用します。初期値: 0x %X 。" % ( polynom , initial_value ) self.polynom = polynom | 1 self.data = initial_value tmp = polynom self.mask = 1 tmp != 0の場合: tmp & self.mask ! = 0の場合 : tmp ^ = self.mask tmp == 0の場合: ブレーク 自己.マスク <<= 1 def next_state ( self ): self . data <<= 1 戻り値 = 0 self.data & self.mask ! = 0の場合: retval = 1 self.data ^ = self.polynom 戻り値を返すクラスSPRNG : 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 ):バイト= 0ビット位置= 7 Trueの場合: bit_d = self.glfsr_d.next_state ( ) bit_c = self.glfsr_c.next_state ( ) bit_c != 0の場合: bit_r = bit_d バイト |= bit_r << bitpos ビット位置 -= 1 bitpos < 0 の場合: break 戻り バイト# ---------------------------------------------------------------------------- # Crypto4o 関数はここで終了します# ----------------------------------------------------------------------------定義main (): prng = SPRNG ( int ( sys . argv [ 3 ], 16 ), int ( sys . argv [ 4 ], 16 ), int ( sys . argv [ 5 ], 16 ), int ( sys . argv [ 6 ], 16 ), ) open ( sys . argv [ 1 ], "rb" ) as f 、open ( sys . argv [ 2 ], " wb" ) as g : while True : input_ch = f . read ( 1 ) input_ch == ""の場合: ブレーク random_ch = prng.next_byte ( ) & 0xFF g.write ( chr ( ord ( input_ch ) ^ random_ch ) ) __name__ == "__main__"の場合: main ()参照
参考文献
- ^ D. Coppersmith、H. Krawczyk、Y. Mansour、「縮小ジェネレータ」、CRYPTO '93:暗号学の進歩に関する第13回国際暗号学会議議事録(ニューヨーク、ニューヨーク、米国)、pp. 22–39、Springer-Verlag New York、Inc.、1994年
- ^ Poorghanad, A. 他「進化的手法を用いた高品質疑似乱数の生成」IEEE、DOI: 10.1109/CIS.2008.220。
- ^ Caballero-Gil, P. 他「縮小ジェネレータに対する新たな攻撃戦略」『情報技術の研究と実践ジャーナル』第1巻、331~335ページ、2008年12月。