首页 > 代码库 > 加密解密

加密解密

  在现代密码学中,加密方法大致可分为对称密钥加密(对称加密)和公开密钥加密(非对称加密)。

 

一. 对称加密(Symmetric-key algorithm,或对等加密: Reciprocal cipher )

对称加密,即加密和解密使用同一个密钥,或者知道一方密钥能够轻易计算出另一方密钥。其解密(decryption)算法等同于加密算法,也就是说,要还原对等加密的密文,套用加密同样的算法即可得到明文。

对称加密的速度比非对称加密快很多,在很多场合都需要对称加密。

对称加密又可分为分组密码(分组加密)和流密码(流加密)。

1. 分组密码

分组密码(Block cipher,又称分块密码),是一种对称密钥密码。它的特点是将明文分成多个等长的组,并用相同的密码算法和密钥对每组分别进行加密和解密。其中典型的如DES和AES作为美国政府核定的标准加密算法,应用领域从电子邮件加密到银行交易转帐,非常广泛。

常见加密算法 AES · Blowfish · DES · 3DES · Serpent · Twofish 
 
次常见加密算法 Camellia · CAST-128 · IDEA · RC2 · RC5 · SEED · Skipjack · TEA · XTEA

密码设计 Feistel network · Key schedule · Product cipher · S-box · P-box · SPN

密码分析 穷举法 · Linear · Differential (Impossible · Truncated) · Integral · Boomerang · Mod n · Related-key · Slide · Rotational · Timing · XSL

密码标准 AES process · CRYPTREC · NESSIE

1) DES:
数据加密标准(Data Encryption Standard)。DES是一种典型的块密码—一种将固定长度的明文通过一系列复杂的操作变成同样长度的密文的算法。对DES而言,块长度为64位。1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来。在某些文献中,作为算法的DES被称为DEA(Data Encryption Algorithm,数据加密算法),以与作为标准的DES区分开来。

DES使用的密钥表面上是64位的,然而只有其中的56位被实际用于算法,其余8位可以被用于奇偶校验,并在算法中被丢弃。因此,DES的有效密钥长度为56位,通常称DES的密钥长度为56位。

DES现在已经不是一种安全的加密方法,主要因为它使用的56位密钥过短。在2001年,DES作为一个标准已经被高级加密标准(AES)所取代。另外,DES已经不再作为国家标准科技协会(前国家标准局)的一个标准。

2) 3DES(或称为Triple DES):
是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。

3DES使用“密钥包”,其包含3个DES密钥,K1,K2和K3,均为56位(除去奇偶校验位)。加密算法为:使用K1为密钥进行DES加密,再用K2为密钥进行DES“解密”,最后以K3进行DES加密。解密则为其反过程。

3) AES:
高级加密标准(Advanced Encryption Standard,AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael为名投稿高级加密标准的甄选流程。

AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特;加密过程中使用的密钥是由Rijndael密钥生成方案产生。

AES在软件及硬件上都能快速地加解密,相对来说较易于实现,且只需要很少的存储器。作为一个新的加密标准,目前正被部署应用到更广大的范围。

4) Blowfish:
Blowfish是1993年布鲁斯·施奈尔开发的对称密钥区块加密算法,区块长为64位,密钥为1至448位的可变长度。与DES等算法相比,其处理速度较快。因为其无须授权即可使用,作为一种自由授权的加密方式在SSH、文件加密软件等被广泛地使用。

5) Serpent:
Serpent 是 Ross Anderson, Eli Biham 和 Lars Knudsen 开发的块加密算法. Serpent 可以使用不同的密钥长度. Serpent 也是高级加密标准 (AES)的5个候选之一.

BestCrypt 以LRW模式使用 Serpent 算法, 256位密钥, 128位块大小和 32 次循环.

6) Twofish:

Twofish 加密算法由布鲁斯·施奈尔(Bruce Schneier)带领的项目组(John Kelsey, Chris Hall, Niels Ferguson, David Wagner 和 Doug Whiting)于1998年开发,可以看作是布鲁斯·施奈尔1993年开发的Blowfish算法的延伸版本。技术上使用与Blowfish类似的计算方法,但是考虑到主要面向于网络应用,提高了更大密钥算法的速度。虽然败给了 Rijndael 算法,但是在加密、解密速度方面具有一定的优势。与Blowfish算法一样,Twofish算法无须授权即可使用。

Twofish 的区块长度为 128 位, 可以使用任意长度密钥(一般为128、192、256位三种密钥长度)。

BestCrypt 是使用完整的 16 次循环和最大可能的 256 位密钥, 以 LRW 模式.

http://zh.wikipedia.org/wiki/Twofish_(%E5%AF%86%E7%A0%81%E5%AD%A6)


2. 流密码

流密码(stream cipher),又称序列密码,相对于区块加密,流密码是先制造一段任意长的钥匙原料,与明文依位元或字符结合,有点类似一次一密密码本(one-time pad)。输出的串流根据加密时的内部状态而定。在一些流密码上由钥匙控制状态的变化。RC4是相当有名的流密码。

在流密码中,一般是将明文m写成连续的符号,利用密钥流中的第i个元素ki对应明文中的第i个元素mi进行加密,若加密变换为E,则加密后的密文为: c=Ek(m)=Ek1(m1)Ek2(m2)...Eki(mki)。设与加密变换E对应的解密变换为D,其中D满足: Dki(Eki(mi))=mi,i=1,2,... 则通过解密运算可译得明文为: m=Dk(c)=Dk1(Ek1(m1))Dk2(Ek2(m2))^=m1m2^,从而完成一次密码通信.

1) RC4
RC4 是由RSA Security的Ron Rivest 在1987年开发出来的,虽然它的官方名是“Rivest Cipher 4”,但是首字母缩写RC也可以理解为Ron‘s Code。RC4开始时是商业密码,没有公开发表出来,但是在94年9月份的时候,它被人匿名公开在了Cypherpunks 邮件列表上,很快它就被发到了sci.crypt 新闻组上,随后从这儿传播到了互联网的许多站点。随之贴出的代码后来被证明是很有水平的,因为它的输出跟取得了RC4版权的私有软件的输出是完全的。由于算法已经公开,rc4也就不再是商业秘密了,只是它的名字“RC4”仍然是一个注册商标。RC4经常被称作是“ARCFOUR”或者"ARC4"(A lleged  RC4,所谓的RC4,因为RSA从来没有官方公布这个算法),这样来避免商标使用的问题。它已经成为一些广泛使用的协议和标准的一部分,比如,包括WEP和WPA的无线网卡和TLS。让它如此广泛分布和使用的主要因素是它不可思议的简单和速度,不管是软件还是硬件,实现起来都十分容易。

http://luck-donkey.iteye.com/blog/513069

http://baike.baidu.com.cn/view/904005.htm

http://wzgyantai.blogbus.com/logs/31867065.html


二. 非对称加密

公开密钥加密(public-key cryptography,也称为非对称(密钥)加密),该思想最早由雷夫·莫寇(Ralph C. Merkle)在1974年提出],之后在1976年,狄菲(Whitfield Diffie)与赫尔曼(Martin Hellman)两位学者以单向函数与单向暗门函数为基础,为发讯与收讯的两方创建金钥。

非对称密钥,是指一对加密密钥与解密密钥,这两个密钥是数学相关,用某用户密钥加密后所得的信息,只能用该用户的解密密钥才能解密。如果知道了其中一个,并不能计算出另外一个。因此如果公开了一对密钥中的一个,并不会危害到另外一个的秘密性质。称公开的密钥为公钥;不公开的密钥为私钥。

如果加密密钥是公开的,这用于客户给私钥所有者上传加密的数据,这被称作为公开密钥加密(狭义)。例如,网络银行的客户发给银行网站的账户操作的加密数据。

如果解密密钥是公开的,用私钥加密的信息,可以用公钥对其解密,用于客户验证持有私钥一方发布的数据或文件是完整准确的,接收者由此可知这条信息确实来自于拥有私钥的某人,这被称作数字签名,公钥的形式就是数字证书。例如,从网上下载的安装程序,一般都带有程序制作者的数字签名,可以证明该程序的确是该作者(公司)发布的而不是第三方伪造的且未被篡改过(身份认证/验证)。

常见的公钥加密算法有: RSA、ElGamal、背包算法、Rabin(Rabin的加密法可以说是RSA方法的特例)、Diffie-Hellman (D-H) 密钥交换协议中的公钥加密算法、Elliptic Curve Cryptography(ECC, 椭圆曲线加密算法)。使用最广泛的是RSA算法,是著名的公开金钥加密算法,ElGamal是另一种常用的非对称加密算法。


1) RSA:
RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。

至今为止还没有人找到一个多项式时间的算法来分解一个大的整数的因子,同时也还没有人能够证明这种算法不存在。

对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。

到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战。

 

比起DES和其它对称算法来说,RSA要慢得多。实际上人们一般使用一种对称算法来加密信息,然后用RSA来加密比较短的对称密码,然后将用RSA加密的对称密码和用对称算法加密的消息传送给接收方。这样一来对随机数的要求就更高了,尤其对产生对称密码的要求非常高,因为否则的话可以越过RSA来直接攻击对称密码。SSL 协议目前就是这么做的。

2) ElGamal:
ELGamal 是T.ElGamal在1985年提出的公钥加密方法。它的安全性是基于求解离散对数问题的困难性,是RSA以后比较有希望的一个公钥密码算法。美国的DSS(Digital Signature Standard)的DSA(Digital Signature Algorithm)算法就是经ElGamal算法演变而来。目前DSA算法应用也非常广泛。

ElGamal 的加密和解密是一个单向的过程,虽然密钥对构造简单,但是只是一方向另外一方单向传送数据进行加解密,不能反向操作,这一点不同于RSA。
另外,ElGamal不足之处就是密文会成倍增长。

一、数据加密的三种方式;

1、对称加密;加密与解密方使用同一个算法, 将数据切割成数据块逐步加密,并且前后块之间有关联关系,被称为块量,解密就是拿到块量做运算,进行解密。

常用的对称加密算法有:

DES(56bits), 3DES, AES(128bits), Blowfish

Twofish, IDEA, RC6, CAST5, Serpent

特点;加密与解密使用同一个口令

      将原文分割成固定大小数据块,对这些数据块进行加密


      加密数度快


缺点;口令传输,安全性不高

      口令太多,不易于记忆

 

2、公钥加密(也称非对称加密);与对称加密算法的主要差别在于,加密和解密的密钥不相同,一个公开(公钥),一个保密(私钥)。解决了对称加密算法密钥分配管理的问题,提高了算法安全性。

非对称算法有;RSA、EIGamal、DSA

特性;发送方数据传输时是用接收方的公钥加密,接收方用自己的私钥解密。

      身份认证是发送方用自己的私钥加密,接收方用对方的公钥解密以此来保证数据安全性。

缺点;非对称加密算法的加密、解密的效率比较低。

 


3、单向加密,对数据按照一定和算法生成特征码,具有不可逆性。

抽取数据特征码的算法有;MD5, SHA1, SHA512, CRC-32

消息认证算法;CBC-MAC、HMAC

特性;

消息认证;只用于验证消息本身,需要加密特征码。

雪崩效应;输入数据的微小改变,会导致结果大的变化。

定长输出;无任输入数据多长,只要使用同一种单向加密算法,输出结果的长度都相同。

结合以上三种加密方法:如下图所示;

技术分享

上图所示,把三种加密算法结合起来使用,对称加密实现了数据的机密性,公钥加密实现身份认证,而单向加密则实现了数据的完整性。

数据的加密和解密

  同一主机内的进程间的通信

    signal发送信号

    共享内存

    semaphore

    message queue MQ RAbbitMQ


  不同主机之间的进程间通信

    套接字对 socket-pair


三种类型的socket

  流套接字(socket_stream),基于TCP协议通信的套接字

  数据报套接字(socket_dgram),基于UDP协议通信的套接字

  裸套接字,原始套接字(socket_raw),基于底层协议通信的套接字


套接字socket:IP:PORT

  进程的地址标识

   一个套接字就是指某个特定主机上的特定应用程序;


大多数情况下,网络通信都是从客户端到服务器的通信;对于服务器来说,必须要有套接字的监听模式,即进程的监听模式,而通常来讲,把具有这种监听模式的进程,称为守护进程,或者服务进程


服务进程所监听的套接字资源,是在其启动之前内核申请注册得到的;而且,饶洁子资源是所有服务进成都站、套接字资源是所有的服务进程独占的资源,具有排他性


端口号:

  0:默认没有被使用

  1~1023:well-known众所周知的端口 固定的端口

  1024~49151:注册端口

  Mysql:3306

  mymcached:11211

  tomcat:8091

  49152~65535:动态端口 为客户端提供的随机选择端口


安全实现的目标

  机密性:confidentiality,保证信息不泄露

  完整性:integrity,保证信息不被篡改

  可用性:availability,保证信息内在价值

威胁安全的行为


威胁机密性的攻击行为

  窃听

  嗅探

  扫描

  通信量分析


威胁完整性的攻击行为

  更改

  伪装

  重放

  否认


威胁可用性的攻击行为

  拒绝服务(DoS)


安全解决方案

  技术:加密解密:

    传统的加密方法:置换、替代加密算法

    现代的加密方法:块加密算法

  服务:安全服务

    身份认证:

    访问控制机制:


加密方案

 加密算法和密钥

 加密算法

   对称加密算法

   公钥加密算法

   单项加密算法

   密钥交换算法


对称加密算法:

  加密和解密使用同一种密钥

  特性:

  1.每对通信主机都需要有一个相同密钥,用于加密和解密

  2.将原始数据分隔成固定大的块,逐个加密

  3.加密解密的速度比较快

  缺陷

  1.加密解密所需要保有的密钥数量过多

  2.密钥分发过于困难


主流加密算法

  DES:DAta Encryption Standard 数据加密标准

    56bit密钥 64bit块

    3DES:triple DES

  AES:Advanced Encryption Standard 高级加密标准

    AES128bit AES192bit AES256bit

  Twofish

  Blowfish

  IDEA

  RC4 RC6


公钥加密算法

  密钥分为私钥和由私钥抽取生成的公钥组成

  私钥:512bit 1024bit 2048bit 4096bit 8192bit 16384bit

 特点

   1.使用密钥对来进行加密和解密;使用私钥加密的数据必须用与之相对的公钥解密;使用公钥解密,必须使用与之相对的私钥才能解密

    私钥是通过特定的工具创建生成,由使用者自己留存,务必保存其私密性secret key 或 private key

    公钥:从私钥中提取生成,公钥可以公开给所有人使用,public key

   2.密钥长度都比较长,加密之后的数据安全等级较高

 缺陷:

  1.加密数据的时候,消耗的系统资源和时间较多,很少用来加密大批量数据;  

 用途

  数字签名:主要用于让接收方确认发送方的身份;使用发送方的私钥加密数据到了接收方之后使用发送方的公钥解密数据;

  密钥交换:发送数据方使用接收方的公钥加密,对称密钥,把加密以后的对称密钥发送给对方;

  数据加密:通常用于加密小数据

常用的公钥加密算法

  RSA:加密,数字签名

  DSA:Digital Signature Algorithm数字签名算法,只能实现数字签名的功能,有时候该算法也被称为DSS,Digital Signature Standard

  ELgamal:收费

单项加密算法

  只能进行加密,不能解密,从已知的数据中提取密码指纹

 特性

   1.定长输出

   2.雪崩效应


 功能:保证数据的完整性;

 常用算法: 

   md5:Message Digest Version 5 信息摘要算法第5版

   128bit定长输出

   sha系列:

     sha-1 160bit 安全的哈希算法 secure hash algorithm

     sha224

     sha256

     sha384

     sha512


密钥交换算法 IKE (Internet key exchange)

  公钥算法

  DH算法Deffie-Hellman


加密算法的联合应用

 1.通信双方互相交换证书,并到信任的CA进行证书认证

 2.发送方使用某种对称加密算法对数据进行加密;对加密后的数据使用单项加密计算其特征值;发送方再用自己的私钥加密此特征值,以证明数据来源的可靠,发送方使用接受方的证书加密对称密钥;

 3.接收方在收到数据之后,先使用自己的私钥解密对称密钥,使用发送方的公钥解密特征值,在利用相同的单项加密算法重新计算加密数据的特征值,比较两个特征值;如果特征值一致表明数据完整;再用解密出来的密钥解密出原始数据;


国际标准化组织(ISO)定义勒令证书的结构和认证标准 X.509协议标准

证书里面主要包括

  拥有者的名称

  拥有者所提交的密钥

  有效期;

  证书的版本号

  证书的序列号

  签发算法的ID

  签发CA的名称

  主题名称

  发证者的唯一标识符

  发证者的数字签名

  扩展信息


PKI:Public Key Infrastructure,公钥基础设施;

证书的签证机构:CA

注册机构:RA

证书吊销列表:CRL,Certification Revoke List;

证书存取库:CAB,Certification Access Base;


CA如何发挥其作用的:

1.通信双方交换证书;

2.双方协商加密算法;

3.双方验证证书的真伪;

4.用CA的公钥解密证书中CA的签名,能解密说明证书来源可靠;

5.用通用的加密算法加密证书,取得特征值;与解密出来的特征值比较,如果相同,说明证书完整性可靠;

6.检查证书的有效期是否在合法时间范围,如果过期则证书不被认可;

7.检查证书的主体名称和此次通信的目标是否能够对应;


SSL:Secure Socket Layer,安全的套接字层;

1994年,Netscape(网景)公司最先声明并实施;

SSL V1.0

SSL V2.0

SSL V3.0


TLS:Transport Layer Security,传输层安全;

IETF:Internet Engineering Task Force,互联网工程项目小组;

1999年提出;


TLS V1.0

2006年,TLS V1.1

2008年,TLS V1.2草案,将椭圆曲线加密算法引入TLS;


分层设计:

1.最底层:基础算法的原语的实现;AES,md5,sha……

2.向上一层:各种算法的基本实现;

3.再向上一层:各种算法组合实现的半成品;

4.最高层,用各种组件拼装而成的各种成品密码学协议软件;


SSL/TLS的handshake(握手)的四个阶段:

1.客户端向服务器索要证书并验证证书;

Client Hello发送的信息内容:

支持的协议的版本,如:TLS V1.2;

客户端生成一个随机数,稍后用于生成会话密钥;

支持的加密算法,如:AES,DES,RSA等;

支持的压缩算法;


2.双方协商生成会话密钥;

Server Hello发送的信息内容:

确认使用的加密协议的版本号,如:TLS V1.2;

服务器生成一个随机数,稍后用于生成会话密钥;

确认加密算法及压缩算法;


3.双方采用已经生成的会话密钥进行安全加密的通信;

客户端验证服务器证书,在确认无误后,取出其公钥;


验证服务器证书需要验证下述内容:

验证发证机构(CA);

验证证书的完整性;

验证证书的持有者信息;

验证证书的有效期;

验证证书的吊销列表;


客户端发送信息给服务器端:

一个随机数,用于服务器上的公钥加密;

编码格式变更通知,表示随后的信息都将用双方已经协商好的加密算法和密钥进行加密发送;


客户端握手结束;


4.双方互相通告握手结束的信息;

服务器收到客户端发送来的此次握手阶段的第三个随机数Pre-Master_key;计算生成本次会话所用到的会话密钥,向客户端发送相关信息:

编码变更通知,表示随后的信息都将用双方已经协商好的加密算法和密钥进行加密发送;


服务器端握手结束;


要想实现加密的功能,依赖于应用程序;

OpenSSL,gpg


加密解密