수축 발전기

Shrinking generator

암호학에서 수축 발전기스트림 암호에 사용되도록 의도된 유사란도 수 생성기의 한 형태다. 돈 코퍼스미스, 휴고 크레이지크, 이세이 만수르에 의해 1993년 크립토에서 출판되었다.[1]

수축 발전기는 두 개의 선형 피드백 시프트 레지스터를 사용한다. One, the라고 불리는 A sequence, 출력 비트를 생성하는 반면, 다른 하나는 , 호출하는 S 시퀀스, 출력 제어 둘 다 A 그리고 S 시간 기록되어 있다; 만일 S 비트는 1이고, 그 다음은 A 비트가 출력된 경우: S 비트는 0이다. A 비트는 폐기되고, 아무것도 출력되지 않으며, 레지스터는 다시 클럭 처리된다. 이것은 발전기의 출력 속도가 불규칙적으로 변화한다는 단점을 가지고 있으며, S 상태를 암시하는 방식으로, 이 문제는 출력을 버퍼링함으로써 이 문제를 극복할 수 있다. LFSR에 의해 생성된 무작위 시퀀스는 보안 시스템의 예측 불가능성을 보장할 수 없으며, 그 무작위성을 개선하기 위한 다양한 방법이 제안되었다.

이러한 단순함에도 불구하고 피드백 다항식이 비밀일 때, 현재 철저한 검색보다 더 잘 알려진 공격은 없다. 그러나 피드백 다항식이 알려진 경우, 가장 잘 알려진 공격은 다음보다 적은 양을 필요로 한다. AS 약간의 [3]생산량

변종은 자가수축 발전기다.

Python의 구현

이 예에서는 두 개의 Galois LFRS를 사용하여 출력 가성비트를 생성한다. 파이톤 코드는 파일이나 어떤 바이테스트림을 암호화하고 해독하는 데 사용될 수 있다.

#!/usr/bin/env python3  수입하다 sys  # ---------------------------------------------------------------------------- # 여기서부터 Crypto4o 기능 시작 # ----------------------------------------------------------------------------   계급 GLFSR:     """갈루아 선형 피드백 시프트 레지스터."""      반항하다 __init___(자아의, 다항식의, initial_value):         인쇄하다 "다항식 0x 사용%X, 초기 값: 0x%X." % (다항식의, initial_value)          자아의.다항식의 = 다항식의   1         자아의.자료 = initial_value         tmp = 다항식의         자아의.가면을 쓰다 = 1          하는 동안에 tmp != 0:             만일 tmp & 자아의.가면을 쓰다 != 0:                 tmp ^= 자아의.가면을 쓰다              만일 tmp == 0:                 부숴뜨리다              자아의.가면을 쓰다 <<= 1      반항하다 next_state(자아의):         자아의.자료 <<= 1          재평가하다 = 0          만일 자아의.자료 & 자아의.가면을 쓰다 != 0:             재평가하다 = 1             자아의.자료 ^= 자아의.다항식의          돌아오다 재평가하다   계급 SPRNG:     반항하다 __init___(자아의, polynom_d, init_value_d, polynom_c, init_value_c):         인쇄하다 "GLFSR D0: ",         자아의.glfsr_d = GLFSR(polynom_d, init_value_d)         인쇄하다 "GLFSR C0: ",         자아의.glfsr_c = GLFSR(polynom_c, init_value_c)      반항하다 next_byte(자아의):         바이트 = 0         굼벵이 = 7          하는 동안에 진실의:             bit_d = 자아의.glfsr_d.next_state()             bit_c = 자아의.glfsr_c.next_state()              만일 bit_c != 0:                 bit_r = bit_d                 바이트  = bit_r << 굼벵이                  굼벵이 -= 1                  만일 굼벵이 < 0:                     부숴뜨리다          돌아오다 바이트   # ---------------------------------------------------------------------------- # Crypto4o 기능은 여기서 종료됨 # ----------------------------------------------------------------------------   반항하다 본래의():     가지를 치다 = SPRNG(         인트로(sys.아그브[3], 16),         인트로(sys.아그브[4], 16),         인트로(sys.아그브[5], 16),         인트로(sys.아그브[6], 16),     )      와 함께 개방된(sys.아그브[1], "rb") 로서 f, 개방된(sys.아그브[2], "wb") 로서 g:         하는 동안에 진실의:             input_ch = f.읽다(1)              만일 input_ch == "":                 부숴뜨리다              임의_ch = 가지를 치다.next_byte() & 0xFF             g.글씨를 쓰다(CHR(서품을 하다(input_ch) ^ 임의_ch))   만일 __name__ == "__main__":     본래의() 

참고 항목

참조

  1. ^ D. Copersmith, H. Krawczyk, Y. CRYPTO '93: 제13회 국제 암호학 회의의 진행, (뉴욕, 뉴욕, 미국), 22-39페이지, 스프링거-베를라크, 1994.
  2. ^ 푸르가나드, A 등 IEEE, DOI: 10.1109/CIS.220을 사용하여 고품질 유사 난수 생성
  3. ^ 카바예로길, P. 외 정보 기술 분야의 연구실천에 관한 발전기 저널새로운 공격 전략, Vol. 1, 페이지 331–335, 2008년 12월.