장고 설치 배포 후 어느 정도 완성되어 도메인 구입 후 설정했는데 자꾸 "wecome to nginx!"페이지 만 나온다. 그래서 커스터머 서비스 쪽에도 물어보고 인터넷도 뒤져 본 결과 내 서버상 nginx 설정을 수정해야 한다는 사실을 깨닳았다.

수정해야 할 파일은 /etc/nginx/sites-available/ 안에 있는 nginx 설정 파일이다. 기존에 아이피 주소로 되어 있던 부분을 구입한 도메인 명으로 변경하니 잘 된다.

A random element in a python list can easily extracted with a newly added module called "secrets".

Without secrets module, you may consider a code as show below.


import random

alist= [1,3,4,5,3,2,1]

n = random.randint(0, len(alist)-1))

print(alist[n])


There is no problem in acheiving the goal, but it does not seem pythonic.

In python 3.6, a module called "secrets" was added. It describes as below.


"The secrets module is used for generating cryptographically strong random numbers suitable for managing data such as passwords, account authentication, security tokens, and related secrets."


Using the secrets module you can shorten the codes 2/3 as below. 


import secrets


alist= [1,3,4,5,3,2,1]

print(secrets.choice(alist))


It looks much better, cleaner so pythonic.






리스트에서 무작위로 배열안의 멤버를 추출하는 법을 소개한다.


아래처럼 random모듈로 난수(정수)를 발생시켜 추출하는 방법이 있다.


import random

alist= [1,3,4,5,3,2,1]

n = random.randint(0, len(alist)-1))

print(alist[n])


위 처럼 해도 무작위로 추출하는데 문제는 없다마는 코드가 조잡하고 알아보기 어렵다. 


python3.6에서 secrets 모듈이 새로 생겼다. 암호학 적으로 훨씬 좋은 난수 발생기라고 한다.


"The secrets module is used for generating cryptographically strong random numbers suitable for managing data such as passwords, account authentication, security tokens, and related secrets."


import secrets


alist= [1,3,4,5,3,2,1]

print(secrets.choice(alist))


코드가 3줄에서 두 줄로 줄었고 훨씬 보기 좋다.






메시지를 암호화 해서 상대방에게 전달할 때 암호화 하는 키와 복호화 하는 키가 같으면 (대칭키 방식) 문제가 생길 수 있다. 해당 키를 상대방에게 전달하는 과정에서 키가 노출이 되는 위험이 있을 수 있고 설령 키가 무사히 전달되더라도 다수의 사람이 키를 보관하는 과정에서 유출되기 쉽다.

그래서 1970년 대 이후, 대칭키 방식이 아닌 공개키 방식의 암호화&복호화 방식을 주로 사용하고 있다. 즉 암호화는 Public Key로 누구나 할 수 있지만 복호화는 메시지를 받는 사람, 즉,  Private Key를 가지고 있는 사람만 할 수 있게 하는 방식이다. 공개키 방식의 암호화 방식의 대표적인 예가 RSA 알고리즘인데 일반적으로 두수의 곱은 구하기 쉽지만 그 수의 인수분해는 어렵다는 점을 이용한다. RSA 알고리즘은 아래의 세단계를 거쳐서 메시지를 생성하고 암호화 하고 복호화 한다.

1. Public Key & Private Key 생성 

1) public key (e) 생성

두 소수 (p,q) 선택

 p=5 , q=11

 n= p x q

 n=5 x 11 = 55

 phi = (p-1) x (q-1)

 phi = 4 x 10 = 40

 phi 와 서로소 관계에 있는 임의의 수 e 산출

 7

 e -> Public Key로 결정

 7-> Public Key

2) pivate key (d) 생성
  

e x d mod phi =1  을 만족하는 d 산출 (유클리드 호제법 사용)

 d= 23

 7 x '23' mod 40 = 1

 23-> Private Key


2. 암호화

철수(public key holder)가 영희(private key holder)에게 "9"라는 메시지를 보내려 한다. 철수는 메시지 M(=9)을 공개키 "e"와 "n"을 사용하여 암호화 한다.

Me mod n = C

97 mod 55 = 4,782,969 mod 55 = 4


3. 복호화

영희는 철수에게 받은 "9"라는 메시지를 "d"를 사용하여 복호화 하여 원래 메시지인 9를 알아낸다

Cd mod n = M

423 mod 55 = 70,368,744,177,664 mod 55 = 9


위의 예에서 대중에게 노출되선 절대 안되는 값이 p, q, 그리고 d이다. 이들이 private key 역할을 한다. p, q 중 하나만 공개 되도 누구나 d를 산출할 수 있어 암호 체계는 무너진다.  반면 n과 e는 대중에게 노출이 되는 public key이다.

RSA의 기본 원리는 누구나 n은 알고 있지만 n의 인수인 p와 q를 쉽게 찾을 수 없다는 점에 기인한다. 예시에서는 쉽게 만들기 위해 아주 작은 수를 사용하였지만 실제 p와 q는 상당히 큰 수들이다.  RSA는 p와 q의 곱(n)을 알고 있더라도 그 두 수 (p or q)를 구하는데 상당한 시간이 걸린다는 점을 이용한 알고리즘이다. 



파이썬에 입문했다. 그렇다고 다른 프로그래밍언어를 할 줄 아는 것도 아니다. 프로젝트라고 하기 좀 민망하지만 누구의 도움도 받지 않고 만들어낸 내 첫 프로젝트를 공유한다. ㅎㅎ

알고리즘 과목을 수강하다가 정수로 이루어진 수의 모임을 작은 수 부터 큰 수로 정렬하는 방법을 배웠다. 엑셀의 오름차순 정렬과 같은 것이다. 평소에 아무 생각없이 해왔던 것을 직접 프로그래밍으로 실현하려니까 시간이 꽤 걸렸다. 이 프로젝트에서는 '리스트'와 'for 반복문'을 사용하였다. 수열 안에 숫자가 n개 가 있다면 n x (n-1)/2번 비교해야 답이 나온다.

100개가 들어있는 수열이라고 가정하면 구체적으로 실현 방식은 다음과 같다.

첫 번째 수두번째 수를 비교한 후 첫번째 수가 더 크면 아무 작업도 하지 않지만 두번째 수가 더 크다면 위치를 바꾼다.

그 다음 첫 번째 수세 번째 수를 비교한 후 첫 번째 수가 더 크면 아무 작업도 하지 않지만 세 번째 수가 더 크다면 위치를 바꾼다.

그 다음 첫 번째 수번째 수를 비교한 후 첫 번째 수가 더 크면 아무 작업도 하지 않지만 네 번째 수가 더 크다면 위치를 바꾼다.

.....

그 다음 첫 번째 수번째 수를 비교한 후 첫 번째 수가 더 크면 아무 작업도 하지 않지만 네 번째 수가 더 크다면 위치를 바꾼다.

....

그 다음 두 번째 수번째 수를 비교한 후 첫 번째 수가 더 크면 아무 작업도 하지 않지만 네 번째 수가 더 크다면 위치를 바꾼다.

그 다음 두 번째 수번째 수를 비교한 후 첫 번째 수가 더 크면 아무 작업도 하지 않지만 네 번째 수가 더 크다면 위치를 바꾼다.

그 다음 두 번째 수다섯 번째 수를 비교한 후 첫 번째 수가 더 크면 아무 작업도 하지 않지만 네 번째 수가 더 크다면 위치를 바꾼다.

....

그 다음 세 번째 수네 번째를 비교한 후 첫 번째 수가 더 크면 아무 작업도 하지 않지만 네 번째 수가 더 크다면 위치를 바꾼다.

그 다음 세 번째 수다섯 번째를 비교한 후 첫 번째 수가 더 크면 아무 작업도 하지 않지만 네 번째 수가 더 크다면 위치를 바꾼다.

....

그 다음 아흔 아홉 번째 수백 번째 수를 비교한 후 첫 번째 수가 더 크면 아무 작업도 하지 않지만 네 번째 수가 더 크다면 위치를 바꾼다.

아래는 유저로 부터 수열의 크기와 정수를 받아서 오름차순으로 정렬하는 파이썬 코드이다.


*예외처리는 좀 있어보이려고 넣어보았다. ㅎㅎㅎ


아래 사진은 결과다.

몇개의 정수가 필요한지 물어본다.

5개 넣겠다고 입력하고 5개 정수를 타입한다. 일부러 크기를 뒤죽 박죽으로 넣어 본다.

그럼 결과가 나온다. 오리지날 수열(9,3,5,6,1)이 나오고 비교수행 숫자(10)가 나오고 오름차순으로 정렬된 수열(1,3,5,6,9)가 나온다.

성공이다.

이렇게 프로젝트1을 무사히 끝냈다. 후후

벌써 프로젝트2가 기대된다. 후후

+ Recent posts