수축 발전기
Shrinking generator암호학에서 수축 발전기는 스트림 암호에 사용되도록 의도된 유사란도 수 생성기의 한 형태다. 돈 코퍼스미스, 휴고 크레이지크, 이세이 만수르에 의해 1993년 크립토에서 출판되었다.[1]
수축 발전기는 두 개의 선형 피드백 시프트 레지스터를 사용한다. One, the라고 불리는 A sequence, 출력 비트를 생성하는 반면, 다른 하나는 , 호출하는 S 시퀀스, 출력 제어 둘 다 A 그리고 S 시간 기록되어 있다; 만일 S 비트는 1이고, 그 다음은 A 비트가 출력된 경우: S 비트는 0이다. A 비트는 폐기되고, 아무것도 출력되지 않으며, 레지스터는 다시 클럭 처리된다. 이것은 발전기의 출력 속도가 불규칙적으로 변화한다는 단점을 가지고 있으며, S 상태를 암시하는 방식으로, 이 문제는 출력을 버퍼링함으로써 이 문제를 극복할 수 있다. LFSR에 의해 생성된 무작위 시퀀스는 보안 시스템의 예측 불가능성을 보장할 수 없으며, 그 무작위성을 개선하기 위한 다양한 방법이 제안되었다.
이러한 단순함에도 불구하고 피드백 다항식이 비밀일 때, 현재 철저한 검색보다 더 잘 알려진 공격은 없다. 그러나 피드백 다항식이 알려진 경우, 가장 잘 알려진 공격은 다음보다 적은 양을 필요로 한다. A • S 약간의 [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__": 본래의()