현대암호 간단 정리

2023. 5. 29. 01:21암호학

고전암호로 시저, 아핀, 비즈네르 암호들이 있다. 난이도상으로는 이것부터 정리를 했어야했는데 현대암호로 불쑥 점프한 것 같지만 지금 하는 것은 사실상 코드가 어떤식으로 돌아가는지, 어떤 식으로 활용되는지 정도이므로 자세한 건 이후에 암호 하나하나 자세하게 후술할 생각이다.

 

AES256, 512

DES와 더불어 대칭키 암호, 주로 데이터 암호화에 쓰임

메세지 패딩이 있다.

 

python 설치모듈

pip install pycryptodome
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from Crypto.Random import get_random_bytes
import base64

key = get_random_bytes(32) #32*8, random 256bit 생성
cipher = AES.new(key, AES.MODE_CBC) #CBC MODE의 AES class 생성
data = b'This is a message'
padded_data = pad(data, AES.block_size) #data를 padding해줌.
encrypted_data = cipher.encrypt(padded_data)#padding한 데이터를 암호화
encoded_data = base64.b64encode(encrypted_data)#인코딩


decoded_data = base64.b64decode(encoded_data)#디코딩
decipher = AES.new(key, AES.MODE_CBC, iv=cipher.iv)#클래스 생성
decrypted_data = unpad(decipher.decrypt(decoded_data), AES.block_size)#패딩없애고, 복호화

 

 

SHA256,  512

해시함수 MD5와 더불어 비밀번호값 저장, 무결증 검사, 블록체인 등에 쓰임

다만, 레인보우 사전 공격에 대응하기 위해 salt 값을 함께 사용(자주 쓰이는 패턴을 저장해놓고 대입하는 기법)

salt 값은 아이디에 대응하여 저장되어있고 이것을 꺼내어 비밀번호에 붙이고 padding하여 사용하는 식이고 다른 식으로 응용도 가능

 

머클-담고르 해시함수

https://blog.youngseok.dev/cryptography/Merkle-Damgard/

 

SHA 자세한 과정 아래 링크

https://akkadia.org/drepper/SHA-crypt.txt

 

일반사용예제(SHA-2예시, SHA-3도 있다.)

import hashlib

sha256_hash = hashlib.sha256()
data = b'This is message'
sha256_hash.update(data)
hash_digest = sha256_hash.hexdigest()
print(hash_digest)

 

salt 예제

import hashlib
import os

salt = os.urandom(16)
sha256_hash = hashlib.sha256()
data = b'This is message'

salted_data = salt + data
sha256_hash.update(salted_data)
hash_digest = sha256_hash.hexdigest()

print(hash_digest)

https://docs.python.org/ko/3/library/hashlib.html

 

 

RSA256, 512

개인키 암호. 주로 인증에 사용. 개인키, 공개키 생성에서(클라우드 서버나 api를 사용할때 주로 인증으로 key 받는 때 받는 공개키, 개인키가 이것)

소인수분해의 어려움을 이용하여 기반한 암호화

공개키는 주로 PKCS라는 공개키 암호 표준에 의거하여 사용.

링크 : 디피-헬먼 키교환

https://ko.wikipedia.org/wiki/%EB%94%94%ED%94%BC-%ED%97%AC%EB%A8%BC_%ED%82%A4_%EA%B5%90%ED%99%98

 

python 설치모듈

pip install pycryptodome
from Crypto.Cipher import PKCS1_OAEP
from Crypto.PublicKey import RSA

msg = "this is message,"
private_key = RSA.generate(2048)#1024~2048길이 권장
public_key = private_key.publickey() #개인키로 공개키를 만듦
pkcs_enc=PKCS1_OAEP.new(public_key)#공개키로 클래스 생성
enc_msg=pkcs_enc.encrypt(msg) #공개키로 만든 암호문

pkcs_dec=PKCS1_OAEP.new(private_key)#개인키로 클래스 생성
dec_msg=pkcs_decdecrypt(encdata)#개인키로 복호화

 

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

블록암호  (0) 2023.04.12
[암호] 무작위성  (0) 2023.03.08
rot13알고리즘 구현(특수문자, 대문자, 소문자 구현)  (0) 2023.03.01