OpenSSL SHA256RSA 구현 헤더파일 인클루드 오류 문제

zzllee77의 이미지

제가 SAH256RSA 암/복호화 구현을 위해 코딩중입니다
코딩은 아래와 같구요 개발환경은 리눅스이고 리눅스서버는 centos입니다.gcc명령어를 통해 컴파일 하는데요

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <string.h>
      4 #include <openssl/sha.h>
      5 #include <openssl/rsa.h>
      6 //#include RSA *RSA_new(void);          //RSA키 구조체를 위한 매모리를 동적할당한다.
      7 
      8 
      9 #define SHA256_DIGETS_LENGTH 28
     10 
     11 
     12 //void RSA_free(RSA *rsa);              //할당한 메모리를 free한다.
     13 
     14 //int SHA256_Init(SHA256_CTX *c);
     15 //int SHA256_Update(SHA256_CTX *c, const void *data, size_t len);
     16 //int SHA256_Final(unsigned char *md, SHA256_CTX *c);
     17 
     18 
     19 int main()
     20 {
     21         char *str = "hello message";    //원본 메시지
     22         RSA *pri_key = NULL;            //개인키
     23         RSA *pub_key = NULL;            //공개키
     24         EVP_PKEY *e_pub_key = NULL;     //인증서
     25         FILE *key_f = NULL;             //개인키 파일포인터
     26         FILE *crt_f = NULL;             //공개키 파일포인터
     27 
     28         int sign_len;                   //암호화된 결과 갑(사인값)의 길이
     29         unsigned char sign[256];        //사인값이 담길 버퍼
     30         int d_sign_len;                 //사인값 복호화 길이
     31         unsigned char d_sign[256];      //사인값 복호화된 값이 담길 버퍼
     32 
     33 
     34         //SHA256 알고리즘 해시값 생성시작
     35 
     36         SHA256_CTX sha256;              //Update 호출시 사되는 구조체
     37         unsigned char sha256_str[SHA256_DIGETS_LENGTH];
     38 
     39         SHA256_Init(&sha256);
     40 
     41         //SHA256 알고리즘 해시값 생성완료
     42         return 0;
     43 }

근데 컴파일을 하면 자꾸 아래와 같은 오류가 뜹니다.
/tmp/ccVOasOM.o: In function `main':
testrsa2.c:(.text+0x46): undefined reference to `SHA256_Init'
위에 코드를 보시다 시피 sha.h를 잘 인클루드 했고 그결과로 SHA256_CTX sha256를 선언 했는데요
근데 SHA256_Init(&sha256);이부분에서 자꾸 정의 되지 않았다는 오류가 뜹니다....인쿨루드가 안됬으면 저 구조체도 쓰지 못할텐데
왜 SHA256_Init(&sha256)이부분만 오류가 날까요 GCC명령어는 gcc -W -Wall -o testrsa2 testrsa2.c -I/usr/include/openssl 이렇습니다

익명 사용자의 이미지

SHA256_Init 함수 정의가 포함된 모듈을 같이 링크해 줘야 됩니다. header만 include한다고 다 되는 게 아니죠.

zzllee77의 이미지

근데 저 함수가 정의가 포홤된 모듈이란게 정확하게 어떤거죠 저는 저 함수가 정의된 헤더파일만 include만 하면
된다고 생각했습니다.

익명 사용자의 이미지

함수의 "선언"과 "정의"는 분명히 다릅니다.
함수 호출의 컴파일은 선언만 있어도 되지만, 링크를 마치기 위해서는 함수 정의가 필요하죠.
일반적으로 헤더파일에는 함수 선언만 있지요. (예외도 분명 있긴 합니다. 인라인 함수라던가.)

C/C++에서의 "선언"과 "정의"의 구분, "컴파일"과 "링크"에 대해서 알아보세요.

김정균의 이미지

정의가 포함된 모듈이라기 보다는, 라이브러리라고 하면 이해가 쉬우실까요?

[root@host ~]$ gcc -W -Wall -o testrsa2 testrsa2.c -I/usr/include/openssl -lssl

이렇게 해 보세요. SHA256_Init 의 proto type은 sha.h 에 선언이 되어 있겠지만, 실제 SHA256_Init API의 구현은 libssl.so 에 있기 때문입니다.

zzllee77의 이미지

안그래도 정의부분이 어디있는지 궁급했는데 답변 갑사합니다

msshinok의 이미지

-lcrypto 아닌가요?

The die is cast!

bushi의 이미지

openssl-devel 패키지를 제대로 설치하셨다면,
pkg-config --cflags --libs openssl
커맨드를 이용해서, 그 플랫폼에서 openssl 을 사용한 프로그램의 컴파일 및 링크에 필요한 모든 옵션을 획득할 수 있습니다.

댓글 달기

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