암호 블록 체인 IV는 예측할 수 없어야 합니다.

 

암호 블록 체인(CBC) 모드로 데이터를 암호화할 때 초기화 벡터(IV)를 사용하여 암호화를 무작위로 생성합니다. 즉, 주어진 키 아래에서 동일한 평문이 항상 동일한 암호문을 생성하지는 않습니다. IV는 비밀일 필요는 없지만 ‘선택된 일반 텍스트 공격’을 피하기 위해 예측할 수 없어야 합니다.

초기화 벡터를 생성하려면 안전한 난수 생성기를 사용할 것을 NIST는 권장합니다.

규칙을 어긴 코드

PyCryptodome 모듈의 경우

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpad

static_vector = b'x' * AES.block_size
cipher = AES.new(key, AES.MODE_CBC, static_vector)
cipher.encrypt(pad(data, AES.block_size))  # 규칙을 어긴 코드

cryptography 모듈의 경우

from os import urandom
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes

static_vector = b'x' * 16
cipher = Cipher(algorithms.AES(key), modes.CBC(static_vector))
cipher.encryptor()  # 규칙을 어긴 코드

규칙을 준수한 해결책

PyCryptodome 모듈의 경우

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpad

random_vector = get_random_bytes(AES.block_size)
cipher = AES.new(key, AES.MODE_CBC, random_vector)
cipher.encrypt(pad(data, AES.block_size))

cryptography 모듈의 경우

from os import urandom
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes

random_vector = urandom(16)
cipher = Cipher(algorithms.AES(key), modes.CBC(random_vector))
cipher.encryptor()

같이보면 좋은 자료드

If you like SONARKUBE, don’t forget to give me a star. :star2:

원문으로 바로가기

Star This Project