본문 바로가기

디지털포렌식(Digital forensic)/그림

[파일]퍼즐맞추기 암호,

반응형

이미지를 퍼즐화로 만드는 것은 암호화일까 아닐까?

 

 

시각에 따라 다르지만 퍼즐은 암호화는 아니다.
퍼즐은 두뇌활동, 게임, 문제 해결같은 활동인 반면에
암호는 정보나 데이터를 안전하게 보호하기 위해 사용되는 특별한 알고리즘을 적용한다.

 

 

퍼즐은 시간이 걸릴 뿐,  원본의 그림으로 완성이 가능하다.

 


암호화는 원본 데이터를 변환하여 접근하기 어렵게 만들고,
이를 복호화하는 과정은 암호화된 데이터를 원래 형태로 되돌리는 것이 기본 개념이므로
퍼즐을 암호라고 하지는 않지만 퍼즐 분야도 암호화 수준까지 완성됐다.

크로스워드 퍼즐
단어 퍼즐이나 크로스워드 퍼즐을 사용하여 텍스트 메시지를 암호화한다.
수신자쪽에서는 퍼즐을 풀면 메시지가 해독된다.
사진 퍼즐
아래 예제 방식이 사진 퍼즐, 이미지 퍼즐이다.
완성된 이미지 뿐만 아니라 텍스트도 이미지로 변환할 수 있다.
수신자쪽에서는 퍼즐 조각을 올바른 순서로 조립해서 메시지를 해독한다.

스도쿠 암호
스도쿠 퍼즐을 사용하여 숫자나 문자를 숨기고, 퍼즐을 풀어 메시지를 해독한다.

블록 미로 퍼즐
블록 미로 퍼즐을 활용하여 메시지를 숨기는 방식이다.

 

 

 

첨부된 파일은 VB로 만들어져있으며
1부터 100까지 숫자블럭들이 모여 만들어진
이미지를 아주 잘게 쪼개서 랜덤으로 섞는다.
(사용된 이미지도 포함했다.)

WindowsApp1.zip
0.67MB



Imports System.Drawing.Imaging

Public Class Form1
    Dim OriginalImage As Bitmap
    Dim ShuffledImage As Bitmap
    Dim TileSize As Integer = 50 ' 퍼즐 조각의 크기 (픽셀)

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim openFileDialog As New OpenFileDialog()
        openFileDialog.Filter = "Image Files|*.jpg;*.jpeg;*.png;*.bmp|All Files|*.*"

        If openFileDialog.ShowDialog() = DialogResult.OK Then
            OriginalImage = New Bitmap(openFileDialog.FileName)
            PictureBox1.Image = OriginalImage
        End If
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        ShuffleImage()
    End Sub

    Private Sub ShuffleImage()

        Dim numTilesX As Integer = OriginalImage.Width \ TileSize
        Dim numTilesY As Integer = OriginalImage.Height \ TileSize
        ShuffledImage = New Bitmap(OriginalImage)

        Dim rand As New Random()

        For i As Integer = 0 To numTilesX - 1
            For j As Integer = 0 To numTilesY - 1
                Dim x1 As Integer = i * TileSize
                Dim y1 As Integer = j * TileSize
                Dim x2 As Integer = rand.Next(numTilesX) * TileSize
                Dim y2 As Integer = rand.Next(numTilesY) * TileSize

                ' 조각을 섞음
                SwapTiles(x1, y1, x2, y2)
            Next
        Next

        ' 섞인 이미지를 PictureBox2에 표시
        PictureBox2.Image = ShuffledImage
    End Sub

    Private Sub SwapTiles(x1 As Integer, y1 As Integer, x2 As Integer, y2 As Integer)
        Dim tempTile As New Bitmap(TileSize, TileSize)
        Using g As Graphics = Graphics.FromImage(tempTile)
            g.DrawImage(ShuffledImage, New Rectangle(0, 0, TileSize, TileSize), New Rectangle(x1, y1, TileSize, TileSize), GraphicsUnit.Pixel)
        End Using

        Using g As Graphics = Graphics.FromImage(ShuffledImage)
            g.DrawImage(ShuffledImage, New Rectangle(x1, y1, TileSize, TileSize), New Rectangle(x2, y2, TileSize, TileSize), GraphicsUnit.Pixel)
        End Using

        Using g As Graphics = Graphics.FromImage(ShuffledImage)
            g.DrawImage(tempTile, New Rectangle(x2, y2, TileSize, TileSize), New Rectangle(0, 0, TileSize, TileSize), GraphicsUnit.Pixel)
        End Using
    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        RestoreImage()
    End Sub

    Private Sub RestoreImage()
        ShuffledImage = New Bitmap(OriginalImage)
        ' PictureBox2에 복원된 이미지를 표시한다.
        PictureBox2.Image = ShuffledImage
    End Sub

End Class

 

핵심이 되는 함수 코드는 ShufflImage() 로
1. 원본이미지의 폭과 높이를 정사각형 퍼즐 타일의 폭과 높이로 나눈다.
2. 나눠진 값은 퍼즐 타일의 수가 된다.

3. For 문으로 0부터 퍼즐 타일의 숫자만큼 쪼개진 타일을 랜덤으로 섞는다.
4. 랜덤으로 섞어진 퍼즐 타일은 원본 파일과 가로 세로가 같아야 한다.
5. 퍼즐 타일을 완성한 뒤 pictureBox2에 보인다.


이 퍼즐의 원본 이미지는 뭘까?

728x90