난수와 의사난수
비밀키 암호와 블록암호 응용방식
공개키 암호
암호 공격
난수, 의사난수
길이가 긴, 길이를 예측할 수 없고, 통계적 특성을 가지지 않는비밀키로 적합한 '난수'
난수 ( random number )
무작위로 나열된 수의 집합, 난수를 만들기는 매우 어렵고, 수학적으로 명확하게 정의하는 것 또한 어렵다.
의사난수
알고리즘으로 생성된 난수
매번 난수 테스트들을 통과하는 방법으로 난수를 생성하기는 어렵기 때문에 효율적인 난수 발생기가 필요하다.
의사난수는 난수가 아니다, 예측이 쉽지 않은 의사난수는 암호에서 비밀키로 사용이 가능하다.
공개키 암호
비밀키 암호
암호화하기 위해 사용한 키를 비밀로 가지고 있고, 키를 가지고 있는 사람들은 암호화 한 데이터를 복호화 할 수 있는 암호화 방식
키가 공개되면 안되기 때문에, 키를 교환하는 방식도 중요하다.
( 사용자를 식별할 수 있다. )
블록 암호
기밀성있는 정보를 정해진 블록 다위로 암호화 하는 대칭키 암호 시스템이다.
안전성 증명 방법으로 차분공격,선형공격이 있다
ECB ( Eelectronic Codebook)
- 가장 단순하게 순차적으로 암호화 하는 구조
- 한개의 블록만 해독되면 나머지 블록도 해독이 되는 단점
- 암호문이 블록의 배수가 되기 때문에 복호화 후 평문을 알기 위해서 Padding이 필요
- 각 블록이 독립적으로 동작하므로 한 블록에서 에러가 발생해도 다른 블록에 영향을 주지 않음.
key의 길이만큼 원문을 자른다 ( key가 3자리 원문이 12자리이면 4개의 블록이 생성됨 )
원문이 14자리라면 마지막에 padding을 붙여 key의 길이의 배수로 만들어준다.
CBC
스트림 암호
대칭 키 암호의 구조 중 하나로, 유사난수를 연속적(스트림)으로 생성하여 암호화하려는 자료와 결합하는 구조를 가진다.
블록 암호와 달리 비트 단위로 암호화 한다. 선형 연산,비선형 연산이 이용된다.
CBC 암호화코드
plain = input("[+] 복호화할 문자열 입력 : ")
IV = input("[+] 처음 Xor에 쓸 문자열 입력 : ")
key = input("[+] key값 입력 : ")
if len(plain) % len(key) != 0:
padd = len(key) - (len(plain) % len(key))
plain += "=" * padd
cap = ""
capde = ""
enc = ""
encde = ""
for i in range(0, len(plain), len(key)):
block = plain[i:i + len(key)]
for j in range(0, len(block)):
# cap이라는 변수에 plain과 IV를 xor한 값을 chr형으로 저장
cap += chr(ord(block[j]) ^ ord(IV[j]))
shift = ord(key[j % len(key)]) - ord('A')
# block의 값 대신 xor해준 값인 cap의 값을 사용
enc += chr((ord(cap[j]) - ord('A') + shift) % 26 + ord('A') + 3)
# 한번 xor한 IV값을 n번쨰 블록의 복호화값으로바꿔줌, cap초기화 *안하면 같은값 반복
IV = enc[i:i + len(key)]
cap = ""
print("[+] Enctrypted Text >>>", enc)
으 내머리..