天天看点

OpenSSL 之 MD5

  学习一下,OpenSSL,使用OpenSSL有两种方式:命令执行和库调用。对于我来说,学习是为了写代码。直奔库调用了。先从最简单的MD5入手吧!

  OpenSSL官网上找到MD5简介只有函数的声明,没有相对明确的解释:

1

2

3

4

5

6

7

8

9

<code>#include &lt;openssl/md5.h&gt;</code>

<code>unsigned </code><code>char</code> <code>*MD5(</code><code>const</code> <code>unsigned </code><code>char</code> <code>*d, unsigned </code><code>long</code> <code>n,</code>

<code>                 </code><code>unsigned </code><code>char</code> <code>*md);</code>

<code>int</code> <code>MD5_Init(MD5_CTX *c);</code>

<code>int</code> <code>MD5_Update(MD5_CTX *c, </code><code>const</code> <code>void</code> <code>*data,</code>

<code>                 </code><code>unsigned </code><code>long</code> <code>len);</code>

<code>int</code> <code>MD5_Final(unsigned </code><code>char</code> <code>*md, MD5_CTX *c);</code>

  从函数的声明中只有看到,提供了4个函数。翻阅了下代码可大概理解了。上面的MD5函数与下面三个函数(MD5_Init,MD5_Update,MD5_Final)是两种使用方式。上面的MD5函数的内部实现其实也是调用下面的三个函数来完成的。

  MD5函数可以直接获取到对应的MD5值,但需要传的内容为指定的unsigned char类型的数据。这个相对使用场景要可能少一些。下面的MD5_Update则可以传任意类型的地址,这个相对更加适合对普通的文本或数据包来进行计算。

  下面代码是MD5的使用例子:  

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

<code>#include &lt;stdio.h&gt;</code>

<code>#include &lt;iostream&gt;</code>

<code>#include &lt;string.h&gt;</code>

<code>int</code> <code>main( </code><code>int</code> <code>argc, </code><code>char</code> <code>**argv )</code>

<code>{</code>

<code>        </code><code>unsigned </code><code>char</code> <code>md[MD5_DIGEST_LENGTH];</code>

<code>        </code><code>char</code> <code>strMd5[MD5_DIGEST_LENGTH+1];</code>

<code>        </code><code>const</code> <code>char</code> <code>*data = </code><code>"hello world!"</code><code>;</code>

<code>        </code><code>MD5_CTX c;</code>

<code>        </code><code>if</code><code>( !MD5_Init(&amp;c) )</code>

<code>        </code><code>{</code>

<code>                </code><code>std::cout&lt;&lt;</code><code>"MD5_Init failed"</code><code>&lt;&lt;std::endl;</code>

<code>                </code><code>return</code> <code>-1;</code>

<code>        </code><code>}</code>

<code>        </code><code>MD5_Update(&amp;c, data, </code><code>strlen</code><code>(data));</code>

<code>        </code><code>MD5_Final(md, &amp;c);</code>

<code>        </code><code>for</code><code>( </code><code>int</code> <code>nIndex = 0; nIndex &lt; MD5_DIGEST_LENGTH; nIndex ++ )</code>

<code>                </code><code>sprintf</code><code>(strMd5+nIndex*2, </code><code>"%02x\t"</code><code>, md[nIndex]);</code>

<code>        </code><code>std::cout&lt;&lt;strMd5&lt;&lt;std::endl;</code>

<code>        </code><code>return</code> <code>0;</code>

<code>}</code>

  编译链接为:    

<code>g++ -o myMD5 -I </code><code>/usr/local/openssl/include/</code> <code>-L </code><code>/usr/local/openssl/lib/</code> <code>-lcrypto myMD5.cpp</code>

 本文转自 XDATAPLUS 51CTO博客,原文链接:http://blog.51cto.com/xdataplus/1956372

继续阅读