TIL

25.03.26 TIL

gaon99 2025. 3. 28. 20:21

1. 오늘 학습 키워드

json 암호화


2. 오늘 학습 한 내용을 나만의 언어로 정리하기

 

우선 유저의 데이터를 관리하기에, 해당 정보를 암호화하여 보안성을 높여주는 것이 필수적이다.

시간이 조금 남았기에, 암 복호화를 경험 해보는 것도 나중에 도움이 될 것이라 생각하여 작업해보았다.

 

코드는 첫 경험이기에, 구글링과 AI의 도움을 받아서 작성을 완료했다.

public static (string encryptedText, string iv) Encrypt(string text, string key)
{
    byte[] keyBytes = Encoding.UTF8.GetBytes(key.PadRight(32, '\0').Substring(0, 32));
    byte[] textBytes = Encoding.UTF8.GetBytes(text);

    using (Aes aes = Aes.Create())
    {
        aes.Key = keyBytes;
        aes.Mode = CipherMode.CBC;
        aes.Padding = PaddingMode.PKCS7;
        aes.GenerateIV();

        string ivBase64 = Convert.ToBase64String(aes.IV);

        using (ICryptoTransform encryptor = aes.CreateEncryptor())
        {
            byte[] encryptedByte = encryptor.TransformFinalBlock(textBytes,0,textBytes.Length);
            string encryptedText = Convert.ToBase64String(encryptedByte);
            return (encryptedText, ivBase64);
        }
    }
}

 

작성을 하다보니 Aes에서  모드와 패딩 부분에 많은 선택지가 있었다.

그래서 이 부분을 요약을 해놓고 나중에 암복호화를 할 경우 참고하려고 남긴다

CBC(Cipher Block Chaining) 원리: 첫 번째 블록은 IV와 XOR한 후 암호화되고,이후 각 블록은 이전 암호문 블록과 XOR 후 암호화
IV : Initialize Vector(초기화 벡터)
특징: 동일한 평문 블록이 항상 다른 암호문 블록으로 처리되므로 보안성이 향상
주의사항: IV가 필요하며, 복호화 시에도 동일한 IV가 사용 되어야 함

ECB (Electronic Code Book) 원리: 평문의 각 블록을 독립적으로 암호화
특징: 구현이 단순, 항상 동일한 암호문 블록으로 암호화되므로 패턴 노출 위험이 있음
사용: 보안이 크게 요구되지 않는 환경이나 고정된 데이터에 한정되어 사용
CFB (Cipher Feedback) 원리: 블록 암호를 스트림 암호처럼 사용할 수 있도록 변환
특징: 자체 동기화(self-synchronizing) 기능이 있어 일부 통신 환경에서 유용.
지원: 모든 알고리즘에서 기본적으로 지원되지는 않으며, 구현에 따라 차이가 있을 가능성이 있다.
OFB (Output Feedback) 원리: 암호화 함수를 반복 호출하여 스트림 키를 생성한 후 평문과 XOR 연산
특징: 오류 전파가 없고, 암호문이 동일한 평문을 여러 번 암호화해도 결과가 같지 않도록 함
지원: 역시 구현에 따라 지원 여부가 다를 수 있음

CTS (Ciphertext Stealing) 원리: 마지막 블록이 완전한 블록 크기와 맞지 않을 경우, 패딩 없이 암호문 길이를 평문과 동일하게 맞추는 방식
특징: 패딩으로 인한 데이터 부풀림 없이 원래 평문 길이를 유지할 수 있음
사용: 평문 길이가 항상 블록 크기의 배수가 아닐 때 유용

 

이렇게 적어는 두었지만 완전히 이해는 못했기에, 추후 따로 이 부분에 대해서는 공부 해보려고한다.

 

그리고 패딩이다.

None 설명: 패딩을 적용 X
특징: 평문의 길이가 블록 크기의 배수여야 함, 그렇지 않으면 암호화 시 오류가 발생
PKCS7 설명: 가장 일반적으로 사용되는 패딩 방식
원리: 필요한 패딩 바이트 수만큼 해당 숫자(예: 0x02, 0x04 등)를 각 바이트에 채워 넣음
예시: 블록 크기가 16바이트이고 평문의 마지막 블록에 5바이트가 부족하다면, 0x05 값의 5바이트가 추가됩니다.
Zeros 설명: 부족한 부분을 모두 0x00(제로)로 채움
특징: 평문의 끝에 실제 0x00 값이 포함되어 있을 경우, 복호화 후 어느 부분이 패딩인지 구분하기 어려울 수 있음
ANSIX923 설명: ANSI X9.23 표준에 따른 패딩 방식
원리: 마지막 바이트에 추가된 패딩 바이트의 총 수를 기록하고, 나머지 바이트는 0x00으로 채움
특징: 0x00 패딩과 달리, 마지막 바이트의 값으로 패딩 길이를 알 수 있으므로 패딩 제거가 명확
ISO10126 설명: ISO 10126 표준에 따른 패딩 방식
원리: 마지막 바이트는 패딩 바이트 수를 나타내고, 나머지 추가 바이트는 무작위 값으로 채워짐
특징: 무작위 패딩 값으로 인해 일부 상황에서는 암호문 패턴 분석에 추가적인 복잡성을 제공

 

이 부분도 기록을 해두고 추후에 따로 학습을 가져야 할 것같다.

 

우선 암호화는 위 코드처럼 해내었고, 암호화는 이렇게 하였다.

iv값이 암호화를 할때와 복호화를 할 때 동일 해야하므로, 이 부분을 신경 쓰는 것이 매우 중요하다.

public static string Decrypt(string encryptedText, string key, string iv)
{
    byte[] keyBytes = Encoding.UTF8.GetBytes(key.PadRight(32, '\0').Substring(0, 32));
    byte[] ivBytes = Convert.FromBase64String(iv);
    byte[] encryptedBytes = Convert.FromBase64String(encryptedText);
    using (Aes aes = Aes.Create())
    {
        aes.Key = keyBytes;
        aes.Mode = CipherMode.CBC;
        aes.Padding = PaddingMode.PKCS7;
        aes.IV = ivBytes;
        using (ICryptoTransform decryptor = aes.CreateDecryptor())
        {
            byte[] decryptedBytes = decryptor.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);
            return Encoding.UTF8.GetString(decryptedBytes);
        }
    }
}

3. 학습하며 겪었던 문제점 & 에러

 

암 복호화를 진행하면서 json파일이 암호화가 되어버리고, 테스트 코드를 작성하다보니 데이터 파일이 꼬여버려서 아예 데이터를 삭제하고,

초기화해서 작업을 했다..


4. 내일 학습 할 것은 무엇인지

새 프로젝트 시작이라 또 새롭게 시작 할 예정이다.

'TIL' 카테고리의 다른 글

25.03.28 TIL  (0) 2025.03.28
25.03.27 TIL  (0) 2025.03.28
25.03.25 TIL  (0) 2025.03.25
25.03.24 TIL  (0) 2025.03.24
25.03.21 TIL  (0) 2025.03.24