﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-天下-随笔分类-加密解密</title><link>http://www.cppblog.com/aaxron/category/15782.html</link><description>记录修行的印记
</description><language>zh-cn</language><lastBuildDate>Mon, 30 Aug 2021 23:57:23 GMT</lastBuildDate><pubDate>Mon, 30 Aug 2021 23:57:23 GMT</pubDate><ttl>60</ttl><item><title>单文件AES加解密算法</title><link>http://www.cppblog.com/aaxron/archive/2021/08/30/217802.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Mon, 30 Aug 2021 13:39:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2021/08/30/217802.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/217802.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2021/08/30/217802.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/217802.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/217802.html</trackback:ping><description><![CDATA[#pragma&#160;once
&#160;
#include&#160;<stdint.h>&#160;&#160;//for int8_t
#include&#160;<string.h>&#160;&#160;//for memcmp
#include&#160;<wmmintrin.h>&#160;//for intrinsics for AES-NI
//compile using gcc and following arguments: -g;-O0;-Wall;-msse2;-msse;-march=native;-maes
//internal stuff
&#160;
//macros
#define&#160;DO_ENC_BLOCK(m,k) \
&#160;&#160;&#160;&#160;do{\
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_xor_si128&#160;&#160;(m, k[ 0]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesenc_si128&#160;(m, k[ 1]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesenc_si128&#160;(m, k[ 2]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesenc_si128&#160;(m, k[ 3]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesenc_si128&#160;(m, k[ 4]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesenc_si128&#160;(m, k[ 5]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesenc_si128&#160;(m, k[ 6]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesenc_si128&#160;(m, k[ 7]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesenc_si128&#160;(m, k[ 8]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesenc_si128&#160;(m, k[ 9]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesenclast_si128(m, k[10]);\
&#160;&#160;&#160;&#160;}while(0)
&#160;
#define&#160;DO_DEC_BLOCK(m,k) \
&#160;&#160;&#160;&#160;do{\
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_xor_si128&#160;&#160;(m, k[10+0]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesdec_si128&#160;(m, k[10+1]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesdec_si128&#160;(m, k[10+2]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesdec_si128&#160;(m, k[10+3]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesdec_si128&#160;(m, k[10+4]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesdec_si128&#160;(m, k[10+5]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesdec_si128&#160;(m, k[10+6]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesdec_si128&#160;(m, k[10+7]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesdec_si128&#160;(m, k[10+8]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesdec_si128&#160;(m, k[10+9]); \
&#160;&#160;&#160;&#160;&#160;m&#160;= _mm_aesdeclast_si128(m, k[0]);\
&#160;&#160;&#160;&#160;}while(0)
&#160;
#define&#160;AES_128_key_exp(k, rcon) aes_128_key_expansion(k, _mm_aeskeygenassist_si128(k, rcon))
&#160;
static&#160;__m128i&#160;aes_128_key_expansion(__m128i&#160;key, __m128i&#160;keygened)
{
&#160;&#160;&#160;&#160;keygened&#160;= _mm_shuffle_epi32(keygened, _MM_SHUFFLE(3,3,3,3));
&#160;&#160;&#160;&#160;key&#160;= _mm_xor_si128(key, _mm_slli_si128(key, 4));
&#160;&#160;&#160;&#160;key&#160;= _mm_xor_si128(key, _mm_slli_si128(key, 4));
&#160;&#160;&#160;&#160;key&#160;= _mm_xor_si128(key, _mm_slli_si128(key, 4));
&#160;&#160;&#160;&#160;return&#160;_mm_xor_si128(key, keygened);
}
&#160;
//public API
static&#160;void&#160;aes128_load_key_enc_only(uint8_t&#160;*enc_key, __m128i&#160;*key_schedule)
{
&#160;&#160;&#160;&#160;key_schedule[0] = _mm_loadu_si128((const&#160;__m128i*) enc_key);
&#160;&#160;&#160;&#160;key_schedule[1] = AES_128_key_exp(key_schedule[0], 0x01);
&#160;&#160;&#160;&#160;key_schedule[2] = AES_128_key_exp(key_schedule[1], 0x02);
&#160;&#160;&#160;&#160;key_schedule[3] = AES_128_key_exp(key_schedule[2], 0x04);
&#160;&#160;&#160;&#160;key_schedule[4] = AES_128_key_exp(key_schedule[3], 0x08);
&#160;&#160;&#160;&#160;key_schedule[5] = AES_128_key_exp(key_schedule[4], 0x10);
&#160;&#160;&#160;&#160;key_schedule[6] = AES_128_key_exp(key_schedule[5], 0x20);
&#160;&#160;&#160;&#160;key_schedule[7] = AES_128_key_exp(key_schedule[6], 0x40);
&#160;&#160;&#160;&#160;key_schedule[8] = AES_128_key_exp(key_schedule[7], 0x80);
&#160;&#160;&#160;&#160;key_schedule[9] = AES_128_key_exp(key_schedule[8], 0x1B);
&#160;&#160;&#160;&#160;key_schedule[10] = AES_128_key_exp(key_schedule[9], 0x36);
}
&#160;
static&#160;void&#160;aes128_load_key(uint8_t&#160;*enc_key, __m128i&#160;*key_schedule)
{
&#160;&#160;&#160;&#160;aes128_load_key_enc_only(enc_key, key_schedule);
&#160;
&#160;&#160;&#160;&#160;// generate decryption keys in reverse order.
&#160;&#160;&#160;&#160;// k[10] is shared by last encryption and first decryption rounds
&#160;&#160;&#160;&#160;// k[0] is shared by first encryption round and last decryption round (and is the original user key)
&#160;&#160;&#160;&#160;// For some implementation reasons, decryption key schedule is NOT the encryption key schedule in reverse order
&#160;&#160;&#160;&#160;key_schedule[11] = _mm_aesimc_si128(key_schedule[9]);
&#160;&#160;&#160;&#160;key_schedule[12] = _mm_aesimc_si128(key_schedule[8]);
&#160;&#160;&#160;&#160;key_schedule[13] = _mm_aesimc_si128(key_schedule[7]);
&#160;&#160;&#160;&#160;key_schedule[14] = _mm_aesimc_si128(key_schedule[6]);
&#160;&#160;&#160;&#160;key_schedule[15] = _mm_aesimc_si128(key_schedule[5]);
&#160;&#160;&#160;&#160;key_schedule[16] = _mm_aesimc_si128(key_schedule[4]);
&#160;&#160;&#160;&#160;key_schedule[17] = _mm_aesimc_si128(key_schedule[3]);
&#160;&#160;&#160;&#160;key_schedule[18] = _mm_aesimc_si128(key_schedule[2]);
&#160;&#160;&#160;&#160;key_schedule[19] = _mm_aesimc_si128(key_schedule[1]);
}
&#160;
static&#160;void&#160;aes128_enc(__m128i&#160;*key_schedule, uint8_t&#160;*plainText,uint8_t&#160;*cipherText)
{
&#160;&#160;&#160;&#160;__m128i&#160;m&#160;= _mm_loadu_si128((__m128i&#160;*) plainText);
&#160;&#160;&#160;&#160;DO_ENC_BLOCK(m,key_schedule);
&#160;&#160;&#160;&#160;_mm_storeu_si128((__m128i&#160;*) cipherText, m);
}
&#160;
static&#160;void&#160;aes128_dec(__m128i&#160;*key_schedule, uint8_t&#160;*cipherText,uint8_t&#160;*plainText)
{
&#160;&#160;&#160;&#160;__m128i&#160;m&#160;= _mm_loadu_si128((__m128i&#160;*) cipherText);
&#160;&#160;&#160;&#160;DO_DEC_BLOCK(m,key_schedule);
&#160;&#160;&#160;&#160;_mm_storeu_si128((__m128i&#160;*) plainText, m);
}
&#160;
//return 0 if no error
//1 if encryption failed
//2 if decryption failed
//3 if both failed
static&#160;int&#160;aes128_self_test(void)
{
&#160;&#160;&#160;&#160;uint8_t&#160;plain[] &#160;= {0x32, 0x43, 0xf6, 0xa8, 0x88, 0x5a, 0x30, 0x8d, 0x31, 0x31, 0x98, 0xa2, 0xe0, 0x37, 0x07, 0x34};
&#160;&#160;&#160;&#160;uint8_t&#160;enc_key[] = {0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c};
&#160;&#160;&#160;&#160;uint8_t&#160;cipher[] &#160;= {0x39, 0x25, 0x84, 0x1d, 0x02, 0xdc, 0x09, 0xfb, 0xdc, 0x11, 0x85, 0x97, 0x19, 0x6a, 0x0b, 0x32};
&#160;&#160;&#160;&#160;uint8_t&#160;computed_cipher[16];
&#160;&#160;&#160;&#160;uint8_t&#160;computed_plain[16];
&#160;&#160;&#160;&#160;int&#160;out=0;
&#160;&#160;&#160;&#160;__m128i&#160;key_schedule[20];
&#160;&#160;&#160;&#160;aes128_load_key(enc_key,key_schedule);
&#160;&#160;&#160;&#160;aes128_enc(key_schedule,plain,computed_cipher);
&#160;&#160;&#160;&#160;aes128_dec(key_schedule,cipher,computed_plain);
&#160;&#160;&#160;&#160;if(memcmp(cipher,computed_cipher,sizeof(cipher))) out=1;
&#160;&#160;&#160;&#160;if(memcmp(plain,computed_plain,sizeof(plain))) out|=2;
&#160;&#160;&#160;&#160;return&#160;out;
}<img src ="http://www.cppblog.com/aaxron/aggbug/217802.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2021-08-30 21:39 <a href="http://www.cppblog.com/aaxron/archive/2021/08/30/217802.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对openssl做的一些简单封装</title><link>http://www.cppblog.com/aaxron/archive/2014/03/21/206266.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Fri, 21 Mar 2014 09:40:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2014/03/21/206266.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/206266.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2014/03/21/206266.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/206266.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/206266.html</trackback:ping><description><![CDATA[<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">stdafx.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;GetRSA(RSA&nbsp;</span><span style="color: #000000">**</span><span style="color: #000000">RsaKeys)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">RsaKeys</span><span style="color: #000000">=</span><span style="color: #000000">RSA_generate_key(RSALEN,RSA_F4,NULL,NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(NULL</span><span style="color: #000000">==*</span><span style="color: #000000">RsaKeys)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;;<br />}<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">取得私钥</span><span style="color: #008000"><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;GetPrivateKey(RSA&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">RsaKeys,RSA&nbsp;</span><span style="color: #000000">**</span><span style="color: #000000">Pvtkey)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">Pvtkey&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;RSAPrivateKey_dup(RsaKeys);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(NULL</span><span style="color: #000000">==*</span><span style="color: #000000">Pvtkey)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">私钥To数据流</span><span style="color: #008000"><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;PrivateKeyToData(RSA&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">Pvtkey,unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;bufkey)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;BIO</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pBio&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;BIO_new(BIO_s_mem());<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pBio&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NULL)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;memset(bufkey,</span><span style="color: #000000">'</span><span style="color: #000000">\0</span><span style="color: #000000">'</span><span style="color: #000000">,RSALEN);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(&nbsp;i2d_RSAPrivateKey_bio(pBio,Pvtkey)&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BIO_free(pBio);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;BIO_read(pBio,bufkey,RSALEN);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;BIO_free(pBio);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">数据流To私钥</span><span style="color: #008000"><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;DataToPrivateKey(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;bufkey,RSA&nbsp;</span><span style="color: #000000">**</span><span style="color: #000000">Pvtkey)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;BIO&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pBio&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;BIO_new(BIO_s_mem());<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pBio&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NULL)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;BIO_write(pBio,bufkey,RSALEN);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(&nbsp;NULL&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;d2i_RSAPrivateKey_bio(pBio,Pvtkey))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BIO_free(pBio);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;BIO_free(pBio);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">取得公钥</span><span style="color: #008000"><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;GetPublicKey(RSA&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">RsaKeys,RSA&nbsp;</span><span style="color: #000000">**</span><span style="color: #000000">Pubkey)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">Pubkey&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;RSAPublicKey_dup(RsaKeys);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(NULL</span><span style="color: #000000">==*</span><span style="color: #000000">Pubkey)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /><br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">公钥To数据流</span><span style="color: #008000"><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;PublicKeyToData(RSA&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">Pubkey,unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;bufkey)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;BIO&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pBio&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;BIO_new(BIO_s_mem());<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pBio&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">NULL)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;memset(bufkey,</span><span style="color: #000000">'</span><span style="color: #000000">\0</span><span style="color: #000000">'</span><span style="color: #000000">,RSALEN);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(i2d_RSAPublicKey_bio(pBio,Pubkey)&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BIO_free(pBio);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;BIO_read(pBio,bufkey,RSALEN);<br />&nbsp;&nbsp;&nbsp;&nbsp;BIO_free(pBio);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">数据流To公钥</span><span style="color: #008000"><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;DataToPublicKey(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">bufkey,RSA&nbsp;</span><span style="color: #000000">**</span><span style="color: #000000">Pubkey)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;BIO&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pBio</span><span style="color: #000000">=</span><span style="color: #000000">BIO_new(BIO_s_mem());<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pBio&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;BIO_write(pBio,bufkey,RSALEN);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(&nbsp;d2i_RSAPublicKey_bio(pBio,Pubkey)&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BIO_free(pBio);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;BIO_free(pBio);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br /></span><span style="color: #008000">/*</span><span style="color: #008000">公钥加密-&gt;私钥解密</span><span style="color: #008000">*/</span><span style="color: #000000"><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;RSAPublicEncrypt(RSA&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">Publickey,&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">From,&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">To)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;len</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;RSA_size(Publickey)&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">11</span><span style="color: #000000">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;(len</span><span style="color: #000000">=</span><span style="color: #000000">RSA_public_encrypt(len,(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)From,(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)To,Publickey,RSA_PKCS1_PADDING))&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;len;<br />}<br /><br /><br /></span><span style="color: #008000">/*</span><span style="color: #008000">私钥解密&lt;-公钥加密</span><span style="color: #008000">*/</span><span style="color: #000000"><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;RSAPrivateDecrypt(RSA&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">Privtekey,&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">From,&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">To)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;(RSA_private_decrypt(RSALEN</span><span style="color: #000000">/</span><span style="color: #000000">8</span><span style="color: #000000">,(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)From,(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)To,Privtekey,RSA_PKCS1_PADDING)))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /><br /><br /></span><span style="color: #008000">/*</span><span style="color: #008000">私钥加密-&gt;公钥解密</span><span style="color: #008000">*/</span><span style="color: #000000"><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;RSAPrivateEncrypt(RSA&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">Privtekey,&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">From,&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">To)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;len&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;RSA_size(Privtekey)</span><span style="color: #000000">-</span><span style="color: #000000">11</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;(len&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;RSA_private_encrypt(len,(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)From,(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)To,Privtekey,RSA_PKCS1_PADDING)))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;len;<br />}<br /><br /><br /></span><span style="color: #008000">/*</span><span style="color: #008000">公钥解密&lt;-私钥加密</span><span style="color: #008000">*/</span><span style="color: #000000"><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;RSAPublicDecrypt(RSA&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">Publickey,&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">From,&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">To)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;(RSA_public_decrypt(RSALEN</span><span style="color: #000000">/</span><span style="color: #000000">8</span><span style="color: #000000">,(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)From,(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)To,Publickey,RSA_PKCS1_PADDING))&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /><br /><br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">void&nbsp;DesEncrypt(char&nbsp;*Key,char&nbsp;*Msg,&nbsp;char&nbsp;*Result,int&nbsp;Length)<br /></span><span style="color: #008000">//</span><span style="color: #008000">{<br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n=0;<br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;DES_cblock&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;desblock;<br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;DES_key_schedule&nbsp;schedule;<br /></span><span style="color: #008000">//</span><span style="color: #008000"><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;DES_string_to_key(Key,&amp;desblock);<br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;DES_set_key_checked(&nbsp;&amp;desblock,&nbsp;&amp;schedule&nbsp;);<br /></span><span style="color: #008000">//</span><span style="color: #008000"><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;DES_cfb64_encrypt(&nbsp;(unsigned&nbsp;char&nbsp;*)Msg,&nbsp;(unsigned&nbsp;char&nbsp;*)Result,<br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Length,&nbsp;&amp;schedule,&nbsp;&amp;desblock,&nbsp;&amp;n,&nbsp;DES_ENCRYPT&nbsp;);<br /></span><span style="color: #008000">//</span><span style="color: #008000"><br /></span><span style="color: #008000">//</span><span style="color: #008000">}<br /></span><span style="color: #008000">//</span><span style="color: #008000"><br /></span><span style="color: #008000">//</span><span style="color: #008000"><br /></span><span style="color: #008000">//</span><span style="color: #008000">void&nbsp;DesDecrypt(&nbsp;char&nbsp;*Key,&nbsp;char&nbsp;*Msg,&nbsp;char&nbsp;*Result,int&nbsp;Length)<br /></span><span style="color: #008000">//</span><span style="color: #008000">{<br /></span><span style="color: #008000">//</span><span style="color: #008000"><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n=0;<br /></span><span style="color: #008000">//</span><span style="color: #008000"><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;DES_cblock&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;desblock;<br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;DES_key_schedule&nbsp;schedule;<br /></span><span style="color: #008000">//</span><span style="color: #008000"><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;DES_string_to_key(Key,&amp;desblock);<br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;DES_set_key_checked(&nbsp;&amp;desblock,&nbsp;&amp;schedule&nbsp;);<br /></span><span style="color: #008000">//</span><span style="color: #008000"><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;DES_cfb64_encrypt(&nbsp;(unsigned&nbsp;char&nbsp;*)&nbsp;Msg,&nbsp;(unsigned&nbsp;char&nbsp;*)Result,<br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Length,&nbsp;&amp;schedule,&nbsp;&amp;desblock,&nbsp;&amp;n,&nbsp;DES_DECRYPT&nbsp;);<br /></span><span style="color: #008000">//</span><span style="color: #008000"><br /></span><span style="color: #008000">//</span><span style="color: #008000">}</span><span style="color: #008000"><br /></span><span style="color: #000000"><br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;DESGenerateKey(</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pKey)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;nLen</span><span style="color: #000000">=</span><span style="color: #000000">33</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;flag</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i,k</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;srand((unsigned)time(NULL));<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">nLen</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag</span><span style="color: #000000">=</span><span style="color: #000000">rand()</span><span style="color: #000000">%</span><span style="color: #000000">2</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(flag)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pKey[k</span><span style="color: #000000">++</span><span style="color: #000000">]</span><span style="color: #000000">=</span><span style="color: #000000">'</span><span style="color: #000000">A</span><span style="color: #000000">'</span><span style="color: #000000">+</span><span style="color: #000000">rand()</span><span style="color: #000000">%</span><span style="color: #000000">26</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pKey[k</span><span style="color: #000000">++</span><span style="color: #000000">]</span><span style="color: #000000">=</span><span style="color: #000000">'</span><span style="color: #000000">a</span><span style="color: #000000">'</span><span style="color: #000000">+</span><span style="color: #000000">rand()</span><span style="color: #000000">%</span><span style="color: #000000">26</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;pKey[k]</span><span style="color: #000000">=</span><span style="color: #000000">'</span><span style="color: #000000">\0</span><span style="color: #000000">'</span><span style="color: #000000">;<br />}</span></div><img src ="http://www.cppblog.com/aaxron/aggbug/206266.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2014-03-21 17:40 <a href="http://www.cppblog.com/aaxron/archive/2014/03/21/206266.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>密码学(十)、Openssl的安装</title><link>http://www.cppblog.com/aaxron/archive/2011/06/19/148949.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Sun, 19 Jun 2011 02:20:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2011/06/19/148949.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/148949.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2011/06/19/148949.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/148949.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/148949.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">openssl简介<br />openssl是一个功能丰富且自包含的开源安全工具箱。它提供的主要功能有：SSL协议实现(包括SSLv2、SSLv3和TLSv1)、大量软算法(对称/非对称/摘要)、大数运算、非对称算法密钥生成、ASN.1编解码库、证书请求(PKCS10)编解码、数字证书编解码、CRL编解码、OCSP协议、数字证书验证、PKCS7标准实现和PKCS12个人数字证书格式实现等功能。<br /><br />openssl采用C语言作为开发语言，这使得它具有优秀的跨平台性能。openssl支持Linux、UNIX、windows、Mac等平台。openssl目前最新的版本是openssl-</span><span style="color: #000000; ">1.0</span><span style="color: #000000; ">.0d.<br /><br />官方网址：http://www.openssl.org/<br /><br />linux下的安装：<br />wget&nbsp;http://www.openssl.org/source/openssl-</span><span style="color: #000000; ">1.0</span><span style="color: #000000; ">.0d.tar.gz<br />tar&nbsp;xvzf&nbsp;openssl-</span><span style="color: #000000; ">1.0</span><span style="color: #000000; ">.0d.tar.gz<br />cd&nbsp;openssl-</span><span style="color: #000000; ">1.0</span><span style="color: #000000; ">.0d<br />如果需要zlib压缩模块的话，还需要先安装zlib<br />然后：<br />./config&nbsp;--prefix</span><span style="color: #000000; ">=</span><span style="color: #000000; ">/usr/local/ssl&nbsp;shared&nbsp;zlib-dynamic<br /><br />不需要就直接用：<br />./config&nbsp;--prefix</span><span style="color: #000000; ">=</span><span style="color: #000000; ">/usr/local/ssl&nbsp;shared&nbsp;no-zlib<br /><br />更多详细帮助请运行<br />./config&nbsp;--help<br /><br />然后：<br />make&nbsp;&amp;&amp;&nbsp;make&nbsp;install<br /><br />没问题的话就会一路跑下去，可以去泡杯咖啡，泡个妞，回来差不多就好了。<br /><br />ARM平台的交叉编译安装：<br />编译：openssl<br />./config&nbsp;no-asm&nbsp;no-zlib&nbsp;--prefix</span><span style="color: #000000; ">=</span><span style="color: #000000; ">/arm/openssl&nbsp;os/compiler:arm-linux-gcc<br /><br />修改：<br />CC</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;arm-linux-gcc<br />AR</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;arm-linux-ar&nbsp;$(ARFLAGS)&nbsp;r<br />RANLIB</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;arm-linux-ranlib<br />如果存在&nbsp;-march</span><span style="color: #000000; ">=</span><span style="color: #000000; ">pentium&nbsp;就去掉。<br /><br /><br />windows下的安装：<br />OpenSSL在Windows下的编译安装<br />解压openssl-</span><span style="color: #000000; ">1.0</span><span style="color: #000000; ">.0d.tar.gz以后，&nbsp;在其目录下可以发现有个INSTALL.W32文件，这个文件就是在windows下的安装说明。<br /></span><span style="color: #000000; ">1</span><span style="color: #000000; ">.安装perl</span><span style="color: #000000; ">,</span><span style="color: #000000; ">perl可以从http://www.activestate.com/ActivePerl下载。<br /></span><span style="color: #000000; ">2</span><span style="color: #000000; ">.安装编译器（任意一个都可以）</span><span style="color: #000000; ">,</span><span style="color: #000000; ">我在Visual&nbsp;C++&nbsp;2005安装成功了，VC2008安装失败了<br /><br /></span><span style="color: #000000; ">3</span><span style="color: #000000; ">.如果通过汇编的方式编译，需要安装汇编语言编译器。MASM&nbsp;NASM都可以。如果速度要求不高，可以不用汇编的方式编译，即不需要安装。MASM一般由VC++自带，Windows&nbsp;NT&nbsp;</span><span style="color: #000000; ">4.0</span><span style="color: #000000; ">&nbsp;DDK&nbsp;a和Windows&nbsp;</span><span style="color: #000000; ">98</span><span style="color: #000000; ">&nbsp;DDK也带有MASM。把XXXXXml.exe和XXXXXml.err文件，提取出来，命名为ml.exe和ml.err，并把他们放到PATH路径中即可。<br /><br />NASM可以免费获取，很多地方都可以下载到，如http://www.kernel.org/pub/software/devel/nasm/binaries/win32/<br />nasmw.exe文件也需要放到PATH路径中。<br /><br /></span><span style="color: #000000; ">4</span><span style="color: #000000; ">.打开一个DOS窗口，输入：perl&nbsp;Configure&nbsp;VC-WIN32<br /><br /></span><span style="color: #000000; ">5</span><span style="color: #000000; ">.如果使用MASM，接着输入：ms\do_masm<br />如果使用NASM，接着输入：ms\do_nasm<br />如果不使用汇编语言编译器，输入:ms\do_ms<br /><br />我用的是:ms\do_ms<br /></span><span style="color: #000000; ">6</span><span style="color: #000000; ">.在DOS窗口中接着输入：nmake&nbsp;-f&nbsp;ms\ntdll.mak<br />如果没有错误的话，编译就通过了，在out32dll目录下面就可以看到，生成的dll文件和可执行文件了。把他们放到，PATH环境变量对应的一个目录里就可以了。<br /><br /><br />下一节讲openssl的一些基础知识</span></div><img src ="http://www.cppblog.com/aaxron/aggbug/148949.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2011-06-19 10:20 <a href="http://www.cppblog.com/aaxron/archive/2011/06/19/148949.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>密码学(三)、Crypto++使用</title><link>http://www.cppblog.com/aaxron/archive/2010/12/25/137413.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Sat, 25 Dec 2010 03:29:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2010/12/25/137413.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/137413.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2010/12/25/137413.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/137413.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/137413.html</trackback:ping><description><![CDATA[1.安装<br>Crypto++
的官网:<br>http://www.cryptopp.com/
<br><br>下载,我下的版本是:
<title>Crypto++ Library 5.6.1 - a Free C++ Class Library of Cryptographic Schemes</title>
<h1>Crypto++<sup>&#174;</sup> Library 5.6.1</h1>
解压后,用VS2008有4个工程:<br>cryptest<br>cryptlib<br>cryptopp<br>dlltest<br>
<br>编译 cryptlib 工程
,乖乖,
编译出来的cryptlib.lib
有50多M,<br>不管了.继续.<br>将cryptlib.lib库加入到工程中.
<br>编写hello world<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000; font-family: Verdana;">//现在写一个hello&nbsp;world程序看看能不能编译通过。<br></span><span style="color: #000000; font-family: Verdana;">#include&nbsp;&lt;iostream&gt;<br></span><span style="color: #0000ff; font-family: Verdana;">using</span><span style="color: #000000; font-family: Verdana;">&nbsp;</span><span style="color: #0000ff; font-family: Verdana;">namespace</span><span style="color: #000000; font-family: Verdana;">&nbsp;std;<br><br>#include&nbsp;&lt;cryptopp/aes.h&gt;<br></span><span style="color: #0000ff; font-family: Verdana;">using</span><span style="color: #000000; font-family: Verdana;">&nbsp;</span><span style="color: #0000ff; font-family: Verdana;">namespace</span><span style="color: #000000; font-family: Verdana;">&nbsp;CryptoPP;<br><br></span><span style="color: #0000ff; font-family: Verdana;">int</span><span style="color: #000000; font-family: Verdana;">&nbsp;main()&nbsp;<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;"hello&nbsp;crypto++"&nbsp;&lt;&lt;&nbsp;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;"Aes&nbsp;block&nbsp;size&nbsp;is&nbsp;"&nbsp;&lt;&lt;&nbsp;AES::BLOCKSIZE&nbsp;&lt;&lt;&nbsp;endl;<br><br>&nbsp;</span><span style="color: #0000ff; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return</span><span style="color: #000000; font-family: Verdana;">&nbsp;0</span><span style="color: #000000;"><span style="font-family: Verdana;">;</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">}</span><br>&nbsp;<br></span></div>
<br><br>附上一个用户指南:<br><a title="http://www.cppblog.com/Files/aaxron/CryptoPPGuide.7z" href="http://www.cppblog.com/Files/aaxron/CryptoPPGuide.7z">http://www.cppblog.com/Files/aaxron/CryptoPPGuide.7z
</a><br>
<br><br>  <img src ="http://www.cppblog.com/aaxron/aggbug/137413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2010-12-25 11:29 <a href="http://www.cppblog.com/aaxron/archive/2010/12/25/137413.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>密码学(二)、对称加密和不对称加密</title><link>http://www.cppblog.com/aaxron/archive/2010/12/25/137405.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Sat, 25 Dec 2010 02:07:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2010/12/25/137405.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/137405.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2010/12/25/137405.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/137405.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/137405.html</trackback:ping><description><![CDATA[<span style="font-size: 14pt;"><span style="color: red; font-weight: bold; font-family: Verdana;">对称加密</span><span style="font-family: Verdana;">　　</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">&nbsp;&nbsp; &nbsp;采用单钥密码系统的加密方法，同一个密钥可以同时用作信息的加密和解密，这种加密方法称为对称加密，也称为单密钥加密。 　　</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">需要对加密和解密使用相同密钥的加密算法。由于其速度，对称性加密通常在消息发送方需要加密大量数据时使用。对称性加密也称为密钥加密。 　　</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">所谓对称，就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密。密钥实际上是一种算法，通信发送方使用这种算法加密数据，接收方再以同样的算法解密数据。 　　</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">因此对称式加密本身不是安全的。 </span><br style="font-family: Verdana;"><span style="font-family: Verdana;">　　</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">常用的对称加密算法有：</span><br style="font-family: verdana;" _extended="true">
<pre style="font-family: verdana;" _extended="true">DES（Data Encryption Standard）：数据加密标准，速度较快，适用于加密大量数据的场合。<br _extended="true"><br _extended="true">3DES（Triple DES）：是基于DES，对一块数据用三个不同的密钥进行三次加密，强度更高。<br _extended="true"><br _extended="true">AES（Advanced Encryption Standard）：高级加密标准，是下一代的加密算法标准，速度快，安全级别高； <br><br>RC4，也是为 &nbsp; RSA &nbsp; Data &nbsp; Security, &nbsp; Inc. &nbsp; 开发的密码系统的商标名称。<br><br><br><font style="font-size: 16px; font-family: Verdana;">DES、3DES、Blowfish、IDEA、RC4、RC5、RC6和</font><font style="font-size: 16px;">AES</font>	<br></pre>
<span style="font-family: Verdana;">DES、IDEA、RC2、RC4、SKIPJACK算法等</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">用单钥密码系统的加密方法，同一个密钥可以同时用作信息的加密和解密，这种加密方法称为对称加密，也称为单密钥加密。</span><br style="font-family: Verdana;"><br style="font-family: Verdana;">
<p style="text-indent: -18pt; margin-left: 18pt; font-family: Verdana;"><strong>  DES</strong> </p>
<p style="font-family: Verdana;">单密钥算法,是信息的发送方采用密钥A进行数据加密,信息的接收方采用同一个密钥A进行数据解密.</p>
<p style="font-family: Verdana;">单密钥算法是一个对称算法.</p>
<p style="font-family: Verdana;">缺点:由于采用同一个密钥进行加密解密,在多用户的情况下,密钥保管的安全性是一个问题.</p>
<br style="font-family: Verdana;"><br style="font-family: Verdana;"><span style="color: red; font-weight: bold; font-family: Verdana;">对称加密算法</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">&nbsp;&nbsp; &nbsp;对称加密算法是应用较早的加密算法，技术成熟。在对称加密算法中，数据发信方将明文（原始数据）和加密密钥一起经过特殊加密算法处理后，使其变成复杂的加密密文发送出去。收信方收到密文后，若想解读原文，则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密，才能使其恢复成可读明文。在对称加密算法中，使用的密钥只有一个，发收信双方都使用这个密钥对数据进行加密和解密，这就要求解密方事先必须知道加密密钥。对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。不足之处是，交易双方都使用同样钥匙，安全性得不到保证。此外，每对用户每次使用对称加密算法时，都需要使用其他人不知道的惟一钥匙，这会使得发收信双方所拥有的钥匙数量成几何级数增长，密钥管理成为用户的负担。对称加密算法在分布式网络系统上使用较为困难，主要是因为密钥管理困难，使用成本较高。在计算机专网系统中广泛使用的对称加密算法有DES、IDEA和AES。</span><br style="font-family: Verdana;"><br style="font-family: Verdana;"><span style="font-family: Verdana;">&nbsp; 传统的DES由于只有56位的密钥，因此已经不适应当今分布式开放网络对数据加密安全性的要求。1997年RSA数据安全公司发起了一项&#8220;DES挑战赛&#8221;的活动，志愿者四次分别用四个月、41天、56个小时和22个小时破解了其用56位密钥DES算法加密的密文。即DES加密算法在计算机速度提升后的今天被认为是不安全的。</span><br style="font-family: Verdana;"><br style="font-family: Verdana;"><span style="font-family: Verdana;">&nbsp; AES是美国联邦政府采用的商业及政府数据加密标准，预计将在未来几十年里代替DES在各个领域中得到广泛应用。AES提供128位密钥，因此，128位AES的加密强度是56位DES加密强度的1021倍还多。假设可以制造一部可以在1秒内破解DES密码的机器，那么使用这台机器破解一个128位AES密码需要大约149亿万年的时间。（更深一步比较而言，宇宙一般被认为存在了还不到200亿年）因此可以预计，美国国家标准局倡导的AES即将作为新标准取代DES。</span><br style="font-family: Verdana;"><br style="font-family: Verdana;"><br style="font-family: Verdana;"><br style="font-family: Verdana;"><span style="color: red; font-weight: bold; font-family: Verdana;">非对称加密</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">　　1976年，美国学者Dime和Henman为解决信息公开传送和密钥管理问题，提出一种新的密钥交换协议，允许在不安全的媒体上的通讯双方交换信息，安全地达成一致的密钥，这就是&#8220;公开密钥系统&#8221;。相对于&#8220;对称加密算法&#8221;这种方法也叫做&#8220;非对称加密算法&#8221;。 　　与对称加密算法不同，非对称加密算法需要两个密钥：公开密钥（publickey）和私有密钥（privatekey）。公开密钥与私有密钥是一对，如果用公开密钥对数据进行加密，只有用对应的私有密钥才能解密；如果用私有密钥对数据进行加密，那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥，所以这种算法叫作非对称加密算法。</span><br style="font-family: Verdana;"><br style="font-family: Verdana;"><span style="font-family: Verdana;">特性</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">　　非对称加密算法实现机密信息交换的基本过程是：甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开；得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方；甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。甲方只能用其专用密钥解密由其公用密钥加密后的任何信息。 　　非对称加密算法的保密性比较好，它消除了最终用户交换密钥的需要，但加密和解密花费时间长、速度慢，它不适合于对文件加密而只适用于对少量数据进行加密。 　　经典的非对称加密算法如RSA算法等安全性都相当高. 　　非对称加密的典型应用是数字签名。 　　采用双钥密码系统的加密方法，在一个过程中使用两个密钥，一个用于加密，另一个用于解密，这种加密方法称为非对称加密，也称为公钥加密，因为其中一个密钥是公开的（另一个则需要保密）。</span><br style="font-family: Verdana;"><br style="font-family: Verdana;"><span style="color: red; font-weight: bold; font-family: Verdana;">不对称加密算法</span><br style="font-family: Verdana;"><br style="font-family: Verdana;"><span style="font-family: Verdana;">&nbsp; 不对称加密算法使用两把完全不同但又是完全匹配的一对钥匙—公钥和私钥。在使用不对称加密算法加密文件时，只有使用匹配的一对公钥和私钥，才能完成对明文的加密和解密过程。加密明文时采用公钥加密，解密密文时使用私钥才能完成，而且发信方（加密者）知道收信方的公钥，只有收信方（解密者）才是唯一知道自己私钥的人。不对称加密算法的基本原理是，如果发信方想发送只有收信方才能解读的加密信息，发信方必须首先知道收信方的公钥，然后利用收信方的公钥来加密原文；收信方收到加密密文后，使用自己的私钥才能解密密文。显然，采用不对称加密算法，收发信双方在通信之前，收信方必须将自己早已随机生成的公钥送给发信方，而自己保留私钥。由于不对称算法拥有两个密钥，因而特别适用于分布式系统中的数据加密。广泛应用的不对称加密算法有RSA算法和美国国家标准局提出的DSA。以不对称加密算法为基础的加密技术应用非常广泛。</span><br style="font-family: Verdana;">
<pre style="font-family: verdana;" _extended="true"><br>RSA（Rivest &nbsp; Shamir &nbsp; Adlemen，一种因特网加密和认证体系）：由 RSA 公司发明，是一个支持变长密钥的公共密钥算法，需要加密的文件块的长度也是可变的；<br><span style="font-family: monospace;"></span>
<p><span style="font-family: monospace;"></span>DSA（Digital Signature Algorithm）：数字签名算法，是一种标准的 DSS（数字签名标准）；<span style="font-family: monospace;"><br></span></p>
<p><span style="font-family: monospace;"></span>ECC（Elliptic Curves Cryptography）：椭圆曲线密码编码学。</p>
</pre>
<br style="font-family: Verdana;">
<p style="text-indent: -18pt; margin-left: 18pt; font-family: Verdana;"><strong> DSA</strong> </p>
<p style="font-family: Verdana;">所谓数字签名是指发送方从发送报文中抽取特征数据(称为数字指纹或摘要),然后用发送方的私钥对数字指纹使用加密算法进行算法操作,接受方使用发送方已经公开的公钥解密并验证报文.</p>
<p style="font-family: Verdana;">数字签名用户验证发送方身份或者发送方信息的完整性</p>
<br style="font-family: Verdana;"><br style="font-family: Verdana;"><span style="font-family: Verdana;">中文名称：密钥加密 </span><br style="font-family: Verdana;"><span style="font-family: Verdana;">英文名称：secret key encryption </span><br style="font-family: Verdana;"><span style="font-family: Verdana;">定义：发送和接收数据的双方，使用相同的或对称的密钥对明文进行加密解密运算的加密方法。</span><br style="font-family: Verdana;"><br style="font-family: Verdana;"><span style="font-family: Verdana;">公钥加密</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">中文名称：公钥加密 </span><br style="font-family: Verdana;"><span style="font-family: Verdana;">英文名称：public key encryption </span><br style="font-family: Verdana;"><span style="font-family: Verdana;">定义：由对应的一对唯一性密钥(即公开密钥和私有密钥)组成的加密方法。它解决了密钥的发布和管理问题，是目前商业密码的核心。</span><br style="font-family: Verdana;"><br style="font-family: Verdana;"><span style="font-family: Verdana;">中文名称：数字签名 </span><br style="font-family: Verdana;"><span style="font-family: Verdana;">英文名称：digital signature </span><br style="font-family: Verdana;"><span style="font-family: Verdana;">定义：以电子形式存在于数据信息之中的，或作为其附件的或逻辑上与之有联系的数据，可用于辨别数据签署人的身份，并表明签署人对数据信息中包含的信息的认可。</span><br style="font-family: Verdana;"><br style="font-family: Verdana;"><span style="font-family: Verdana;">数字签名（又称公钥数字签名、电子签章）是一种类似写在纸上的普通的物理签名，但是使用了公钥加密领域的技术实现，用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算，一个用于签名，另一个用于验证。</span><br style="font-family: Verdana;"><br style="font-family: Verdana;"><span style="font-family: Verdana;">Hash算法
</span><br style="font-family: Verdana;"><br style="font-family: Verdana;"><span style="font-family: Verdana;">Hash算法特别的地方在于它是一种单向算法，用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值，却不能通过这个Hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验等。
</span><br style="font-family: Verdana;"><br style="font-family: Verdana;"><span style="font-family: Verdana;">常见的Hash算法有MD2、MD4、MD5、HAVAL、SHA </span><br style="font-family: Verdana;"><br style="font-family: Verdana;">
<p style="text-indent: -18pt; margin-left: 18pt; font-family: Verdana;"><strong> MD5/SHA</strong> </p>
<p style="font-family: Verdana;">MessageDigest是一个数据的数字指纹.即对一个任意长度的数据进行计算,产生一个唯一指纹号.<br>MessageDigest的特性:</p>
<p style="text-indent: -18pt; margin-left: 29.25pt; font-family: Verdana;">A) 两个不同的数据,难以生成相同的指纹号</p>
<p style="text-indent: -18pt; margin-left: 29.25pt; font-family: Verdana;">B) 对于指定的指纹号,难以逆向计算出原始数据</p>
<br style="font-family: Verdana;">
<br style="font-family: Verdana;"><span style="font-family: Verdana;">其他介绍:</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">PGP（Pretty Good Privacy）技术
PGP技术是一个基于不对称加密算法RSA公钥体系的邮件加密技术，也是一种操作简单、使用方便、普及程度较高的加密软件。PGP技术不但可以对电子邮件加密，防止非授权者阅读信件；还能对电子邮件附加数字签名，使收信人能明确了解发信人的真实身份；也可以在不需要通过任何保密渠道传递密钥的情况下，使人们安全地进行保密通信。PGP技术创造性地把RSA不对称加密算法的方便性和传统加密体系结合起来，在数字签名和密钥认证管理机制方面采用了无缝结合的巧妙设计，使其几乎成为最为流行的公钥加密软件包。
</span><br style="font-family: Verdana;"><br style="font-family: Verdana;"><span style="font-family: Verdana;">数字签名（Digital Signature）技术
数字签名技术是不对称加密算法的典型应用。数字签名的应用过程是，数据源发送方使用自己的私钥对数据校验和或其他与数据内容有关的变量进行加密处理，完成对数据的合法&#8220;签名&#8221;，数据接收方则利用对方的公钥来解读收到的&#8220;数字签名&#8221;，并将解读结果用于对数据完整性的检验，以确认签名的合法性。数字签名技术是在网络系统虚拟环境中确认身份的重要技术，完全可以代替现实过程中的&#8220;亲笔签字&#8221;，在技术和法律上有保证。在公钥与私钥管理方面，数字签名应用与加密邮件PGP技术正好相反。在数字签名应用中，发送者的公钥可以很方便地得到，但他的私钥则需要严格保密。
</span><br style="font-family: Verdana;"><br style="font-family: Verdana;"><span style="font-family: Verdana;">PKI（Public Key Infrastructure）技术
PKI技术是一种以不对称加密技术为核心、可以为网络提供安全服务的公钥基础设施。PKI技术最初主要应用在Internet环境中，为复杂的互联网系统提供统一的身份认证、数据加密和完整性保障机制。由于PKI技术在网络安全领域所表现出的巨大优势，因而受到银行、证券、政府等核心应用系统的青睐。PKI技术既是信息安全技术的核心，也是电子商务的关键和基础技术。由于通过网络进行的电子商务、电子政务等活动缺少物理接触，因而使得利用电子方式验证信任关系变得至关重要，PKI技术恰好能够有效解决电子商务应用中的机密性、真实性、完整性、不可否认性和存取控制等安全问题。一个实用的PKI体系还必须充分考虑互操作性和可扩展性。PKI体系所包含的认证中心（CA）、注册中心（RA）、策略管理、密钥与证书管理、密钥备份与恢复、撤销系统等功能模块应该有机地结合在一起。
</span><br style="font-family: Verdana;">
<br style="font-family: Verdana;"><br style="font-family: Verdana;">
<br style="font-family: Verdana;"></span> <img src ="http://www.cppblog.com/aaxron/aggbug/137405.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2010-12-25 10:07 <a href="http://www.cppblog.com/aaxron/archive/2010/12/25/137405.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>密码学(一)、基础</title><link>http://www.cppblog.com/aaxron/archive/2010/12/25/137403.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Sat, 25 Dec 2010 02:03:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2010/12/25/137403.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/137403.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2010/12/25/137403.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/137403.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/137403.html</trackback:ping><description><![CDATA[<span style="font-size: 18pt;"><span style="font-family: Verdana;">密码学基础</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">概述</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">明文（Plaintext）</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">密文(Ciphertext)</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">加密（Encrypt ）</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">解密（Decrypt）</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">密码算法(Cryptography Algorithm)</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">密钥（Secret Key ）</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">1、系统组成</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">2、五元组{ M，C，K，E，D }</span><br style="font-family: Verdana;"><br style="font-family: Verdana;"><span style="font-family: Verdana;">　　密码技术的一个基本功能是实现保密通信，经典的保密通信模型 　　&nbsp;&nbsp; &nbsp;</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">注意：仅用一个保密通信模型来完整描述密码系统，可能是并不全面和准确的，因为现在的密码系统不单单只提供信息的机密性服务。保密通信是密码技术的一个基本功能。</span><br style="font-family: Verdana;"><br style="font-family: Verdana;"><span style="font-family: Verdana;">明文（Plaintext）</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">　　待伪装或加密的消息（Message）。在通信系统中它可能是比特流，如文本、位图、数字化的语音流或数字化的视频图像等 。一般可以简单的认为明文是有意义的字符或比特集，或通过某种公开的编码标准就能获得的消息。明文常用m或p表示。</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">密文(Ciphertext)</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">　　对明文施加某种伪装或变换后的输出，也可认为是不可直接理解的字符或比特集，密文常用c表示。</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">加密（Encrypt ）</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">　　把原始的信息（明文）转换为密文的信息变换过程。</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">解密（Decrypt）</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">　　把己加密的信息（密文）恢复成原始信息明文的过程，也称为脱密。</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">密码算法(Cryptography Algorithm)</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">　　也简称密码（Cipher），通常是指加、解密过程所使用的信息变换规则，是用于信息加密和解密的数学函数。 　　对明文进行加密时所采用的规则称作加密算法，而对密文进行解密时所采用的规则称作解密算法。加密算法和解密算法的操作通常都是在一组密钥的控制下进行的。</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">密钥（Secret Key ）</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">　　密码算法中的一个可变参数，通常是一组满足一定条件的随机序列。 　　用于加密算法的叫做加密密钥，用于解密算法的叫做解密密钥，加密密钥和解密密钥可能相同，也可能不相同。 　　</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">密钥常用k表示。</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">密码系统</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">1、系统组成</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">可以有如下几个部分： 　　</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">&#8211;消息空间M（又称明文空间）：所有可能明文m的集合； 　　</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">&#8211;密文空间C：所有可能密文c的集合； 　　</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">&#8211;密钥空间K：所有可能密钥k的集合，其中每一密钥k由加密密钥ke和解密密钥kd组成，即k＝（ke，kd）； 　　</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">&#8211;加密算法E：一簇由加密密钥控制的、从M到C的加密变换； 　　</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">&#8211;解密算法D: 一簇由解密密钥控制的、从C到M的解密变换。</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">2、五元组{ M，C，K，E，D }</span><br style="font-family: Verdana;"><span style="font-family: Verdana;">对称算法的加密和解密表示为： </span><br style="font-family: Verdana;"><span style="font-family: Verdana;">Ek(M)=C </span><br style="font-family: Verdana;"><span style="font-family: Verdana;">Dk(C)=M </span><br style="font-family: Verdana;"><br style="font-family: Verdana;"><span style="font-family: Verdana;">这种算法具有如下的特性： </span><br style="font-family: Verdana;"><span style="font-family: Verdana;">Dk(Ek(M))=M&nbsp;
</span><br style="font-family: Verdana;">  </span> <img src ="http://www.cppblog.com/aaxron/aggbug/137403.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2010-12-25 10:03 <a href="http://www.cppblog.com/aaxron/archive/2010/12/25/137403.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>