??xml version="1.0" encoding="utf-8" standalone="yes"?> DES 单密钥算?是信息的发送方采用密钥Aq行数据加密,信息的接收方采用同一个密钥Aq行数据解密. 单密钥算法是一个对U算? ~点:׃采用同一个密钥进行加密解?在多用户的情况下,密钥保管的安全性是一个问? DSAQDigital Signature AlgorithmQ:数字{法Q是一U标准的 DSSQ数字签名标准)Q?span style="font-family: monospace;">
]]>
int GetRSA(RSA **RsaKeys)
{
*RsaKeys=RSA_generate_key(RSALEN,RSA_F4,NULL,NULL);
if(NULL==*RsaKeys)
return -1;
return 0 ;
}
//取得U钥
int GetPrivateKey(RSA *RsaKeys,RSA **Pvtkey)
{
*Pvtkey = RSAPrivateKey_dup(RsaKeys);
if(NULL==*Pvtkey)
return -1;
return 0;
}
//U钥To数据?/span>
int PrivateKeyToData(RSA *Pvtkey,unsigned char* bufkey)
{
BIO* pBio = BIO_new(BIO_s_mem());
if (pBio == NULL) {
return -1;
}
memset(bufkey,'\0',RSALEN);
if( i2d_RSAPrivateKey_bio(pBio,Pvtkey) < 0 ) {
BIO_free(pBio);
return -1;
}
BIO_read(pBio,bufkey,RSALEN);
BIO_free(pBio);
return 0;
}
//数据ToU钥
int DataToPrivateKey(unsigned char* bufkey,RSA **Pvtkey)
{
BIO *pBio = BIO_new(BIO_s_mem());
if (pBio == NULL) {
return -1;
}
BIO_write(pBio,bufkey,RSALEN);
if( NULL == d2i_RSAPrivateKey_bio(pBio,Pvtkey)) {
BIO_free(pBio);
return -1;
}
BIO_free(pBio);
return 0;
}
//取得公钥
int GetPublicKey(RSA *RsaKeys,RSA **Pubkey)
{
*Pubkey = RSAPublicKey_dup(RsaKeys);
if(NULL==*Pubkey)
return -1;
return 0;
}
//公钥To数据?/span>
int PublicKeyToData(RSA *Pubkey,unsigned char* bufkey)
{
BIO *pBio = BIO_new(BIO_s_mem());
if (pBio ==NULL) {
return -1;
}
memset(bufkey,'\0',RSALEN);
if(i2d_RSAPublicKey_bio(pBio,Pubkey) < 0) {
BIO_free(pBio);
return -1;
}
BIO_read(pBio,bufkey,RSALEN);
BIO_free(pBio);
return 0;
}
//数据To公钥
int DataToPublicKey(unsigned char*bufkey,RSA **Pubkey)
{
BIO * pBio=BIO_new(BIO_s_mem());
if (pBio ==NULL)
{
return -1;
}
BIO_write(pBio,bufkey,RSALEN);
if( d2i_RSAPublicKey_bio(pBio,Pubkey) < 0 ) {
BIO_free(pBio);
return -1;
}
BIO_free(pBio);
return 0;
}
/*公钥加密->U钥解密*/
int RSAPublicEncrypt(RSA *Publickey, char *From, char *To)
{
int len=0;
len = RSA_size(Publickey) -11;
if(-1 == (len=RSA_public_encrypt(len,(unsigned char *)From,(unsigned char *)To,Publickey,RSA_PKCS1_PADDING)) )
return -1;
return len;
}
/*U钥解密<-公钥加密*/
int RSAPrivateDecrypt(RSA *Privtekey, char *From, char *To)
{
if(-1 == (RSA_private_decrypt(RSALEN/8,(unsigned char *)From,(unsigned char *)To,Privtekey,RSA_PKCS1_PADDING)))
return -1;
return 0;
}
/*U钥加密->公钥解密*/
int RSAPrivateEncrypt(RSA *Privtekey, char *From, char *To)
{
int len = RSA_size(Privtekey)-11;
if(-1 == (len = RSA_private_encrypt(len,(unsigned char *)From,(unsigned char *)To,Privtekey,RSA_PKCS1_PADDING)))
return -1;
return len;
}
/*公钥解密<-U钥加密*/
int RSAPublicDecrypt(RSA *Publickey, char *From, char *To)
{
if(-1 == (RSA_public_decrypt(RSALEN/8,(unsigned char *)From,(unsigned char *)To,Publickey,RSA_PKCS1_PADDING)) )
return -1;
return 0;
}
//void DesEncrypt(char *Key,char *Msg, char *Result,int Length)
//{
// int n=0;
// DES_cblock desblock;
// DES_key_schedule schedule;
//
// DES_string_to_key(Key,&desblock);
// DES_set_key_checked( &desblock, &schedule );
//
// DES_cfb64_encrypt( (unsigned char *)Msg, (unsigned char *)Result,
// Length, &schedule, &desblock, &n, DES_ENCRYPT );
//
//}
//
//
//void DesDecrypt( char *Key, char *Msg, char *Result,int Length)
//{
//
// int n=0;
//
// DES_cblock desblock;
// DES_key_schedule schedule;
//
// DES_string_to_key(Key,&desblock);
// DES_set_key_checked( &desblock, &schedule );
//
// DES_cfb64_encrypt( (unsigned char *) Msg, (unsigned char *)Result,
// Length, &schedule, &desblock, &n, DES_DECRYPT );
//
//}
void DESGenerateKey(char *pKey)
{
int nLen=33;
int flag=0;
int i,k=0;
srand((unsigned)time(NULL));
for(i=0;i<nLen-1;i++)
{
flag=rand()%2;
if(flag)
pKey[k++]='A'+rand()%26;
else
pKey[k++]='a'+rand()%26;
}
pKey[k]='\0';
}
]]>
openssl采用C语言作ؓ开发语aQ这使得它具有优U的跨q_性能。openssl支持Linux、UNIX、windows、Mac{^台。openssl目前最新的版本是openssl-1.0.0d.
官方|址Qhttp://www.openssl.org/
linux下的安装Q?br />wget http://www.openssl.org/source/openssl-1.0.0d.tar.gz
tar xvzf openssl-1.0.0d.tar.gz
cd openssl-1.0.0d
如果需要zlib压羃模块的话Q还需要先安装zlib
然后Q?br />./config --prefix=/usr/local/ssl shared zlib-dynamic
不需要就直接用:
./config --prefix=/usr/local/ssl shared no-zlib
更多详细帮助误?br />./config --help
然后Q?br />make && make install
没问题的话就会一路跑下去Q可以去泡杯咖啡Q个妞Q回来差不多好了?br />
ARMq_的交叉编译安装:
~译Qopenssl
./config no-asm no-zlib --prefix=/arm/openssl os/compiler:arm-linux-gcc
修改Q?br />CC= arm-linux-gcc
AR= arm-linux-ar $(ARFLAGS) r
RANLIB= arm-linux-ranlib
如果存在 -march=pentium 去掉?br />
windows下的安装Q?br />OpenSSL在Windows下的~译安装
解压openssl-1.0.0d.tar.gz以后Q?nbsp;在其目录下可以发现有个INSTALL.W32文gQ这个文件就是在windows下的安装说明?br />1.安装perl,perl可以从http://www.activestate.com/ActivePerl下蝲?br />2.安装~译器(L一个都可以Q?/span>,我在Visual C++ 2005安装成功了,VC2008安装p|?br />
3.如果通过汇编的方式编译,需要安装汇~语a~译器。MASM NASM都可以。如果速度要求不高Q可以不用汇~的方式~译Q即不需要安装。MASM一般由VC++自带QWindows NT 4.0 DDK a和Windows 98 DDK也带有MASM。把XXXXXml.exe和XXXXXml.err文gQ提取出来,命名为ml.exe和ml.errQƈ把他们放到PATH路径中即可?br />
NASM可以免费获取Q很多地斚w可以下蝲刎ͼ如http://www.kernel.org/pub/software/devel/nasm/binaries/win32/
nasmw.exe文g也需要放到PATH路径中?br />
4.打开一个DOSH口Q输入:perl Configure VC-WIN32
5.如果使用MASMQ接着输入Qms\do_masm
如果使用NASMQ接着输入Qms\do_nasm
如果不用汇~语a~译器,输入:ms\do_ms
我用的是:ms\do_ms
6.在DOSH口中接着输入Qnmake -f ms\ntdll.mak
如果没有错误的话Q编译就通过了,在out32dll目录下面可以看刎ͼ生成的dll文g和可执行文g了。把他们攑ֈQPATH环境变量对应的一个目录里可以了?br />
下一节讲openssl的一些基知识
]]>
http://www.cryptopp.com/
下蝲,我下的版本是:
Crypto++® Library 5.6.1
解压?用VS2008?个工E?
cryptest
cryptlib
cryptopp
dlltest
~译 cryptlib 工程
,乖乖,
~译出来的cryptlib.lib
?0多M,
不管?l箋.
cryptlib.lib库加入到工程?
~写hello world
using namespace std;
#include <cryptopp/aes.h>
using namespace CryptoPP;
int main()
{
cout << "hello crypto++" << endl;
cout << "Aes block size is " << AES::BLOCKSIZE << endl;
return 0;
}
附上一个用h?
http://www.shnenglu.com/Files/aaxron/CryptoPPGuide.7z
]]>
采用单钥密码pȝ的加密方法,同一个密钥可以同时用作信息的加密和解密,q种加密Ҏ(gu)UCؓ对称加密Q也UCؓ单密钥加密?
需要对加密和解密用相同密钥的加密法。由于其速度Q对U性加密通常在消息发送方需要加密大量数据时使用。对U性加密也UCؓ密钥加密?
所谓对Uͼ是采用q种加密Ҏ(gu)的双方用方式用同样的密钥进行加密和解密。密钥实际上是一U算法,通信发送方使用q种法加密数据Q接收方再以同样的算法解密数据?
因此对称式加密本w不是安全的?
常用的对U加密算法有Q?/span>
DESQData Encryption StandardQ:数据加密标准Q速度较快Q适用于加密大量数据的场合?br _extended="true">
DES、IDEA、RC2、RC4、SKIPJACK法{?/span>
3DESQTriple DESQ:是基于DESQ对一块数据用三个不同的密钥进行三ơ加密,强度更高?br _extended="true">
AESQAdvanced Encryption StandardQ:高加密标准Q是下一代的加密法标准Q速度快,安全U别高;
RC4Q也是ؓ RSA Data Security, Inc. 开发的密码pȝ的商标名U?br>
DES?DES、Blowfish、IDEA、RC4、RC5、RC6?/font>AES
用单钥密码系l的加密Ҏ(gu)Q同一个密钥可以同时用作信息的加密和解密,q种加密Ҏ(gu)UCؓ对称加密Q也UCؓ单密钥加密?/span>
对称加密法
对称加密法是应用较早的加密法Q技术成熟。在对称加密法中,数据发信方将明文Q原始数据)和加密密钥一Lq特D加密算法处理后Q其变成复杂的加密密文发送出厅R收信方收到密文后,若想解读原文Q则需要用加密用q的密钥及相同算法的逆算法对密文q行解密Q才能其恢复成可读明文。在对称加密法中,使用的密钥只有一个,发收信双斚w使用q个密钥Ҏ(gu)据进行加密和解密Q这p求解密方事先必须知道加密密钥。对U加密算法的特点是算法公开、计量、加密速度快、加密效率高。不之处是Q交易双斚w使用同样钥匙Q安全性得不到保证。此外,每对用户每次使用对称加密法Ӟ都需要用其他h不知道的惟一钥匙Q这会得发收信双方所拥有的钥匙数量成几何U数增长Q密钥管理成为用L负担。对U加密算法在分布式网l系l上使用较ؓ困难Q主要是因ؓ密钥理困难Q用成本较高。在计算Z|系l中q泛使用的对U加密算法有DES、IDEA和AES?/span>
传统的DES׃只有56位的密钥Q因此已l不适应当今分布式开攄l对数据加密安全性的要求?997qRSA数据安全公司发v了一?#8220;DES挑战?#8221;的活动,志愿者四ơ分别用四个月?1天?6个小时和22个小时破解了其用56位密钥DES法加密的密文。即DES加密法在计机速度提升后的今天被认为是不安全的?/span>
AES是美国联邦政府采用的商业及政府数据加密标准,预计在未来几十q里代替DES在各个领域中得到q泛应用。AES提供128位密钥,因此Q?28位AES的加密强度是56位DES加密强度?021倍还多。假讑֏以制造一部可以在1U内破解DES密码的机器,那么使用q台机器破解一?28位AES密码需要大U?49亿万q的旉。(更深一步比较而言Q宇宙一般被认ؓ存在了还不到200亿年Q因此可以预计,国国家标准局倡导的AES卛_作ؓ新标准取代DES?/span>
非对U加?/span>
1976q_国学者Dime和Henman决信息公开传送和密钥理问题Q提ZU新的密钥交换协议,允许在不安全的媒体上的通讯双方交换信息Q安全地达成一致的密钥Q这是“公开密钥pȝ”。相对于“对称加密法”q种Ҏ(gu)也叫?#8220;非对U加密算?#8221;? 与对U加密算法不同,非对U加密算法需要两个密钥:公开密钥QpublickeyQ和U有密钥QprivatekeyQ。公开密钥与私有密钥是一对,如果用公开密钥Ҏ(gu)据进行加密,只有用对应的U有密钥才能解密Q如果用U有密钥Ҏ(gu)据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这U算法叫作非对称加密法?/span>
Ҏ(gu)?/span>
非对U加密算法实现机密信息交换的基本q程是:甲方生成一对密钥ƈ其中的一把作为公用密钥向其它方公开Q得到该公用密钥的乙方用该密钥Ҏ(gu)密信息进行加密后再发送给甲方Q甲方再用自׃存的另一把专用密钥对加密后的信息q行解密。甲方只能用其专用密钥解密由其公用密钥加密后的Q何信息? 非对U加密算法的保密性比较好Q它消除了最l用户交换密钥的需要,但加密和解密p旉ѝ速度慢,它不适合于对文g加密而只适用于对量数据q行加密? l典的非对称加密法如RSA法{安全性都相当? 非对U加密的典型应用是数字签名? 采用双钥密码pȝ的加密方法,在一个过E中使用两个密钥Q一个用于加密,另一个用于解密,q种加密Ҏ(gu)UCؓ非对U加密,也称为公钥加密,因ؓ其中一个密钥是公开的(另一个则需要保密)?/span>
不对U加密算?/span>
不对U加密算法用两把完全不同但又是完全匚w的一寚w匙—公钥和U钥。在使用不对U加密算法加密文件时Q只有用匹配的一对公钥和U钥Q才能完成对明文的加密和解密q程。加密明文时采用公钥加密Q解密密文时使用U钥才能完成Q而且发信方(加密者)知道收信方的公钥Q只有收信方Q解密者)才是唯一知道自己U钥的h。不对称加密法的基本原理是Q如果发信方惛_送只有收信方才能解读的加密信息,发信方必首先知道收信方的公钥,然后利用收信方的公钥来加密原文;收信Ҏ(gu)到加密密文后Q用自qU钥才能解密密文。显Ӟ采用不对U加密算法,收发信双方在通信之前Q收信方必须自己早已随机生成的公钥送给发信方,而自׃留私钥。由于不对称法拥有两个密钥Q因而特别适用于分布式pȝ中的数据加密。广泛应用的不对U加密算法有RSA法和美国国家标准局提出的DSA。以不对U加密算法ؓ基础的加密技术应用非常广泛?/span>
RSAQRivest Shamir AdlemenQ一U因特网加密和认证体p)Q由 RSA 公司发明Q是一个支持变长密钥的公共密钥法Q需要加密的文g块的长度也是可变的;
ECCQElliptic Curves CryptographyQ:椭圆曲线密码~码学?/p>
DSA
所谓数字签名是指发送方从发送报文中抽取特征数据(UCؓ数字指纹或摘?,然后用发送方的私钥对数字指纹使用加密法q行法操作,接受方用发送方已经公开的公钥解密ƈ验证报文.
数字{用户验证发送方w䆾或者发送方信息的完整?/p>
MD5/SHA MessageDigest是一个数据的数字指纹.卛_一个Q意长度的数据q行计算,产生一个唯一指纹? A) 两个不同的数?难以生成相同的指U号 B) 对于指定的指U号,难以逆向计算出原始数?/p>
中文名称Q密钥加?
英文名称Qsecret key encryption
定义Q发送和接收数据的双方,使用相同的或对称的密钥对明文q行加密解密q算的加密方法?/span>
公钥加密
中文名称Q公钥加?
英文名称Qpublic key encryption
定义Q由对应的一对唯一性密?卛_开密钥和私有密?l成的加密方法。它解决了密钥的发布和管理问题,是目前商业密码的核心?/span>
中文名称Q数字签?
英文名称Qdigital signature
定义Q以?sh)子形式存在于数据信息之中的Q或作ؓ光件的或逻辑上与之有联系的数据,可用于L别数据签|h的n份,q表明签|hҎ(gu)据信息中包含的信息的认可?/span>
数字{Q又U公钥数字签名、电(sh)子签章)是一U类似写在纸上的普通的物理{Q但是用了公钥加密领域的技术实玎ͼ用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运,一个用于签名,另一个用于验证?/span>
Hash法
Hash法特别的地方在于它是一U单向算法,用户可以通过Hash法对目标信息生成一D늉定长度的唯一的Hash|却不能通过q个Hash值重新获得目标信息。因此Hash法常用在不可还原的密码存储、信息完整性校验等?
常见的Hash法有MD2、MD4、MD5、HAVAL、SHA
MessageDigest的特?
其他介绍:
PGPQPretty Good PrivacyQ技?
PGP技术是一个基于不对称加密法RSA公钥体系的邮件加密技术,也是一U操作简单、用方ѝ普及程度较高的加密软g。PGP技术不但可以对?sh)子邮g加密Q防止非授权者阅MӞq能对电(sh)子邮仉加数字签名,使收信h能明了解发信h的真实n份;也可以在不需要通过M保密渠道传递密钥的情况下,使h们安全地q行保密通信。PGP技术创造性地把RSA不对U加密算法的方便性和传统加密体系l合hQ在数字{和密钥认证管理机制方面采用了无缝l合的y妙设计,使其几乎成ؓ最为流行的公钥加密软g包?
数字{QDigital SignatureQ技?
数字{技术是不对U加密算法的典型应用。数字签名的应用q程是,数据源发送方使用自己的私钥对数据校验和或其他与数据内Ҏ(gu)关的变量q行加密处理Q完成对数据的合?#8220;{”Q数据接收方则利用对方的公钥来解L到的“数字{”Qƈ解ȝ果用于对数据完整性的验,以确认签名的合法性。数字签名技术是在网l系l虚拟环境中认w䆾的重要技术,完全可以代替现实q程中的“亲笔{֭”Q在技术和法律上有保证。在公钥与私钥管理方面,数字{应用与加密邮件PGP技术正好相反。在数字{应用中,发送者的公钥可以很方便地得到Q但他的U钥则需要严g密?
PKIQPublic Key InfrastructureQ技?
PKI技术是一U以不对U加密技术ؓ核心、可以ؓ|络提供安全服务的公钥基设施。PKI技术最初主要应用在Internet环境中,为复杂的互联|系l提供统一的n份认证、数据加密和完整性保障机制。由于PKI技术在|络安全领域所表现出的巨大优势Q因而受到银行、证券、政府等核心应用pȝ的青睐。PKI技术既是信息安全技术的核心Q也是电(sh)子商务的关键和基技术。由于通过|络q行的电(sh)子商务、电(sh)子政务等zd~少物理接触Q因而得利用电(sh)子方式验证信dpd得至关重要,PKI技术恰好能够有效解决电(sh)子商务应用中的机密性、真实性、完整性、不可否认性和存取控制{安全问题。一个实用的PKI体系q必d分考虑互操作性和可扩展性。PKI体系所包含的认证中心(CAQ、注册中心(RAQ、策略管理、密钥与证书理、密钥备份与恢复、撤销pȝ{功能模块应该有机地l合在一赗?
]]>
概述
明文QPlaintextQ?/span>
密文(Ciphertext)
加密QEncrypt Q?/span>
解密QDecryptQ?/span>
密码法(Cryptography Algorithm)
密钥QSecret Key Q?/span>
1、系l组?/span>
2、五元组{ MQCQKQEQD }
密码技术的一个基本功能是实现保密通信Q经典的保密通信模型
注意Q仅用一个保密通信模型来完整描q密码系l,可能是ƈ不全面和准确的,因ؓ现在的密码系l不单单只提供信息的机密性服务。保密通信是密码技术的一个基本功能?/span>
明文QPlaintextQ?/span>
待伪装或加密的消息(MessageQ。在通信pȝ中它可能是比Ҏ(gu)Q如文本、位图、数字化的语x或数字化的视频图像等 。一般可以简单的认ؓ明文是有意义的字W或比特集,或通过某种公开的编码标准就能获得的消息。明文常用m或p表示?/span>
密文(Ciphertext)
Ҏ(gu)文施加某U伪装或变换后的输出Q也可认为是不可直接理解的字W或比特集,密文常用c表示?/span>
加密QEncrypt Q?/span>
把原始的信息Q明文)转换为密文的信息变换q程?/span>
解密QDecryptQ?/span>
把己加密的信息(密文Q恢复成原始信息明文的过E,也称密?/span>
密码法(Cryptography Algorithm)
也简U密码(CipherQ,通常是指加、解密过E所使用的信息变换规则,是用于信息加密和解密的数学函数? Ҏ(gu)文进行加密时所采用的规则称作加密算法,而对密文q行解密时所采用的规则称作解密算法。加密算法和解密法的操作通常都是在一l密钥的控制下进行的?/span>
密钥QSecret Key Q?/span>
密码法中的一个可变参敎ͼ通常是一l满一定条件的随机序列? 用于加密法的叫做加密密钥,用于解密法的叫做解密密钥,加密密钥和解密密钥可能相同,也可能不相同?
密钥常用k表示?/span>
密码pȝ
1、系l组?/span>
可以有如下几个部分:
–消息I间MQ又U明文空_Q所有可能明文m的集合;
–密文I间CQ所有可能密文c的集合;
–密钥I间KQ所有可能密钥k的集合,其中每一密钥k由加密密钥ke和解密密钥kdl成Q即kQ(keQkdQ;
–加密法EQ一由加密密钥控制的、从M到C的加密变换;
–解密法D: 一由解密密钥控制的、从C到M的解密变换?/span>
2、五元组{ MQCQKQEQD }
对称法的加密和解密表示为:
Ek(M)=C
Dk(C)=M
q种法h如下的特性:
Dk(Ek(M))=M
]]>