뱀게임 인공지능을 만들어보자.(2)
·
프로그래밍/머신러닝
뱀 게임 인공지능을 만들어보자(1) 이전의 결말대로, 이동방향에 대한 뱀 머리, 몸통을 따로 레이블을 매칭 시켜서 답을 보려 했다. 그런데, 이게 잘 안되었다. 뱀이 계속해서 도는 것도 못하고 오른쪽 벽으로 박으면서 학습이 안되고 있었다. 그래서 다른 방법을 고민해 보았다. 입력 크기를 줄이는 것이다. 난이도가 엄청 쉬워지겠지만, 이왕 잘 안되는 거 쉬운 것부터 해보고 싶다. 입력은 8개로, 뱀 머리를 기준으로 먹이가 있는 위치를 입력으로 전달해줬다. (위 사진의 빨간색 테두리로 강조한 것) 모델의 형태는 아래와 같이 구성했다. (중간은 relu, 마지막은 sigmoid, 학습은 Adam) 모델이 먹이를 먹으면 1점을 보상으로 주고, 벽에 박거나 자신의 꼬리에 박으면 -100점을 보상했다. 대략 500 ..
디피-헬만 키 생성 프로그램(3) - 완료
·
카테고리 없음
이번엔 소수값과 소수의 원시근을 미리 구해놓고 시작을 했다. 잘 찾아보니까 나와있었다. 아래로 들어가면 소수와 원시근 셋이 몇개 나와있다. tools.ietf.org/html/rfc3526#page-3 사실, 학교과제에는 이 키를 이용하여 어떤 암호화 알고리즘을 돌려서 Plain Text를 암호화 해보라는 것이였지만, 그건 이 포스트에 중요할 것 같진 않다. (솔직히 나는 DES암호화 알고리즘을 사용해서 소수크기가 8bytes인 것을 찾느라 짜증났다.) 코드는 모두 깃허브에 올라와 있다. Key 클래스 (PrivateKey, PublicKey, SecretKey)는 아래와 같이 정의했다. class Key: __slots__ = ['val'] def __init__(self, val:int): self...
디피-헬만 키 생성 프로그램(2) - 고민
·
프로그래밍/암호화 프로그램
이제 이전에 만든 RSA 프로그램을 기반으로 만들어보겠다. 간단하게 RSA와 같이 소수를 생성하고 어쩌고저쩌고 하면 되겠구나! 싶었다. 그런데, 예상못한 어려움에 부딪혔다. 랜덤한 소수값은 구할 수 있는데, 그 소수값의 원시근은 어떻게 구할까...? 일단 소수값은 RSA 프로그램에서 했던 것 처럼, 밀러-라빈 소수 판정법을 이용해서 구하면 된다. $$a^{p-1} \equiv 1 \pmod{p}$$ 위의 조건을 갖는 원시근을 찾아야한다. (연산량이 너무 많다...) 그런데.. 열심히 코드를 짜다 보니.... 알게된 것이 있다. 디피헬만의 q(소수) , a(원시근)는 공개된 값이라서 상수로 Fix 해둔 값으로 해도 된다는 것이였다.... 3시간 정도 찾아보고 공부했었는데,,,
디피-헬만 키 생성 프로그램(1) - 이론
·
프로그래밍/암호화 프로그램
오우! RSA 암호화 프로그램을 개발하던 중, 디피 헬만 암호화 프로그램을 구현해 보라는 학교 과제가 생겼다. 먼저, 디피헬만 알고리즘은 이산대수의 복잡성을 보안 기법으로 사용한다. 소수 q와 q의 원시근 a을 사용해서 복잡도가 증가하는데, 키를 만드는 방법은 아래와 같다. (엘리스와 밥으로 예시를 들어서 설명하겠다.) 1. 엘리스는 개인키($X_A$)와 공개키($Y_A$)를 생성한다. $X_A < q$ $Y_A \equiv a^{X_A} \pmod{q}$ 2. 밥은 개인키($X_B$)와 공개키($Y_B$)를 생성한다. $X_B < q$ $Y_B \equiv a^{X_B} \pmod{q}$ 3. 엘리스와 밥은 공개키를 서로 교환한다. 4. 엘리스는 밥의 공개키($Y_B$)로 비밀키($K_A$)를 생성한다..
RSA 암호화 프로그램(2) - encrypt.py, decrypt.py
·
프로그래밍/암호화 프로그램
학교 과제로 개발한 RSA 프로그램이 있으므로, 이것을 개선하는 쪽으로 개발을 진행할 것이다. 코드는 깃허브에 모두 올려져있다. 개발에 참고한 코드는 여기있다. 많은 부분을 카피했다. 파일명은 encript.py이고 내용은 아래와 같다. from argparse import ArgumentParser from util import get_random_prime, get_random_coprime, mod_exp parser = ArgumentParser(description='RSA암호화') parser.add_argument('-f', '--file_path', action="store", dest="file_path", type=str, help="file path", default=None) par..
밀러-라빈 소수 판정법의 검사 반복 횟수는 얼마나 해야할까?
·
프로그래밍/기타
RSA 암호화 프로그램을 만들던 도중, 고민이 생겼다. 소수를 생성할때, 밀러-라빈 소수 판정을 해야 하는데, 몇번 반복해야 하는지를 모르겠다. 그래서 알아보기로 했다. 일반적으로 알고리즘 문제를 풀때는, 다들 대충 이런 공식을 적용하는 것 같다. 검사하는 값이 $2^{32}$보다 작을때 : a값을 [2,7,61]로 함. $2^{64}$보다 작을때 : a값을 [2, 325, 9375, 28178, 450775, 9780504, 1795265022]로 함. 이 숫자는 miller-rabin.appspot.com/ 여기에도 나와있다. 여기까지는 좋다. 근데 만먁 64비트보다 크다면? RSA 알고리즘에 적용할 키 값은 당연히 64보다 커야한다. 2048 정도로 생각하는데, 어떻게 해야할까? 내가 개발할때 참고..
RSA 암호화 프로그램(1) - 이론
·
프로그래밍/암호화 프로그램
이번 포스팅은 RSA 암호화 프로그램을 개발하고자 한다. RSA 암호화 알고리즘은 공개키 암호화 알고리즘으로 개인키와 공개키를 만들어서, 개인키로 암호화를 하면 공개키로만 복호화를 할 수 있고 공개키로 암호화를 하면 개인키로만 복호화를 할 수 있다. 먼저 개인키와 공개키를 만들어보자 (간단하다!) 개인키와 공개키 만들기 1. 소수인 $ p, q $를 무작위로 뽑는다. 2. n을 구한다. $n = p \times q$ 3. 오일러 수를 구한다. $\Phi = (p - 1)(q - 1)$ 4. $\Phi$와 서로소인 정수 $e$를 구한다. 5. $e \times d \pmod{\Phi} = 1$ 인 $d$를 구한다. 여기서 개인키는 $(d, n)$, 공개키는 $(e, n)$이다. 암호화 복호화 개인키를 이용..
[Pygame/오류] Pygame에서 응답없음
·
프로그래밍/기타
whlie문 안에서 뭔가를 그리는 동작을 수행 할 때, 위와 같은 오류가 나온다면 다음과 같은 코드를 while문 안에 넣어주자. for event in pygame.event.get(): if event.type==pygame.QUIT: pygame.quit() sys.exit() 참고 : stackoverflow.com/questions/14720377/pygame-window-hang
2jun0
2jun0의 블로그