学习一下,OpenSSL,使用OpenSSL有两种方式:命令执行和库调用。对于我来说,学习是为了写代码。直奔库调用了。先从最简单的MD5入手吧!
OpenSSL官网上找到MD5简介只有函数的声明,没有相对明确的解释:
1
2
3
4
5
6
7
8
9
<code>#include <openssl/md5.h></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 <stdio.h></code>
<code>#include <iostream></code>
<code>#include <string.h></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(&c) )</code>
<code> </code><code>{</code>
<code> </code><code>std::cout<<</code><code>"MD5_Init failed"</code><code><<std::endl;</code>
<code> </code><code>return</code> <code>-1;</code>
<code> </code><code>}</code>
<code> </code><code>MD5_Update(&c, data, </code><code>strlen</code><code>(data));</code>
<code> </code><code>MD5_Final(md, &c);</code>
<code> </code><code>for</code><code>( </code><code>int</code> <code>nIndex = 0; nIndex < 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<<strMd5<<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