c++ xor 암호화

idrukawa의 이미지

안녕하세요.

original 문자열, key 문자열을 입력받아
xor을 하여 암호화하는 간단한 구조를 시험중입니다.

간혹 original 문자와 key의 문자가 같을때
암호화된 문자가 NULL(ASCII의 0x00) 이 되어버리는데요.

이렇게 되면 복호화시
암호화된 문자열을 가져올 때 문자열의 끝으로 판단하고 NULL 문자 전까지만 가져오게됩니다.
복호화된 결과도 key 문자와 같은 문자 직전까지만 복호화 됩니다.ㅠ

이 부분을 어떻게 처리하셨는지 도와주세요~

ymir의 이미지

입력이 문자열만 있다고 가정하면, NUL 을 데이터의 끝으로 판단하는 건 유효하지만..
인코딩 된 데이터는 문자열이 아니므로 NUL 을 데이터의 끝으로 정할 수 없죠.
게다가 인코딩 된 데이터는 표현 가능한 모든 경우의 수가 될 수 있으므로, 특정 패턴을 쓸 수도 없습니다.
인코딩 된 데이터의 길이 정보를 받아오던가, 따로 계산해서 별도로 관리해야 합니다.
만약 입력이 문자열인게 확실하다면, 디코딩한 데이터가 NUL 인지만 판단해도 될 것 같네요.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

idrukawa의 이미지

입력은 문자열인게 확실합니다.
파일로 부터 original 문자열을 읽어와 암호화 한 후,
output 파일에 결과를 write 합니다.

여기까지는 정상적으로 되는데요.

암호화된 output 파일을 읽어와서 복호화할때 가 문제입니다.
파일전체를 읽어와도 NULL 문자에 대한 인식 자체가 안되어서
이후 문자를 복호화할때 순서도 틀어지고 복호화 하려고 조차 하지 않습니다. ㅠ

그리고... 아래 답변은 무슨의미 인지 이해가 잘 되지 않습니다.

만약 입력이 문자열인게 확실하다면, 디코딩한 데이터가 NUL 인지만 판단해도 될 것 같네요.
klyx의 이미지

인코딩한건 '문자열'이 아니라 그냥 데이터의 배열이므로 NULL-terminated 배열을 가정할 수 없다면 따로 길이를 지정하는 방법을 쓰는수밖에 없습니다.
예를 들어 인코딩된 결과의 첫 몇바이트는 디코딩된 문자열의 길이를 나타낸다, 와 같은 약속을 할수도 있겠죠.

idrukawa의 이미지

암호화한 첫 N 문자를 총 문자열의 길이로 가져가는 정책을 써도
fgets로 읽어올 때 NULL 문자 이후 부분은 읽어오지 않을것 같습니다.
아무리 size를 크게준다고 해도요...
아니면 NULL 문자를 포함해서 파일을 읽어올 수 있는 방법이 있는지 조언 부탁드립니다.

---------------------------------------------------------

구글링해보니 fread()를 써보라는군요.
파일을 이진데이터로 읽어온다고 하니 한번 해보고 올게요

klyx의 이미지

다시 말씀드리지만 인코딩한 결과는 문자열이 아닙니다. fgets는 문자열을 읽어오기위한 함수입니다.

qiiiiiiiip의 이미지

NULL(0x00)을 종료 기호로 쓰는 것은 string관련 함수들 뿐입니다.

fgets의 경우 일종의 string관련 함수입니다만, NULL에서 종료하지는 않습니다.

아마 뒤쪽에서 strlen, printf 등에서 잘리는 것을 오해하시는게 아닌지..

--

fgets가 NULL에서 종료하는지 아닌지는 확인을 해봐야겠네요..
NULL도 문제고, new-line도 문제고, 아무튼 fgets는 안 쓰고,
당연히 fread/fwrite 를 써야합니다.

--

일단 제 환경에서는 fgets가 NULL에서 자르는 것 같지는 않네요.
man page상으로도 그렇고요.. (new line 및 EOF에서 terminate하는 것으로.)
그래도 임의 binary데이터라면 new line character가 임의로 발생할 테고,
여기서 잘리는 것은 어쩔 수 없겠지요..

라스코니의 이미지

만약 문자열이라서 0 으로 끝나면 안되는 거라면 그 뒤에 다른 것을 붙여주면 됩니다.

AA BB CC ^ AA AB AC 라면

AA FF (BB^AB) (CC^AC) 그래서 총 4개로. 이런식으로 붙여주는 거지요.
비록 한개가 늘어나지만 복호만 되면 되니 문제 없을 겁니다.

ymir의 이미지

> 만약 입력이 문자열인게 확실하다면, 디코딩한 데이터가 NUL 인지만 판단해도 될 것 같네요.

생각에 오류가 있었네요. 인코딩 시에 NUL 까지 포함해서 인코딩을 해주어야 얘기가 되네요.
일단 인코딩된 데이터는 NUL 이든 아니든 버퍼 끝까지 처리하고..
인코딩 된 데이터를 디코딩 했을 때, 디코딩 된 문자가 NUL 이라면 그때 멈추면 어떻겠느냐는 얘기였습니다.
이 부분은 문자열+NUL 까지 인코딩 하는 경우에만 유효하니까.. 흠.. 써먹기가 애매하네요. 걍 무시하세요.

다시 원래 주제로 돌아와서, 인코딩된 데이터는 더 이상 문자열이 아닙니다. 바이너리 데이터처럼 다루셔야 합니다.
정확하게 인코딩 된 데이터만 버퍼에 넣고, 버퍼의 끝을 알기 어려운 경우에는 길이 정보를 딸려 보내시는게 낫습니다.

파일에 인코딩 된 데이터를 저장했다면, 이 파일 끝까지 모두 읽어서 디코딩을 해야 하는게 맞고, 중간에 멈춰서는 안 되죠.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

idrukawa의 이미지

fread()와 fwrite()를 사용해서
암호화/복호화 할 파일을 byte stream으로 읽어오거나 써서서 해결했습니다.
도움주신 분들께 감사드립니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.