Rijndael 알고리즘 질문 입니다.

yun8085의 이미지

http://www.codeproject.com/Articles/1380/A-C-Implementation-of-the-Rijndael-Encryption-Decr

위의 링크에서 Rijndael 알고리즘을 참고하였는데요

AES 알고리즘은 IV 값이 있는 것으로 아는데 해당 소스 내에는

해당 값이 없네요???

무슨 차이인가요?? IV값이 무슨 역할을 하는건가요????

void main()
{
	try
	{
		char szHex[33];
		//One block testing
		CRijndael oRijndael;
		oRijndael.MakeKey("abcdefghabcdefgh", "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16, 16);
		char szDataIn[] = "aaaaaaaabbbbbbbb";
		char szDataOut[17] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
		oRijndael.EncryptBlock(szDataIn, szDataOut);
		CharStr2HexStr((unsigned char*)szDataIn, szHex, 16);
		cout << szHex << endl;
		cout << szDataIn << endl;
		CharStr2HexStr((unsigned char*)szDataOut, szHex, 16);
		cout << szHex << endl;
		cout << szDataOut << endl;
		memset(szDataIn, 0, 16);
		oRijndael.DecryptBlock(szDataOut, szDataIn);
		CharStr2HexStr((unsigned char*)szDataIn, szHex, 16);
		cout << szHex << endl;
	}
	catch(exception& roException)
	{
		cout << roException.what() << endl;
	}
}

wariua의 이미지

IV(initial vector)를 알고 계시다면 ECB, CBC 같은 용어들도 알고 계실 수 있겠네요.

보여주신 코드처럼 IV 따위 없이 정해진 키로 그냥 암호화 하는 게 ECB(electronic codebook) 방식입니다. 간단한 건 좋은데, 동일한 평문 블럭이 항상 동일한 암호문 블럭으로 바뀌므로 데이터의 반복 패턴이 쉽게 드러난다는 단점이 있습니다. (http://en.wikipedia.org/wiki/Initialization_vector 의 그림 참고) 게다가 공격자가 어떤 평문-암호문 조합을 이미 알고 있는 경우 그 평문을 ECB로 암호화 하면...

그래서 블럭을 암호화 할 때 이전 블럭 처리 과정에서 나온 값을 사용하는 여러 방법들이 고안됐습니다. 그런데 그렇게 하자니 첫 번째 블럭을 암호화 할 때 사용할 값이 마땅치 않습니다. 그게 난수로 만든 초기(initial) 값(vector) IV입니다.

http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation 요기의 그림에 IV가 구체적으로 어떻게 쓰이는지 나옵니다.

$PWD `date`

pogusm의 이미지

취미로 c++ 공부하다가 openssl을 이용해서 aes 암호화/복호화 과정을 실습해본적은 있는데..

저는 이렇게 사용했었습니다.

클라이언트와 서버에는 고정된 Key="aaaaaaaaaaa" 값이 이미 지정되어 있고

(클라이언트 --> 서버)
통신할때마다 매번 새롭게 랜덤으로생성된iv 값과 Key="aaaaaaaaaaa" 으로 DATA를 암호화한후
["암호화된DATA" + "랜덤으로생성된iv값"] 의 형태로 전송을 하고
서버에서 이를 이용해서 복호화를 하도록 사용했었습니다.

영어가 안돼서 위의 링크를 가봐도 이해가 안됩니다.

다만 이런저런 샘플소스와 글들을 보고 대충 끼어 맞추듯이 이해하고 사용했었는데...

"랜덤으로생성된iv값"을 노출된 상태로 전송하는게 올바른 방법인가요?
(소스코드를 첨부하고 싶은데... 전에 실습했던 소스코드를 찾을 수가 없네요 ㅠㅠ)

댓글 달기

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