SEED 알고리즘이요 리눅스 윈도우 암호문이 달라요..

sky1027의 이미지

자바하고 c언어에서 암호화 한 값이

ciphertext : cc f 38 f4 55 d 8d 86 94 9f 64 9e 82 d1 d1 fb

이렇게 동일한데요

리눅스에서 하면 암호문이 위와 다르게 완전 다르게 나와요...

제가 찾고 있던 것이

https://kldp.org/node/134840

이 링크에 있길래 참고를 했는데요.. 링크도 안걸리구요..ㅜㅜ

엔디안을 어떻게 하라는지 모르겠어요...ㅠㅠ
도와주세요

-------추가 내용---------

KISA 에서 제공된 그대로 라즈베리파이(리눅스)에서 가져다 사용했습니다.
코드가 많이 길어서 제 블로그에 추가했습니다

SEED_KISA.h
http://tjddnjs1027.blog.me/220644452421
- 위에 링크 걸려있는 글보고 SEED_KISA.h 에서 43번째줄에 #define LITTLE_ENDIAN과 .. #define BIG_ENDIAN을
MY_LITTLE_ENDIAN, MY_ BIG_ENDIAN 이렇게 수정하였는데요 컴파일 하면 워닝이 생기지는 않더군요..
근데 이게 아닌것 같아 다시 원래대로 돌려놓았어요..
- 여기서 "SEED_KISA.c" 를 참조하지 못해서 #include "SEED_KISA.c" 를 추가하였어요

SEED_KISA.c
http://tjddnjs1027.blog.me/220644453695
- 수정 사항없음

SEED_test.c
http://tjddnjs1027.blog.me/220644455024
- 테스트 부분(수정 사항없음)

결과
http://tjddnjs1027.blog.me/220644467431
- 비주얼스튜디오와 자바로 했을 때 결과 값이 동일하게 나오구요
- 첫 번째 그림은 비주얼 스튜디오에서 실행한 결과 값인데, 자바와 동일하게 생성되구요..
- 두 번째 그림은 라즈베리파이(리눅스)에서 실행한 결과 값이고, 동일하지 않아요..

왜 그런지 모르겠어요...

chanik의 이미지

상황 재현이 되는 코드샘플을 올려주시면 답변이 금방 달릴 것입니다

sky1027의 이미지

-- 내용 추가했어요 ㅜㅜ

chanik의 이미지

[1] PC 리눅스에서 실행

제곁에는 라즈베리파이 환경이 없으므로, 우선 PC의 리눅스에서 해 봤습니다.

블로그에 올려주신 코드는 SEED_KISA.h 에서 SEED_KISA.c 를 #include 하고 있네요.
그 줄은 부적절하므로 삭제합니다.

그리고 BIG_ENDIAN, LITTLE_ENDIAN 정의가 시스템의 다른 헤더파일과 충돌하고 있으므로
BIG_ENDIAN, LITTLE_ENDIAN 문자열을 SEED_BIG_ENDIAN, SEED_LITTLE_ENDIAN 정도로 바꿔줍니다.
질문글을 보니 .h 파일만 바꿔보신 것 같은데요, .c 파일도 바꿔야 합니다.

vim을 쓸 경우 아래와 같이 하면 될 것입니다.

:1,$s/[A-Z]*_ENDIAN/SEED_&/g

수정하고 아래와 같이 컴파일하고 실행해보니 잘 되네요.

$ gcc -m32 -o SEED_test SEED_KISA.c SEED_test.c
$ ./SEED_test

굳이 -m32 옵션을 줘서 32-bit 빌드를 한 이유는,
32-bit 빌드만 잘 동작하고 64-bit 빌드는 오동작하는 문제가 생기기 때문입니다.
이는 KISA의 레퍼런스 코드 자체가 갖고 있는 문제같습니다.

[2] 라즈베리파이의 리눅스 환경에서 실행하기 위한 준비

라즈베리파이 환경이 없으므로,
그 환경에서 빌드/실행시 고려해야 할 점만 생각나는대로 적어둡니다.

첫째, RPi2 까지는 어차피 32-bit 환경이므로 64-bit 빌드문제는 생기지 않을 것입니다.

둘째, SEED_KISA.h 에서 시스템의 바이트오더를 판별하는 아래 코드는
RPi2같은 ARM 환경에 대한 고려가 되어 있지 않습니다.
(사실 64-bit PC 환경인 x64_64도 고려되어 있지 않네요.
64-bit 환경은 고려해서 빌드해도 어차피 오동작합니다만.. )

#if __alpha__   ||  __alpha ||  __i386__    ||  i386    ||  _M_I86  ||  _M_IX86 ||  \
    __OS2__     ||  sun386  ||  __TURBOC__  ||  vax     ||  vms     ||  VMS     ||  __VMS
#define SEED_LITTLE_ENDIAN
#else
#define SEED_BIG_ENDIAN
#endif

아래와 같이 /usr/include/endian.h 에서 정의되는 __BYTE_ORDER를 먼처 체크해보는 식으로 수정하면
RPi2의 리눅스 환경에서도 동작하지 않을까 생각합니다.
대충 수정한 것이니 너무 믿지는 마시고요.

#if defined(__BYTE_ORDER)
#  if __BYTE_ORDER  == __LITTLE_ENDIAN
#    define SEED_LITTLE_ENDIAN
#  else
#    define SEED_BIG_ENDIAN
#  endif
#else
#  if __alpha__ ||  __alpha ||  __i386__    ||  i386    ||  _M_I86  ||  _M_IX86 ||  \
    __OS2__     ||  sun386  ||  __TURBOC__  ||  vax     ||  vms     ||  VMS     ||  __VMS
#    define SEED_LITTLE_ENDIAN
#  else
#    define SEED_BIG_ENDIAN
#  endif
#endif

이 판별코드가 말을 안 들으면 그냥 시스템의 바이트오더를 알아내서
하드코딩하고 확인해 보셔도 되겠죠.

chanik의 이미지

최초 질문과는 관련이 적은 문제라서 댓글달기 죄송합니다만,

[*] 64-bit 빌드시 오동작 문제

SEED_KISA.h의 DWORD 타입 정의부분에서
4바이트로 정의할 타입이 8바이트짜리로 잘못 정의되면서 생긴 문제네요.
아래와 같이 수정해보니 64-bit 빌드해도 잘 동작합니다.

//typedef unsigned long int   DWORD;        // unsigned 4-byte data type
typedef unsigned int   DWORD;               // unsigned 4-byte data type

[*] openssl

openssl-0.9.8f 부터 SEED 가 포함되어 있다고 합니다.
(SEED 256은 아니고 SEED 128만 포함됨)

http://seed.kisa.or.kr/iwt/ko/sup/EgovSeedInfo.do 페이지에 나오는 참조구현값을,
openssl에 통합된 SEED 코드를 통해 확인해보려면 아래와 같이 해볼 수 있겠습니다.

$ printf "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" \
  | openssl enc -seed-ecb -nosalt -K 0000000000000000000000000000000 | hexdump -C
00000000  5e ba c6 e0 05 4e 16 68  19 af f1 cc 6d 34 6c db  |^....N.h....m4l.|
00000010  7f 54 e0 3d 31 09 37 85  c5 e7 5e 41 fb 77 73 8d  |.T.=1.7...^A.ws.|
00000020

복호화까지 해보려면 아래와 같이 하면 되고요.

$ printf "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" \
  | openssl enc    -seed-ecb -nosalt -K 00000000000000000000000000000000 \
  | openssl enc -d -seed-ecb -nosalt -K 00000000000000000000000000000000 | hexdump -C
00000000  00 01 02 03 04 05 06 07  08 09 0a 0b 0c 0d 0e 0f  |................|
00000010

SEED 블록암호 알고리즘에 나오는 KISA_SEED_128_C_32bit.zip 샘플코드에서도 이 테스트벡터를 쓰고 있으니 대조해 보면 참고가 됩니다.

별 내용은 아니지만, 처음 시작할 때 헤매는 시간을 좀 줄일 수 있기를 바랍니다.

sky1027의 이미지

괜찮아요!! 관련이 없더라도 제가 더 배울 수 있는 부분이여서 좋아요
제가 실수한 부분도 있었어요
#define BIG_ENDIAN
#else
#define LITTLE_ENDIAN
이렇게 해놔야 하는데 리틀 엔디안과 빅 엔디안 위치가 서로 바뀌었었어요
그리고 라즈베리파이에서는 32비트만 되나봐요
-m32 가 입력되지 않아서 지우고 했더니 컴파일 했더니 컴파일 되고, 실행 결과 값이
동일하게 나왔어요
정말 정말 정말 정말로 감사합니다ㅜㅜ

tyhan의 이미지

http://seed.kisa.or.kr/iwt/ko/sup/EgovSeedInfo.do

참조 구현값을 보시고 확인하시면 될것 같습니다.

sky1027의 이미지

윈도우 기반에서 처음할 때, 참조 구현값과 동일하게 나왔었어요 ㅜㅜ

tyhan의 이미지

- 여기서 "SEED_KISA.c" 를 참조하지 못해서 #include "SEED_KISA.c" 를 추가하였어요

부분이 잘못되었습니다.
.c 파일을 include해서 쓰는것이 아니라 링킹시 추가 해주어야 합니다.

Endian값 define 보다 ifndef 가 먼저 쓰인것도 이상합니다.
다운받아 돌려보거나 하지는 않았지만

header와 source, compile, linking등에 대하여 확인해보시면 좋을것 같습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.