귀하는 조국과 의사 소통을 시도하는 비밀 요원입니다. 물론 정보를 숨겨야하기 때문에 아무도 도청하는 메시지가 없습니다. 고양이보다 무엇이 더 좋을까요? 모두 고양이의 웃긴 사진을 좋아 합니다. [인용 필요] 비밀 정보가 숨겨져있는 것으로 의심되지 않습니다!
Monaco가 공유 레벨의 레벨 정보를 저장하기 위해 사용하는 알고리즘에서 영감을 얻은 것은 정보를 이미지의 최소 색상 비트로 인코딩하는 프로그램을 작성하는 것입니다.
인코딩 형식 :
- 처음 24 비트는 나머지 인코딩 된 바이트 문자열의 길이를 결정 비트
- 이미지는 왼쪽에서 오른쪽으로, 위에서 아래로 읽히고 분명히 왼쪽 위 픽셀에서 시작합니다.
- 채널은 빨간색에서 녹색, 파란색으로 읽습니다.
- 각 채널에서 최하위 비트를 읽습니다.
- 비트는 빅 엔디안 순서로 저장됩니다
규칙 :
- 프로그램은 단일 바이트 문자열을 인코딩하고 기본 이미지의 단일 이미지 파일 이름을 사용합니다.
- 결과 이미지는 실제 색상 PNG 파일로 나와야합니다.
- 프로그램 사용 방법을 명시하는 한 I / O를 원하는 형식 (ARGV, STDIN, STDOUT, 파일 쓰기 / 읽기)으로 사용할 수 있습니다.
- 재미있는 고양이의 임의의 이미지를 선택하고 프로그램을 인코딩하여 프로그램이 작동 함을 보여 주어야합니다.
- 비트 수가 충분하지 않거나 이미지가 트루 컬러 형식이 아니거나 이미지가 존재하지 않거나 원하는 문제를 수행 할 수있는 유사한 문제가있는 경우 유효한 입력 만 제공한다고 가정 할 수 있습니다.
- 제공된 이미지에 알파 채널이 포함되어 있지 않다고 가정 할 수 있습니다.
- BOM이없는 길이는 UTF-8 바이트로 계산됩니다.
이 PHP 스크립트를 사용하여 솔루션을 테스트하고 PNG 파일 이름을 첫 번째 명령 행 인수로 제공 할 수 있습니다.
<?php
if ($argc === 1) die('Provide the filename of the PNG to read from');
$imageSize = @getimagesize($argv[1]);
if ($imageSize === false) die('Not a PNG file');
list($width, $height) = $imageSize;
$image = imagecreatefrompng($argv[1]);
$read = 0;
$bits = '';
for ($y = 0; $y < $height; $y++) {
for ($x = 0; $x < $width; $x++) {
$colorAt = imagecolorat($image, $x, $y);
$red = ($colorAt >> 16) & 0xFF;
$green = ($colorAt >> 8) & 0xFF;
$blue = ($colorAt >> 0) & 0xFF;
$bits .= ($red & 1).($green & 1).($blue & 1);
$read += 3;
if ($read == 24) {
$length = (int) bindec($bits);
$bits = '';
}
else if ($read > 24 && ($read - 24) > $length) {
$bits = substr($bits, 0, $length);
break 2;
}
}
}
if (strlen($bits) !== $length) die('Not enough bits read to fulfill the length');
$parts = str_split($bits, 8);
foreach ($parts as $part) {
echo chr(bindec($part));
}