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 |