728x90
728x90

 

 

otp 길이에 원하는 자릿수를 입력하면

otp값을 출력해준다

 

 

import time

class LFSR:
def __init__(self, seed, taps):
self.state = seed
self.taps = taps

def step(self):
nextbit = sum([self.state[i] for i in self.taps]) % 2
self.state.append(nextbit)
return self.state.pop(0)

def lfsr_otp(length):
seed = int(time.time() * 1000) #밀리세컨드까지 사용
seed = [int(i) for i in bin(seed)[-16:].zfill(16)]
lfsr = LFSR(seed, [15, 13, 12, 10])
return ''.join(str(lfsr.step()) for _ in range(length))

print(lfsr_otp(int(input("OTP 길이: "))))

 

 

  1. import time: time 모듈을 임포트합니다. 이 모듈은 현재 시간을 사용하기 위해 사용됩니다.
  2. class LFSR: LFSR 클래스를 정의합니다. LFSR은 비트 시프트 연산을 통해 이전 상태의 비트들을 조합하여 다음 상태를 생성하는 레지스터입니다.
  3. def __init__(self, seed, taps): LFSR 클래스의 생성자 함수를 정의합니다. 이 함수는 seed와 taps 매개변수를 받습니다. seed는 초기 상태를 나타내는 이진수 리스트이고, taps는 피드백을 받을 비트의 인덱스를 나타내는 리스트입니다.
  4. self.state = seed: 현재 상태를 나타내는 변수 state를 초기화합니다.
  5. self.taps = taps: 피드백을 받을 비트의 인덱스를 저장합니다.
  6. def step(self): step 함수를 정의합니다. 이 함수는 LFSR의 한 단계를 수행하고 다음 비트를 반환합니다.
  7. nextbit = sum([self.state[i] for i in self.taps]) % 2: 다음 비트를 생성하기 위해 taps에 해당하는 비트들을 XOR 연산하여 합을 구합니다. 그리고 2로 나눈 나머지를 구하여 nextbit 변수에 저장합니다. 이 값을 다음 단계에서 반환할 것입니다.
  8. self.state.append(nextbit): nextbit을 현재 상태에 추가합니다.
  9. return self.state.pop(0): 현재 상태의 첫 번째 비트를 제거하고 반환합니다.
  10. def lfsr_otp(length): lfsr_otp 함수를 정의합니다. 이 함수는 OTP를 생성하기 위해 LFSR을 사용합니다. length 매개변수는 생성할 OTP의 길이를 나타냅니다.
  11. seed = int(time.time() * 1000): seed 변수에 현재 시간을 밀리세컨드 단위로 가져와 저장합니다.
  12. seed = [int(i) for i in bin(seed)[-16:].zfill(16)]: seed를 이진수로 변환하고, 뒤에서부터 16비트를 선택하여 리스트로 만듭니다. zfill 함수를 사용하여 리스트의 길이가 항상 16이 되도록 왼쪽을 0으로 채웁니다.
  13. lfsr = LFSR(seed, [15, 13, 12, 10]): seed와 피드백을 받을 비트의 인덱스 [15, 13, 12, 10]를 사용하여 LFSR 객체를 생성합니다.
  14. return ''.join(str(lfsr.step()) for _ in range(length)): length 만큼 lfsr.step()을 호출하여 OTP를 생성합니다. 각 호출 결과를 문자열로 변환하고, 이들을 연결하여 최종 OTP를 생성합니다.
  15. print(lfsr_otp(int(input("OTP 길이: ")))): OTP의 길이를 입력 받고, lfsr_otp 함수를 호출하여 생성된 OTP를 출력합니다.
728x90
300x250

+ Recent posts