UUID
uuid란 엔트로피가 굉장히 높은 무작위성을 가진 36자리의 문자열이다. 중복될 확률이 굉장히 낮기 때문에 키 값으로 많이 사용된다.
1f298256-e337-46d7-b985-f365d395c8fa
실제로 파이썬을 사용하여 생성한 uuid이다.
그럼 키 값으로 해당 uuid를 사용하고 전송할 데이터에 키와 신청 여부를 포함하려면 어떻게 할까?
방법 1
가장 생각하기 쉬운 방법으로 json을 생각할 수 있다.
{
"key": "1f298256-e337-46d7-b985-f365d395c8fa",
"value": True
}
이 방법은 GET일 땐 사용하기 힘들고 용량도 상당히 크다.
방법 2
jwt토큰으로 만들어서 토큰을 전송한다.
이제 하나의 문자열이 됐으니 GET메소드에서 path variable이나 query param에 넣을 수 있다. 하지만 그래도 길다.
방법 3
키의 맨 뒤에 신청 여부를 추가한다.
1f298256-e337-46d7-b985-f365d395c8fa1 # 신청함
1f298256-e337-46d7-b985-f365d395c8fa0 # 신청안함
꽤나 많이 압축됐지만 위험한 방법인게 36자리인 uuid의 규칙이 깨지게 되고 요청을 보낼 때마다 맨뒤에 0, 1이 나타나게 되어 공격의 대상이 되기 쉽다.
스테가노그래피 (Steganography)
신청한 경우 키의 맨 마지막 문자를 홀수로, 아니면 짝수로 만들면 된다.
a의 아스키코드값은 97이므로 홀수이다. 따라서 신청 여부가 True이면 그대로 두고 False이면 1을 더하여 짝수로 만든 값을 키로 사용한다.
1f298256-e337-46d7-b985-f365d395c8fa // 신청함
1f298256-e337-46d7-b985-f365d395c8fb // 신청안함
이렇게 값을 다른 데이터에 숨겨서 보내는 방식을 스테가노그래피 (Steganography)라고 한다. 일종의 암호화 기법으로 데이터를 다른 다양한 데이터 형식에 숨겨서 보낼 수 있다.
이미지에서 RGB값을 수정하는 방식으로도 사용할 수 있다. 예를 들어 'a'라는 텍스트를 이미지에 숨겨서 전송하기 위해 아스키코드를 표현할 수 있는 8비트를 위해 이미지의 첫 8픽셀을 사용한다. 'a'를 2진수로 나타내면 01100001이므로 첫 8픽셀에서 1, 6, 7번째 픽셀의 rgb값을 1만큼 올려서 전송한다. 1픽셀 달라진 것으로 인간의 눈을 속이기는 힘들기 때문에 타인이 알아채기는 어렵다. 그렇게 수정된 이미지를 받은 쪽에서 원본 이미지와 대조하면 텍스트를 확인할 수 있다.
실제로 911테러에서 모나리자 그림을 사용한 스테가노그래피가 있었다고 한다.
이미지 외에도 음성같은 다양한 데이터 형식에 같은 방식으로 정보를 숨겨서 전송할 수 있다.
'기타 > 암호학' 카테고리의 다른 글
[암호학] 23. Zero Knowledge Proof (0) | 2024.09.14 |
---|---|
[암호학] 21. Massey-Omura (0) | 2023.02.07 |
[암호학] 20. 소수 판정 (Primality Test) (0) | 2023.02.03 |
[암호학] 19. RSA 암호 (0) | 2023.01.31 |
[암호학] 18. NP-Complete (0) | 2023.01.27 |