728x90
728x90
728x90
728x90

암호화 종류

암호화는 크게 3가지로 나눌 수 있다.

 

1. 대칭키 암호화

암호화 키가 1개이며 엑셀이나 ZIP파일을 암호화할 때 사용한다.

암호화 로직을 공개하고 암호화 키를 비공개하여 암호화 키를 모를 경우에 풀이 난이도가 상승하는 암호화 방식

암호화 키를 하나씩 대입하여 암호를 푸는 경우 몇백 년 정도의 시간이 걸리기 때문에 짧은 시간 내에 암호를 풀어야 할 경우에는 암호화 방식 특성상 안전하다고 생각한다.

종류에는 DES, AES, SEED 등이 있다.

 

2. 비대칭키 암호화

비대칭키는 공개키와 개인키로 2개의 암호화 키가 있다. 공개키는 말 그대로 공개된 키이며 개인키는 사용자만 알고 있는 키이다. 공개키로 암호화를 할 경우 개인키로 복호화할 수 있고 반대로 개인키로 암호화한 경우 공개키로 복호화할 수 있다. 비대칭키 암호화 방식은 공개키로 암호화하는 경우와 개인키로 암호화하는 경우로 나눌 수 있는데 공개키로 암호화했다면 데이터 보안에 중점을 둔 것이고, 개인키로 암호화했다면 안전한 전자서명을 통한 인증 과정에 중점을 둔 것으로 해석할 수 있다. 비대칭키의 대표 알고리즘은 RSA, 디피-헬만, 타원곡선 암호 등이 있다.

 

3. 단방향 암호화 (해시)

단방향 암호화는 보통 검증을 위해 사용하거나 평문을 모르게 하기위해 사용한다. 1비트만 달라져도(일부러 같은 해시값을 가지도록 조작하기 힘듬) 단방향 암호화 결과값이 달라지기 때문에 파일의 유효성을 검증하는데 사용한다.

해시는 암호문을 평문으로 복원할 수 없기 때문에 평문을 알아낼 필요가 없는 곳에 쓰이는데 대표적으로 사이트 비밀번호를 함호화 하는데 쓰인다.

레인보우 테이블 솔트


참고문헌

구글과 파이썬으로 시작하는 보안

728x90
728x90

'암호학' 카테고리의 다른 글

중국인의 나머지 정리  (0) 2022.03.01
공개키암호 RSA  (0) 2022.02.06
블록암호 DES  (0) 2022.01.31
블록암호 AES  (0) 2022.01.25
암호의 역사  (0) 2021.11.04
728x90
728x90

OWASP top 10

OWASP(Open Web Application Security Project)는 2001년도에 만들어진 국제 온라인 보안 단체이다.
OWASP 가 진행한 프로젝트 중 가장 유명한 것은 OWASP Top 10 인데, 이는 매 2~3년마다 업데이트되며 웹에서 가장 중요한 보안 취약점을 10개를 정리한 문서이다.

 

2021년에 달라진 점

새로운 카테고리 3개가 생겼고 4개의 카테고리는 범위와 이름이 변경되었으며 몇 개의 카테고리는 통합되었다.

 

TOP 10

01 : Broken Access Control

취약한 접근 제어는 2017년 5위에서 2021년 1위로 중요도가 상승하였다. 접근 제어란 사용자가 자신의 권한을 벗어난 행동을 할 수 없도록 제한하는 것을 말한다. 그 제한이 올바르게 작동하지 않을 때를 취약한 접근 제어라 한다. 취약한 접근 제어는 개인정보 탈취 뿐만 아니라 개인정보를 수정하거나 삭제하는 공격으로 이어질 수 있다.

  • 버그 또는 설계 결함으로 인한 권한 상승
  • CORS의 잘못된 구성으로 인해 신뢰할 수 없거나 허가되지 않은 소스에서 API 액세스 허용
  • 인증이 필요하거나 권한이 있는 페이지 접근 허용


02 : Cryptographic Failures

암호화 오류는 민감한 개인정보를 암호화하지 않거나 취약한 암호화 알고리즘을 사용하는 것을 의미한다.

이 항목은 "민감한 데이터 유출"이였지만 원인보다 결과를 중점으로한 이름이였기에 변경하였다.

  • 중요한 데이터를 일반 텍스트로 저장 또는 전송
  • 오래되었거나 취약한 암호화 알고리즘 사용
  • 서버 인증서 및 신뢰 체인의 유효성을 제대로 검사하지 않음


03 : Injection

주입 공격이란 임의의 쿼리 또는 명령을 실행하여 웹 사이트의 데이터를 변경하거나 데이터 베이스를 조회, 수정, 삭제하는 공격이다.
가장 대표적인 injection 공격은 SQL injection과 사이트 간 스크립팅(XSS) 공격이 있다.

  • 사용자가 입력한 데이터를 검증, 필터링 하지 않음


04 : Insecure Design

안전하지 않은 설계 취약점은 설계와 아키텍처의 결함에 중점을 둔다.

구현의 결함과 다른 것으로 취약한 설계로 잘 구현된 것은 여전히 공격에 취약하다.

소프트 웨어 개발 단계가 계획/분석 -> 설계 -> 구현 -> 검증 -> 배포 이런식으로 흘러간다면

초기 단계(설계)에서 생기는 오류는 중간 단계(구현)에서 보완할 수 없다는 뜻인 듯 합니다.


05 : Security Misconfiguration

취약한 환경설정

  • 응용프로그램의 모든 부분에서 보안 강화 부족
  • 클라우드 서비스에 대한 사용 권한이 잘못 구성됨
  • 포트, 서비스, 페이지, 계정 또는 권한과 같은 불필요한 기능 허용 또는 설치
  • 기본 계정/암호가 사용 가능 또는 변경되지 않음
  • 사용자에게 표시되는 오류 메시지에 스택 추적 또는 기타 중요한 정보가 포함됨
  • 최신 보안 기능이 활성화 또는 구현되지 않음
  • 소프트웨어가 최신 버전이 아님

 

06 : Vulnerable and Outdated Components

취약하거나 오래된 구성요소 사용

  • 사용하는 클라이언트측 및 서버측 구성 요소의 버전을 모를 경우
  • 소프트웨어가 취약하거나, 지원되지 않거나, 최신 버전이 아닌 경우
  • 개발자가 업데이트 또는 패치된 라이브러리의 호환성 테스트를 수행하지 않는 경우
  • 구성 요소의 구성이 안전하지 않은 경우


07 : Identification and Authentication Failures

식별 및 인증 오류

  • 자동화된 공격으로부터 보호되지 않음
  • 무차별 공격 허용
  • 기본 암호, 취약하거나 잘 알려진 암호 사용 허용
  • 다요소 인증을 사용하지 않거나 유효하지 않음
  • URL에서 식별된 세션 노출
  • 로그인 후 식별된 세션 재사용
  • 로그아웃 또는 비활성 상태일 때 사용자 세션 및 인증 토큰이 제대로 무효화되지 않음


08 : Software and Data Integrity Failures

소프트웨어 및 데이터 무결성 오류는 무결성이 검증되지 않은 소프트웨어 업데이트, 중요 데이터 및 CI/CD 취약성과 관련된다.


09 : Security Logging and Monitoring Failures

보안 로깅 및 모니터링 오류는 "충분하지 않은 로깅과 모니터링"에서 더 많은 유형의 보안 취약점을 포함하도록 확장되었다.

  • 로그인, 실패한 로그인 및 기타 유형의 이벤트가 기록되지 않음
  • 경고 및 오류로 인해 메시지가 생성되지 않거나 명확하지 않음
  • API 및 응용 프로그램 로그에서 의심스러운 작업을 검사하지 않음
  • 로그만 로컬로 저장하는 경우
  • 응용 프로그램을 실시간으로 공격을 탐지 또는 경고할 수 없음

 

10 : Server-Side Request Forgery

SSRF는 사용자가 요청한 URL의 유효성을 검사하지 않을 때 발생한다. 이를 통해 공격자는 방화벽, VPN 또는 다른 유형에 의해 보호되더라도 조작된 요청을 예기치 않은 대상에게 전송하도록 강제할 수 있다.


참고문헌

OWASP TOP 10 공식문서

crashtest-security : OWASP TOP 10 2021 – THE ULTIMATE VULNERABILITY GUIDE

728x90
728x90

'해킹' 카테고리의 다른 글

sql injection  (0) 2023.04.01
SSTI 취약점  (0) 2022.01.11
Cross Site Scripting (XSS)  (0) 2021.12.22
Same Origin Policy & Cross Origin Resource Sharing  (0) 2021.12.20
구글 도크 (Feat. 디렉토리 리스팅)  (0) 2021.10.14
728x90
728x90

레지스터

cpu에서 연산을 위해 데이터를 일시적으로 저장하는 공간이며 영어로는 register로 등록/기록을 의미하는 영단어이다.

레지스트리와 이름이 비슷하다고 헷갈리지 말자

레지스트리는 OS의 설정 및 정보를 담고있는 데이터베이스이다.

레지스터의 종류에는

    범용 레지스터 : 임시 저장 공간이며 계산, 주소 지정 등의 목적으로 사용한다.

    포인터 레지스터 : 메모리 스택 영역과 관련된 주소 값을 저장한다.

    인덱스 레지스터 : 문자열 복사/비교와 관련된 레지스터이다.

    세그먼트 레지스터 : 다양한 크기로 구분을 하는 목적으로 사용되며 16bit로 구성된다.

    플래그 레지스터 : 실행 순서을 제어하기 위한 목적을 사용한다.

가 있다.

일단 범용 레지스터를 제외한 다른 레지스터들은 필요할 때 다시 포스팅 할 예정 사실 아직 안배웠음


범용 레지스터

범용 레지스터는 EAX, EBX, ECX, EDX 등이 있다. (32bit cpu 기준)

레지스터 EAX는 레지스터 AX(16bit)를 포함하고 AX다시 AH(8bit)와 AL(8bit)로 구성된다.

EBX 또한 BX로 구성되어 있고 BX는 BH와 BL로 구성되어 있다. ECX, EDX 또한 마찬가지

64bit의 경우 EAX를 포함하는 레지스터 RAX(64bit)가 있다. 여기서 R은 register의 R이며 EAX의 E는 extended의 E이다.

 

EAX에 16진법으로 표현된 값 "1234A6C8"이 저장된다면

AX에는 16진법으로 "A6C8"이 저장되고 AH에는 "A6" AL에는 "C8"이 저장된다.


용도

범용 레지스터는 용도를 정해두지 않고 다양하게 쓸 수 있는 레지스터입니다. x32의 범용 레지스터는 총 8개로 원칙적으로 용도가 정해져 있진 않지만, 관행적으로 그 쓰임새가 정해져 있는 경우도 있습니다.


참고문헌

인프런 - 유용한IT학습님의 어셈블리어 배우기

네이버 블로그 -  뽀구님의 어셈블리어 레지스터

hidaehyunlee님의 어셈블리 프로그램 구조와 x64 레지스터 이해하기

티스토리 블로그 - Wooeong's lab님의 리버싱 기초 지식 : 레지스터

 

728x90
728x90

'어셈블리어' 카테고리의 다른 글

어셈블리어 [3] 명령어 (Feat. 플래그 레지스터)  (0) 2021.12.08
어셈블리어 [1] 기초  (0) 2021.10.20
728x90
728x90

검색과 개발

“검색을 안하면 개발을 못하는 개발자”는 인터넷을 뒤져서 본인이 이해하지도 못한 코드를 복붙하는 개발자를 비판하려는 의도인 것 같습니다. 이런 비판 때문에 검색을 안하며 개발하는 개발자들이 있습니다.

 

하지만 반대로 “검색을 안하며 개발하는 개발자”도 위험할 수 있습니다. 검색은 내가 이미 알고 있는 방법보다 더 좋은 방법이 있는지 찾는 것 이기때문입니다. 경력이 많은 개발자 중, 10년~20년 전에 쓰이던 기술이나 방법만을 고집하는 분들을 종종 봅니다. 최신 기술이 항상 좋은 것은 아니지만 2020년에 새로운 사이트를 개발하면서 Python 2.7과 jQuery를 선택한다면 대체로 부적절한 판단일 가능성이 높습니다. 하지만 의외로 이런 경우가 제법 있습니다.

 

지금 풀려는 문제를 모르겠으면 검색을 해야 합니다. 지금 풀려는 문제가 너무 익숙해도 검색을 하면 좋습니다. 검색을 안 하면 개발을 못하는 개발자도 위험하지만, 검색을 안 하면서 개발하는 개발자도 위험합니다.


구글에서 검색하기

대체로 구글이 다른 검색 엔진에 비해 뛰어납니다.
심지어 네이버 API를 잉용하는 방법을 찾을 때에도 네이버보다 구글이 더 좋은 검색결과를 보여줍니다.


검색은 영어로

IT 관련 분야의 대부분의 정보는 영어로 생산되기 때문에 한국에 특화된 문제를 검색하는 경우를 제외하고는, 영문으로 검색할 때 더 좋은 결과를 얻을 수 있습니다.

심지어 모든 분야에서 영어로 검색하는 것이 좋다는 우스갯소리로 "한국사도 영어로 검색한다"는 말이 있습니다.

 

검색 엔진의 기능을 잘 쓰기

구글에서는 특정 단어를 큰따옴표에 넣어 검색하면 좀 더 정확한 검색을 할 수 있고 '-검색어'를 추가하여 특정 검색어를 제외한 결과를 얻을 수 있다. 더 많은 구글 검색엔진 기능

6) "키워드 검색"
키워드가 그대로 들어가 있는 검색을 하고 싶다면 해당 키워드를 " " 안에 포함해서 검색하면 된다.
eg)  python randint vs randrange 검색 시 관련 내용이 검색되고, python "randint vs randrange" 로 검색 시 ""안에 키워드가 무조건 포함된 게 검색된다.

7) +포함 , -제외
파이썬으로 엑셀자동화하는 방법을 검색할 때 openpyxl이 제외된 결과를 보고싶다면,

(python excel automation library -openpyxl)를 검색하면 된다.


검색 결과 중 클릭할 문서 잘 찾기

검색 결과, 적절한 문서가 나왔음에도 불구하고 엉뚱한 문서를 클릭해서 읽는 경우가 있습니다.
적절한 문서를 추려내 ctrl+click(맥은 ctrl+click 또는 휠 클릭)으로 여러개의 문서를 열어두고 하나씩 읽으면 편리합니다.

정보의 시의성

내가 찾고자 하는 문제의 맥락에 비추어 시의성이 적절한지 판단할 필요가 있습니다.
예를 들어 자바스크립트 Array와 관련된 검색을 했는데, 2010년 문서와 2019년 문서가 각각 나왔다면 2019년 문서를 보는 것을 추천합니다. 자바스크립트는 최근 10년 사이에 많이 변했기 때문입니다.
라이브러리, 프레임워크 (수개월)
각종 표준, 프로그래밍 언어, 운영체제 (수개월~수년)
각종 프로세스, 설계 방법론 등 소프트웨어 공학에서 다루는 주제들 (수년~수십년)
알고리즘, 자료구조, 프로그래밍 언어론, 운영체제론 등 주로 전산학에서 다루는 주제들 (수십년)

구글의 경우 검색창 아래에 Tools를 클릭하여 Any Time를 설정하여 최근 문서를 검색할 수 있습니다.

검색어 바꿔보기

검색 결과에 딱히 마음에 드는 문서가 없으면 페이지를 넘기기 보다 검색 키워드를 바꿔보길 추천합니다. 검색어만 제대로 입력하면 대체로 최상단에 원하는 결과가 나옵니다. 검색 결과 하단에 있는 “Searches related to…” 부분을 참고하여 관련 키워드를 찾아보는 것도 좋습니다.

버전 확인하기

프로그래밍 언어나 운영체제 등은 버전에 따라 적절한 정보가 다릅니다.
파이썬의 경우 특히 버전2와 버전3는 제법 큰 차이가 있으니 버전을 정확히 확인하는 것이 좋습니다.
[언어][필요시 버전][핵심 검색어][필요시 OS]으로 검색


원하는 결과가 잘 안나오면…

10분 이상 찾았는데도 모르겠으면 이 문제에 대해 지나치게 모르고 있기 떄문입니다. 그럴때면 공식 가이드라인, 공식 레퍼런스, 좋은 교과서, 논문, 위키백과 등을 찾아 읽으며 맥락 파악을 하는 편이 좋습니다.
사실은 어떤 라이브러리나 프레임워크를 이용하기 전에 반드시 공식 사이트에서 제공하는 기본적인 문서(레퍼런스 제외)를 꼼꼼하게 읽어두는 것이 좋습니다.

 

지식의 감가상각과 잔존가치

지식에도 감가상각이 있습니다. 어떤 지식은 잔존 가치가 더 빠르게 줄어들고 어떤 지식은 더 오래갑니다. 앞서 말씀드린 바와 같이, 최신성이 중요한 문제라면 더 자주 검색을 해보면 좋습니다. 오래가는 지식을 쌓아가려는 노력과 빠르게 변하는 지식을 갱신하려는 노력을 병행해야 합니다.


참고문헌

개발자를 위한 정보 검색 팁 :: -[|]- Box and Whisker

728x90
728x90
728x90
728x90

암호의 역사

인류의 수천 년 속에서 위대한 왕과 장군들은 적에게 중요한 정보가 들어가지 않을까 우려했고
이에 각국 정부는 안전한 암호를 만드는 부서를 운영하였고 적국에서는 비밀을 빼내려는 암호 해독가를 양성했다.
암호의 역사는 암호를 만드는 사람들과 암호를 해독하려는 사람들이 벌여온 전쟁의 역사이다.

암호의 어원은 그리스어의 비밀이란 뜻을 가진 크립토스(Kryptos)로 알려져 있다.
이는 평문을 해독 불가능한 형태로 변형하거나 암호화된 통신문을 원래의 해독 가능한 상태로 변환하기 위한 모든 수학적인 원리, 수단, 방법 등을 취급하는 기술이나 과학을 말한다.

암호 기술의 발전 역사를 구분할 때 흔히 두 번의 큰 전환점을 기준으로

고대 암호, 근대 암호, 현대 암호 등의 세 단계로 나눠진다.
첫 번째 전환점은 1920년대, 1, 2차 세계 대전
두 번째 전환점은 컴퓨터를 이용한 암호 기술
이러한 전환점을 기준으로 고대로부터 1, 2차 세계 대전 이전가지 사용된 초보적인 암호 기술들을 고대 암호라고 하면,
1970년대까지 복잡한 기계 장치와 전자 장치들을 이용한 암호 기술을 근대 암호, 컴퓨터가 개발된 이후 컴퓨터를 이용하는 암호 기술을 현대 암호라고 부른다.


고대 암호

고대 봉건 사회에서는 지방 관리에게 보내는 비밀문서, 전쟁 중의 작전 지시와 보고, 첩자들과의 통신 등에 다양한 비밀통신 기법들이 사용되었다.
예를 들어, 멀리 기밀 정보를 전달해야 하는 경우에는 사자의 머리를 깎고 메시지를 쓴 후 머리를 길러서 보내면 받는 측에서는 사자의 머리를 깎고 메시지를 읽도록 하였다.
또 종이에 쓴 메시지가 그냥 보이지 않지만 불빛에 약품 처리를 하면 메시지가 나타나도록 하는 방법, 비밀 노출을 방지하기 위해 말로 전달하도록 하는 방법 등이 다양하게 사용되었다.
이러한 비밀 통신 방법을 스테가노그래피(Steganography)라고 하는데 적들도 이 통신 방식을 알고 있으면 비밀을 유지하기 어렵다는 한계를 갖고 있다.

 

스키테일 암호

현재까지 기록된 역사 속에 최초로 등장한 암호는 ‘스키테일’로도 잘 알려진 이른바 ‘치환 암호’다.

기원전 500년 경 스파르타에서는 전쟁 중 왕의 명령을 전할 때 이 스키테일을 활용했다. 원리는 다음과 같다.
우선 전쟁에 나가는 군대가 왕과 굵기가 같은 원통형 막대기를 나눠 갖고, 메시지를 전달해야 될 상황이 오면 리본을 원통에 둘둘 말아 그 위에 메시지를 적는다.
이후 리본을 풀어 보면 일정한 간격으로 글자가 채워지는데, 빈 공간에 아무 글씨나 채워 넣으면 같은 지름의 원통을 가진 이들만 해당 암호를 해독할 수 있게 된다.

 

시저(Caesar) 암호

율리우스 카이사르가 사용했던 ‘카이사르 암호'

a를 d로 치환했으면, b는 e로, c는 f로 치환하는 방식으로 마지막 z는 c가 된다. 즉, d부터 시작하는 알파벳으로 글을 쓰고 이를 통해 중요한 내용을 전할 수 있다. 만약 Rome을 카이사르 암호를 활용해 암호화하면, ‘urph’라는 알 수 없는 단어가 등장하게 된다.


근대 암호

기계의 발달, 그리고 제 1·2차 세계대전으로 암호학은 비약적으로 발전했다.
근대 암호는 전자기계식 암호화 장치를 이용하는 기계 암호를 특징으로 한다.
이전에도 암호 대치 표나 막대 등의 보조도구를 사용하였지만,
기계를 도입함으로서 본격적으로 복잡한 수학 이론을 적용할 수 있었기에 해독에 상당한 어려움이 있었다.

 

에니그마

T를 입력하면 플러그보드와 3개의 회전자, 반전자를 거쳐 알파벳 G로 암호화된다.

기계 암호로 가장 대표적인 것은 에니그마이다.

에니그마는 1918년 독일에서 발명된 암호화 기계로, 원래 상업적 목적으로 쓰였고 제1차 세계대전에서 독일군이 사용하면서 유명해졌다.

 

에니그마는 알파벳을 입력하는 타자기와 암호키가 내장된 회전자, 회전자를 연결하는 전기 배선, 그리고 반전자로 구성되어있다.

에니그마에는 각기 다른 암호키를 가진 3~5개의 회전자가 전기적으로 연결되어 있어, 타자기로 평문을 입력하면 회전자에 의해 다중으로 치환된 암호문이 출력된다.

이 암호문을 회전자와 배선, 반전자의 설정이 동일한 에니그마에 다시 입력하면 평문이 출력되면서 복호화가 이루어진다.
독일군은 에니그마의 보안성을 높이려고 반전자를 도입하고 의도적인 오·탈자까지 내었기 때문에,
똑같은 설정의 에니그마가 없으면 암호 해독은 거의 불가능하지만, 연합군의 암호 해독팀은 연산 기계를 이용해 에니그마를 해독하는 데 성공하였고, 이는 연합군의 승전에 큰 기여를 하게 된다. 이미테이션 게임연합군의 연산 기계는 컴퓨터의 시초가 되었다고 한다.


현대 암호

현대 암호는 1970년대 후반 스탠퍼드 대학과 MIT 대학에서 시작되었다. 1976년 스탠퍼드 대학의 Diffie와 Hellman은 ‘암호의 새로운 방향(New Directions in Cryptography)’이라는 논문에서 처음으로 공개키 암호의 개념을 발표하였다. 종래의 관용 암호 방식 또는 대칭키 암호 방식에서는 암호화 키와 복호화 키가 동일한 비밀키를 사용하기 때문에 송신자와 수신자는 비밀 통신을 하기 전에 비밀키를 공유하고 있어야 한다. 반면 공개키 암호 방식에서는 하나의 쌍이 되는 공개키와 비밀키를 생성하여 암호화에 사용되는 공개키는 공개하고, 복호화에 사용되는 비밀키는 사용자가 안전하게 보관하도록 한다. 공개키 암호 방식에서는 송신자와 수신자가 사전에 키를 공유할 필요가 없기 때문에 불특정 다수 사용자 간에 사전 준비가 없이도 암호 통신망을 구축하는데 유용하게 사용할 수 있다.

이어 1978년 MIT 대학의 Rivest, Shamir, Adleman은 소인수 분해 문제에 기반을 둔 RSA 공개키 암호를 개발했는데, 이것은 오늘까지도 가장 널리 사용되는 공개키 암호 방식이다. 공개키 암호의 도입은 현대 암호의 발전에 중요한 계기가 되었다.

한편, 1977년 미국 상무성 표준국(NBS, 현 NIST)은 전자계산기 데이터 보호를 위한 암호 알고리즘을 공개 모집하여, IBM 사가 제안한 DES (Data Encryption Standard)를 표준 암호 알고리즘으로 채택했다. DES의 표준화를 계기로 하여 금융 시스템을 중심으로 상업용 암호화의 이용이 증가하게 되었고 컴퓨터 통신망을 이용한 문서 전송, 전자 자금 이체 등이 활성화되었으며 암호 방식이 일반인들에게 알려지고 널리 사용되는 계기가 되었다.

이전의 암호 방식에서는 사용하는 키뿐만 아니라 암호 알고리즘도 비밀로 하여 암호문의 비밀을 지키려고 하는 경우도 있었으나, 현대 암호에서는 암호 알고리즘을 공개하도록 하고 있다. 1883년 Auguste Kerckhoff는 암호 시스템의 안전성에 대해 ‘키 이외에 암호 시스템의 모든 것이 공개되어도 안전해야 한다’고 했는데 이것을 Kerckhoff’s principle이라고 한다. 이렇게 함으로써 암호 방식의 안전성을 공개적으로 검토하게 하여 안전성을 확인하는 것이다.


참고문헌

KISA 암호 기술의 역사

STAR Library 암호이야기

728x90
728x90

'암호학' 카테고리의 다른 글

중국인의 나머지 정리  (0) 2022.03.01
공개키암호 RSA  (0) 2022.02.06
블록암호 DES  (0) 2022.01.31
블록암호 AES  (0) 2022.01.25
암호화 종류  (0) 2021.12.04
728x90
728x90

정규표현식이란

정규표현식이란 규칙을 가진 문자열을 표현하는데 사용하는 형식 언어입니다.
주로 문자열의 검색과 치환을 위해 사용하고 있습니다.
문자열이 특정한 조건을 만족하는지 분류가 필요한 경우 조건문을 사용하면 복잡하지만,
정규표현식을 이용하면 간단하게 분류 할 수있습니다.
하지만 간단한 만큼 가독성떨지는 단점이 있습니다.

 

표현식 의미
^x 문자열의 시작을 표현하며 x 문자로 시작됨을 의미한다.
x$ 문자열의 종료를 표현하며 x 문자로 종료됨을 의미한다.
.x 임의의 한 문자의 자리수를 표현하며 문자열이 x 로 끝난다는 것을 의미한다.
x+ 반복을 표현하며 x 문자가 한번 이상 반복됨을 의미한다.
x? 존재여부를 표현하며 x 문자가 존재할 수도, 존재하지 않을 수도 있음을 의미한다.
x* 반복여부를 표현하며 x 문자가 0번 또는 그 이상 반복됨을 의미한다.
x|y or 를 표현하며 x 또는 y 문자가 존재함을 의미한다.
(x) 그룹을 표현하며 x 를 그룹으로 처리함을 의미한다.
(x)(y) 그룹들의 집합을 표현하며 앞에서 부터 순서대로 번호를 부여하여 관리하고 x, y 는 각 그룹의 데이터로 관리된다.
(x)(?:y) 그룹들의 집합에 대한 예외를 표현하며 그룹 집합으로 관리되지 않음을 의미한다.
x{n} 반복을 표현하며 x 문자가 n번 반복됨을 의미한다.
x{n,} 반복을 표현하며 x 문자가 n번 이상 반복됨을 의미한다.
x{n,m} 반복을 표현하며 x 문자가 최소 n번 이상 최대 m 번 이하로 반복됨을 의미한다.
[xy] 문자 선택을 표현하며 x 와 y 중에 하나를 의미한다.
[^xy] not 을 표현하며  x 및 y 를 제외한 문자를 의미한다.
[x-z] range를 표현하며 x ~ z 사이의 문자를 의미한다. 
\^ escape 를 표현하며 ^ 를 문자로 사용함을 의미한다.
\b word boundary를 표현하며 문자와 공백사이의 문자를 의미한다.
\B non word boundary를 표현하며 문자와 공백사이가 아닌 문자를 의미한다.
\d digit 를 표현하며 숫자를 의미한다. 
\D non digit 를 표현하며 숫자가 아닌 것을 의미한다. 
\s space 를 표현하며 공백 문자를 의미한다. 
\S non space를 표현하며 공백 문자가 아닌 것을 의미한다.
\t tab 을 표현하며 탭 문자를 의미한다.
\v vertical tab을 표현하며 수직 탭(?) 문자를 의미한다.
\w word 를 표현하며 알파벳 + 숫자 + _ 중의 한 문자임을 의미한다. 
\W non word를 표현하며 알파벳 + 숫자 + _ 가 아닌 문자를 의미한다. 

 

정규표현식을 사용할 때 Flag를 사용하지 않으면 문자열에 대해서 검색을 한번만 처리하고 종료하게 된다.

Flag는 다음과 같은 것들이 존재한다.

 Flag 의미 
g Global 의 표현하며 대상 문자열내에 모든 패턴들을 검색하는 것을 의미한다. 
i Ignore case 를 표현하며 대상 문자열에 대해서 대/소문자를 식별하지 않는 것을 의미한다.
m Multi line을 표현하며 대상 문자열이 다중 라인의 문자열인 경우에도 검색하는 것을 의미한다. 

정규표현식 예시

핸드폰 번호 정규식

regex = /^\d{3}-\d{3,4}-\d{4}$/;

^ : 처음 (숫자 3개 앞에 아무것도 없어야 함)

\d{3} : (3자리 숫자)

- : 하이픈 존재

\d{3,4} : (3자리 또는 4자리 숫자)

\d{4} : (4자리 숫자)

$ : 끝

 

이메일 정규식

regex = /^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$/i;

/^[0-9a-zA-Z] : 첫 문자는 숫자 또는 영문 대소문자로 시작

([-_.]?[0-9a-zA-Z])* : 

                        [-_.]? : - _ .  중 하나가 있어도 되고 없어도 되고

                        [0-9a-zA-Z] : 숫자 또는 영문 대소문자

                        * : 연속으로 몆개씩 있어도 됨

[a-zA-Z]{2,3} : 엉문 대소문자가 2개 또는 3개 존재

i : 대소문자 구분 x 근데 이럴거면 a-zA-Z할 필요 없는거 아닌가?


참고문헌

HAMA 블로그 - 정규표현식 정리

정규 표현식 테스트

728x90
728x90
728x90
728x90

유클리드 호제법

호제법(互除法)이라는 말은 서로(互) 나누기(除)라는 뜻으로 그리스의 수학자 유클리드의 저서 원론에 적혀있는 최초의 알고리즘으로서  최대공약수를 구하는 방법이다.

 

명제 및 알고리즘

두 양의 정수 a, b(a > b)에 대하여 gcd(a, b) = gcd(a, (b mod b))이다

gcd(a, b)a, b의 최대공약수를 뜻하며 a mod bab로 나눈 나머지이다.

 

파이썬 알고리즘은 다음과 같다

def E(a, b):
    while b != 0:
        r = a % b
        a = b
        b = r
    return a

증명

gcd(a, b) = G 라하면 적당한 서로수인 정수 A, B에 대해 a = GA, b = GB가 성립한다.

이를 a = bq + r에 대입하면

GA = GBq + r이고

r = G(A - Bq)이다.

 

한편, A - BqB의 관계가 gcd(B, A - Bq) = m (m 1) 즉, A - BqB가 서로소가 아니라고 한다면

B = mk, A - Bq = ml이 성립한다.

A = ml + Bq = ml +mkq = m(l + kq)이므로

mAB의 공약수임을 알수 있다.

그런데 A, B는 서로수 이므로 m = 1이 된다.

처음 가정했던 m ≠ 1과 모순이므로 m≠ 1이 틀렸고

즉, A - BqB는 서로수 이고

"두 양의 정수 a, b(a < b)에 대하여 gcd(a, b) = gcd(b, (a mod b))이다"는 참인 명제가 된다.


활용

1298, 34782의 최대공약수

gcd(34782, 1298) = gcd(1298, 1034), 1298 mod 1034 = 1034

gcd(1298, 1034) = gcd(1034, 264), 1034 mod 264 = 242

gcd(1034, 264) = gcd(264, 242), 364 mod 242 = 22

gcd(264, 242) = gcd(242, 22), 242 mod 22 = 0

따라서 1298, 34782의 최대공약수는 22


참고문헌

Library of Koreandria 블로그 인류 최초의 알고리즘 - 유클리드 호제법

2021월 10월 29일 - 명제 및 알고리즘에서 a, b(a < b)를 a, b(a > b)로 수정

                          명제 및 알고리즘, 증명에서 gcd(a, (a mod b))를 gcd(b, (a mod b))로 수정

2021월 11월 18일 활용 부분에서 최소공배수 ->최대공약수로 변경 항상 헷갈림...

728x90
728x90
728x90
728x90