加密与解密
- 对称密码体制的保密性主要取决于密钥的保密性,与算法的保密性无关
- 非对称加密算法与对称加密算法的区别:
(1)、用于消息解密的密钥值与用于消息加密的密钥值不同;
(2)、非对称加密算法比对称加密算法慢数千倍,但在保护通信安全方面,非对称加密算法却具有对称密码难以企及的优势。
对称加密算法
又叫传统密码算法,也叫私钥加密。在对称加密体制中,存在的最重要的问题之一就是密钥的分发问题,也就是如何将密钥传送给需要它们的用户。
- 特点:
- 优点:算法公开、计算量小、加密速度快、加密效率高。
- 缺点是:交易双方都使用同样密钥,安全性得不到保证。此外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一密钥,这会使得发收信双方所拥有的钥匙数量呈几何级数增长,密钥管理成为用户的负担。
- 分类:
流加密算法和块加密算法。 -
包括:
DES、3DES、TDEA、Blowfish、RC5、IDEA、AES、CAST、RC2、RC4。
流加密算法
流加密算法在当今应用不是很广泛,比较著名的有RC4和A5算法。
流加密算法是将明文与一个密钥流进行XOR(逻辑异或)运算生成密文。将密文与相同的密钥流进行XOR运算即可还原成明文。流加密是以二进制的单个位为单位进行数据加密。流加密算法的关键在于密钥流必须是随机的,而且合法用户可以很容易再生该密钥流。流加密算法的密钥流是通过使用一个随机位发生器和一个短的密钥来产生密钥流,这个密钥由用户记住。
块加密算法
块加密算法是加密算法中应用最广泛的类型。块加密算法每次是对固定大小(如64位、128位、256位等)的位块进行加密。块加密算法将明文分成m个块,对每个块进行相同的变换,从而产生m个密文块。块的大小可以是任意数目,但一般都是2的N次方。如果明文的大小不是块大小的整数倍,解决这一问题的常见的方法对位不足的块用0进行填充,从而使得明文长度是块大小的整数倍。当然,这要求加密时能填充字符,解密时能够检测出填充字符。
非对称加密算法
非对称密码体制将加密运算和解密运算分离,通信双方无需事先交换密钥就可以建立保密通信。并且该体制采用密钥管理技术,大大减少了多用户通信所需的密钥量,节省了系统资源。
- 特点:
- 优点:保密性比较好,它消除了最终用户交换密钥的需要。
- 缺点:算法强度复杂、安全性依赖于算法与密钥,由于其算法复杂,加密解密速度没有对称加密解密的速度快。
-
包括:
RSA、Elgamal、背包算法、Rabin、DH、ECC(椭圆曲线加密算法)、DSA。
摘要算法
消息摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。消息摘要算法不存在密钥的管理与分发问题,适合于分布式网络相同上使用。现在,消息摘要算法主要应用在“数字签名”领域,作为对明文的摘要算法。
- 特点:
- 单向性
- 抗弱碰撞
- 抗强碰撞
- 包括:
MD5、SHA-1、SHA-2、SHA-256、SHA-512等
MD5
Message Digest Algorithm 5,流行度极高,但目前被发现存在碰撞冲突风险; 任意长度输出为128bit=16字节摘要
SHA1
SHA 指Security Hash Algorithm,由美国国家安全局NSA设计的安全散列算法系列; SHA1 输出长度为160bit=20字节摘要
SHA256
继SHA1 出现的算法(属于SHA-2类),安全性较SHA1更高; SHA256 输出长度为256bit=32字节摘要。
MAC(HMAC) 算法
MAC(Message Authentication Code,消息认证码算法)是含有密钥的散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加入了密钥。因次,我们也常把MAC称为HMAC(keyed-Hash Message Authentication Code)。
MAC算法主要集合了MD和SHA两大系列消息摘要算法。MD系列的算法有HmacMD2、HmacMD4、HmacMD5三种算法;SHA系列的算法有HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA512五种算法。
经过MAC算法得到的摘要值也可以使用十六进制编码表示,其摘要值长度与参与实现的摘要值长度相同。例如,HmacSHA1算法得到的摘要长度就是SHA1算法得到的摘要长度,都是160位二进制码,换算成十六进制编码为40位。
- HMAC和MAC在密码学上的区别:
MAC是一个散列映射关系
HMAC是构建MAC的一种方式
数字签名
数字签名的技术基础是公钥密码技术。
数字签名主要的功能是:
(1)、确认信息是由签名者发送的;(身份认证)
(2)、确认信息自签名后到收到为止,未被修改过;(完整性)
(3)、签名者无法否认信息是由自己发送的。(不可抵赖性)数字签名技术:
将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送的公钥才能解密被加密的摘要信息,然后用Hash函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。一个数字签名体制一般包含两个组成部分:
签名算法(signaturealgorithm)和验证算法(verification algorithm)。签名算法用于对消息产生数字签名,它通常受一个签名密钥的控制,签名算法或者签名密钥是保密的,由签名者掌握;验证算法用于对消息的数字签名进行验证,根据签名是否有效验证算法能够给出该签名为“真”或者“假”的结论。验证算法通常也受一个验证密钥的控制,但验证算法和验证密钥应当是公开的,以便需要验证签名的人能够方便的验证-
数字签名的实现方法:
数字证书
数字证书就是互联网通讯中标志通讯各方身份信息的一串数字,提供了一种在Internet上验证通信实体身份的方式,是由一个由权威机构----CA 机构,又称为证书授权(Certificate Authority)中心发行的,人们可以在网上用来识别对方的身份。数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名,此外,数字证书只在特定的时间段内有效。
- 数字证书工作原理:
数字证书采用公钥体制,即利用一对互相匹配的密钥进行加密、解密。每个用户自己设定一把特定的仅为本人所知的私有密钥(私钥),用它进行解密和签名;同时设定一把公共密钥(公钥)并由本人公开,为一组用户所共享,用于加密和验证签名。当发送一份保密文件时,发送方使用接收方的公钥对数据加密,而接收方则使用自己的私钥解密,这样信息就可以安全无误地到达目的地了。通过数字的手段保证加密过程是一个不可逆过程,即只有用私有密钥才能解密。在公开密钥密码体制中,常用的一种是RSA体制。其数学原理是将一个大数分解成两个质数的乘积,加密和解密用的是两个不同的密钥。即使已知明文、密文和加密密钥(公开密钥),想要推导出解密密钥(私密密钥),在计算上是不可能的。
- 数字证书从应用角度分类:
(1)、服务器证书(SSL证书):被安装于服务器设备上,用来证明服务器的身份和进行通信加密。服务器证书可以用来防止欺诈钓鱼站点。在服务器上安装服务器证书后,客户端浏览器可以与服务器证书建立SSL连接,在SSL连接上传输的任何数据都会被加密。同时,浏览器会自动验证服务器证书是否有效,验证所访问的站点是否是假冒站点,服务器证书保护的站点多被用来进行密码登录、订单处理、网上银行交易等。SSL证书主要用于服务器(应用)的数据传输链路加密和身份认证,绑定网站域名,不同的产品对于不同价值的数据和要求不同的身份认证。
(2)、电子邮件证书:可以用来证明电子邮件发件人的真实性。它并不证明数字证书上面CN一项所标识的证书所有者姓名的真实性,它只证明邮件地址的真实性。收到具有有效电子签名的电子邮件,我们除了能相信邮件确实由指定邮箱发出外,还可以确信该邮件从被发出后没有被篡改过。另外,使用接收的邮件证书,我们还可以向接收方发送加密邮件。该加密邮件可以在非安全网络传输,只有接收方的持有者才可能打开该邮件。
(3)、客户端个人证书:主要被用来进行身份验证和电子签名。安全的客户端证书被存储于专用的usbkey中。存储于key中的证书不能被导出或复制,且key使用时需要输入key的保护密码。使用该证书需要物理上获得其存储介质usbkey,且需要知道key的保护密码,这也被称为双因子认证。这种认证手段是目前internet最安全的身份认证手段之一。key的种类有多种,指纹识别、第三键确认,语音报读,以及带显示屏的专用usbkey和普通usbkey等。
- 数字证书格式:目前普遍采用的是X.509V3国际标准,一个标准的X.509数字证书包含以下一些内容:
(1)、证书的版本信息;
(2)、证书的序列号,每个证书都有一个唯一的证书序列号;
(3)、证书所使用的签名算法;
(4)、证书的发行机构名称,命名规则一般采用X.500格式;
(5)、证书的有效期,现在通用的证书一般采用UTC时间格式,它的计时范围为1950-2049;
(6)、证书所有人的名称,命名规则一般采用X.500格式;
(7)、证书所有人的公开密钥;
(8)、证书发行者对证书的签名。
数字信封
数字信封(digital envelope)是将对称密钥通过非对称加密(即有公钥和私钥两个)的结果分发对称密钥的方法。
数字信封包含被加密的内容和被加密的用于加密该内容的密钥。虽然经常使用接收方的公钥来加密“加密密钥”,但这并不是必须的,也可以使用发送方和接收方预共享的对称密钥来加密。当接收方收到数字信封时,先用私钥或预共享密钥解密,得到“加密密钥”,再用该密钥解密密文,获得原文。数字信封技术使用两层加密体系。
数字信封是一种综合利用了对称加密技术和非对称加密技术两者的优点进行信息安全传输的一种技术。数字信封既发挥了对称加密算法速度快、安全性好的优点,又发挥了非对称加密算法密钥管理方便的优点。
数字信封是公钥密码体制在实际中的一个应用,是用加密技术来保证只有规定的特定收信人才能阅读通信的内容。
编解码算法
1. Hex 编码
将二进制数据按16进制转换为字符串,1字节=2个字符,编码后体积为2倍。
2. Base64
由MIME规范定义的编码算法,其将3个字节(24位)编码为4个字符。 字符集包括64个,可表示6二进制位的数据,因此一个字符对应一组6bit的数据。 编码后体积约为4/3倍,针对不足位数用=补齐。
协议
SSL
- 概念
安全套接字层(SSL, Secure Sockets Layer)是一种协议,支持服务通过网络进行通信而不损害安全性。它在客户端和服务器之间创建一个安全连接。然后通过该连接安全地发送任意数据量。 - 用途
主要用在Web领域,它是利用数据的加密技术保障数据在互联网上安全传输的,确保其传输过程中不至于被窃听或截听,甚至是即使在被窃听或截听的情况下数据也不会被破译。对于Web,SSL已被广泛地运用,保证Web浏览器与Web浏览器之间数据加密传输与身份认证等。 - 必要条件
安全套接字是用于服务器之上的一个加密系统,它可以确保在客户机与服务器之间传输的数据仍然是安全与隐秘的。要使服务器和客户机使用SSL进行安全的通信,服务器必须有两样东西:密钥对(Key pair)和证书(Certificate)。
工作过程
SSL使用安全握手来初始化客户机与服务器之间的安全连接。在握手期间,客户机和服务器对它们将要为此会话使用的密钥及加密方法达成一致。客户机使用服务器证书验证服务器。握手之后,SSL被用来加密和解密HTTPS(组合SSL和HTTP的一个独特协议)请求和服务器响应中的所有信息,包括:
(1)、客户机正在请求的URL;
(2)、提交的表单的内容;
(3)、访问授权信息(比如用户名和密码);
(4)、所有在客户机与服务器之间发送的数据。
SSL及其继任者传输层安全(TransportLayer Security, TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。SSL用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上传输过程中不会被截取及窃听。
SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持,如图1。SSL协议可分为两层:(1)、SSL记录协议(SSLRecord Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持;(2)、SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
功能
(1)、SSL实际上是一种调和各种加密算法的策略,能调用各种加密算法的功能模块,对传输的真实数据进行加密,防止传输的数据被黑客截取,即使被截取,由于数据是被加密过的,所以也能保证数据在一定的时间内很难被破译,但是不能保证100%的安全,这是任何安全策略都不能做到的;
(2)、SSL还能提供保护数据完整性策略,确保在传输中数据不被非法篡改,主要采用相关摘要算法来实现;
(3)、SSL还具备认证功能,主要是可以认证客户端的合法性(相对于服务器而言)和服务器的合法性(相对于客户端),这种认证非常重要,很多的攻击都是黑客伪装成合法的对等方来攻击的,如中间人攻击技术。
(4)、SSL也支持数据传输前被压缩功能,数据压缩的目的是减少网络传输负载。
TLS
安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。
该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议。
TLS握手过程
- 当客户端连接到支持TLS协议的服务器要求创建安全连接并列出了受支持的密码组合(加密密码算法和加密哈希函数),握手开始。
- 服务器从该列表中决定加密和散列函数,并通知客户端。
- 服务器发回其数字证书,此证书通常包含服务器的名称、受信任的证书颁发机构(CA)和服务器的公钥。
- 客户端确认其颁发的证书的有效性。
- 为了生成会话密钥用于安全连接,客户端使用服务器的公钥加密随机生成的密钥,并将其发送到服务器,只有服务器才能使用自己的私钥解密。
- 利用随机数,双方生成用于加密和解密的对称密钥。这就是TLS协议的握手,握手完毕后的连接是安全的,直到连接(被)关闭。如果上述任何一个步骤失败,TLS握手过程就会失败,并且断开所有的连接。
开源库
OpenSSL
在计算机网络上,OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连线者的身份。这个包广泛被应用在互联网的网页服务器上。
其主要库是以C语言所写成,实现了基本的加密功能,实现了SSL与TLS协议。OpenSSL可以运行在OpenVMS、 Microsoft Windows以及绝大多数类Unix操作系统上。
OpenSSL包含3个部分:密码算法库、SSL协议库、应用程序。
源代码组成
(1)、工具源码库,主要存放在/apps文件夹下,如果默认编译,则只编译成openssl(windows环境下编译成openssl.exe)可执行文件。其包含各种丰富的命令工具,并且各个源码可单独进行编译;
(2)、范例源码在/demos目录下;
(3)、测试源码主要在/test下;
(4)、SSL库所有源代码都在/ssl文件目录下,包括SSL系列源码。各系列的版本基本都有客户端函数源码(_clnt.c)、服务端函数源码(_srvr.c)、还有通用函数源码(_both.c)以及底层包源码(_pkt.c)、方法函数源码(_meth.c)等协议相关的各种密钥计算函数源码(_enc.c);
(5)、crypto源代码库是OpenSSL库最基础的代码库,包括如下内容:
A、对称算法与非对称算法以及摘要算法封装crypto/evp目录下;
B、crypto/hmac目录,实现基于对称算法的MAC;
C、对称算法(crypto/aes、crypto/omp、crypto/bf、crypto/des和crypto/cast等目录);
D、非对称算法(crypto/dh、crypto/ec、crypto/ecdh和crypto/dsa);
E、密钥交换/认证算法(crypto/dh和crypto/krb5)以及摘要算法(crypto/md2、crypto/md4、crypto/md5和crypto/sha);
F、队列(crypto/pqueue目录),实现队列数据结构,用于DTLS;
G、随机数(crypto/rand目录),实现伪随机数生成,同时支持用户自定义随机数生成;
H、x509数字证书(crypto/x509v3和crypto/x509),包含数字证书申请、数字证书以及CRL的构造、解析和签名验证等功能;
I、asn.1 DER编码解码(crypto/asn1目录),包含基本asn1对象的编解码及数字证书请求、数字证书和CRL撤销列表及PKCS8等基本的编解码函数。这些函数是通过宏来实现的;
J、抽象IO接口(BIO, crypto/bio),其目录下的函数对各种输入输出进行抽象封装,包括内存、文件、socket、标准输入输出和SSL协议;
K、hash表(crypto/lhash目录),实现了散列表的数据结构。OpenSSL中很多数据结构都是以散列表来存放的;
M、数字证书在线认证(crypto/ocsp目录),实现了ocsp协议的编解码以及证书有效性计算等功能;
N、堆栈(crypto/stack目录),实现了堆栈数据结构;
O、pkcs7消息语法(crypto/pkcs7目录),主要实现了构造和解析PKCS7消息;
P、文件数据库(crypto/txt_db目录);
Q、DSO(动态共享对象,crypto/dso目录),本目录下的文件主要抽象了各种平台的动态库加载函数,为用户提供统一接口;
R、硬件引擎(crypto/engine目录),硬件引擎接口。用户如果要写自己的硬件引擎,必须实现它所规定的接口;
S、PEM文件格式处理(crypto/pem),用于生成和读取各种PEM格式文件,包括各种密钥、数字证书请求、数字证书、PKCS7消息和PKCS8消息等;
T、pkcsl2个人证书格式(crypto/pckcsl2目录),主要功能为实现证书的构造和解析功能;
U、线程支持功能(crypto/threads),OpenSSL支持多线程,但是用户必须实现相关接口;
V、错误处理功能(crypto/err目录),当程序出现错误时,OpenSSL能以堆栈的形式显示各个错误。本目录下只有基本的错误处理接口,具体的错误信息由各个模块提供;
W、大数运算功能(crypto/bn目录),本目录下的文件实现了各种大数运算。这些大数运算主要用于非对称算法中密钥生成以及各种加解密操作。另外还为用户提供了大量辅助函数,比如内存与大数之间的相互转换;
X、字符缓存操作功能(crypto/buffer目录),为字符操作提供内存缓冲区;
Y、配置文件读取(crypto/conf目录),OpenSSL主要配置文件为OpenSSL.cnf。本目录下的函数实现了对这种格式配置文件的读取操作。
SSL协议的实现源代码位于OpenSSL的ssl目录下。SSL的所有实现中,都有客户端实现(_clnt.c)、服务端实现(_srvr.c)、加密实现(_enc.c)、记录协议实现(_pkt.c)、METHOD方法(_meth.c)、客户端服务端都用到的握手方法实现(_both.c),以及对外提供的函数实现(_lib.c)等。ssl.h文件,可以看到SSL的主要数据结构。包括SSL_CTX、SSL和SSL_SESSION。SSL_CTX主要功能为SSL握手阶段的环境准备、准备SSL握手阶段所需的证书、私有密钥、版本及其它选项。SSL的主要功能为准备SSL握手阶段与传送数据信息。SSL_SESSION数据结构则为了保存主密钥、会话ID、读写各种密钥等。SSL_CTX数据结构初始化在最先,紧接着是初始化SSL数据结构。
SSL记录层的实现
首先对明文数据进行分片,每片有固定大小,其次将每个分片单独压缩,而不是放在一起进行压缩,然后对每一个压缩包进行MAC计算,并产生一个MAC值,之后对这个压缩包进行加密,最后将这个加密后的密文与MAC值放在一起用协议头进行封装,如图2。
SSL协议握手层实现
(1)、client端向server端发送的第一个开始信息是hello单词以及SSL的版本号、client端支持的加密算法、一个client端自动生成的伪随机号等,向server端表示一个新会话连接的开始。
(2)、server端根据client端发过来的信息判断是否接受这个新的会话,不需要就断开连接,client会继续发送hello建立会话,直到server接收这个会话连接或到自己放弃这个会话连接。如果server答应这个会话建立,则server在回应对方信息时将含有未来数据加密所必须的任何数据,如版本号、支持的加密算法、一个服务器端自动生成的伪随机数等;
(3)、client端会依据收到的来自server端的数据产生主key,并使用server端的public key加密这个主key后,将加密过的key传给server,因为只有server有public key的另一把private key,所以只有真正的server能解密;
(4)、server解密成功后,返回给client一个用主key认证的数据,以此数据让client端认证自己;
(5)、如果是双认证模式,还要采取方式对另一边也进行认证;
(6)、最后双方都要发送done或over信息表示握手结束,如图3。