加密与解密中的一些基本概念

加密与解密中的一些基本概念

X.509标准简介

服务器SSL数字证书和客户端单位数字证书的格式遵循 X.509 标准。 X.509 是由国际电信联盟(ITU-T)制定的数字证书标准。为了提供公用网络用户目录信息服务, ITU 于 1988 年制定了 X.500 系列标准。其中 X.500 和 X.509 是安全认证系统的核心, X.500 定义了一种区别命名规则,以命名树来确保用户名称的唯一性; X.509 则为 X.500 用户名称提供了通信实体鉴别机制,并规定了实体鉴别过程中广泛适用的证书语法和数据接口, X.509 称之为证书。

X.509 给出的鉴别框架是一种基于公开密钥体制的鉴别业务密钥管理。一个用户有两把密钥:一把是用户的专用密钥(简称为:私钥),另一把是其他用户都可得到和利用的公共密钥(简称为:公钥)。用户可用常规加密算法(如 DES)为信息加密,然后再用接收者的公共密钥(公钥)对 DES 进行加密并将之附于信息之上,这样接收者可用对应的专用密钥(私钥)打开 DES 密锁,并对信息解密。该鉴别框架允许用户将其公开密钥存放在CA的目录项中。一个用户如果想与另一个用户交换秘密信息,就可以直接从对方的目录项中获得相应的公开密钥,用于各种安全服务。

最初的 X.509 版本公布于 1988 年,版本 3 的建议稿 1994 年公布,在 1995 年获得批准。本质上, X.509 证书由用户公共密钥与用户标识符组成,此外还包括版本号、证书序列号、CA 标识符、签名算法标识、签发者名称、证书有效期等。用户可通过安全可靠的方式向 CA 提供其公共密钥以获得证书,这样用户就可公开其证书,而任何需要此用户的公共密钥者都能得到此证书,并通过 CA 检验密钥是否正确。这一标准的最新版本 -- X.509 版本 3 是针对包含扩展信息的数字证书,提供一个扩展字段,以提供更多的灵活性及特殊环境下所需的信息传送。

为了进行身份认证, X.509 标准及公共密钥加密系统提供了一个称作数字签名的方案。用户可生成一段信息及其摘要(亦称作信息“指纹”)用户用专用密钥(私钥)对摘要加密以形成签名,接收者用发送者的公共密钥对签名解密,并将之与收到的信息“指纹”进行比较,以确定其真实性。

目前, X.509 标准已在编排公共密钥格式方面被广泛接受,已用于许多网络安全应用程序,其中包括 IP 安全( Ipsec )、安全套接层( SSL )、安全电子交易( SET )、安全多媒体 INTERNET 邮件扩展( S/MIME )等。

X.509 V3

目前数字证书的格式普遍采用的是X.509 V3国际标准,一个标准的X.509数字证书包含以下一些内容:

  • 证书的版本信息;

  • 证书的序列号,每个证书都有一个唯一的证书序列号;

  • 证书所使用的签名算法;

  • 证书的发行机构名称,命名规则一般采用X.500格式;

  • 证书的有效期,现在通用的证书一般采用UTC时间格式,它的计时范围为1950-2049; 

  • 证书所有人的名称,命名规则一般采用X.500格式;

  • 证书所有人的公开密钥;

  • 证书发行者对证书的签名。


PKI(Public Key Infrastructure)

PKI(Public Key Infrastructure )即"公开密钥体系",是一种遵循既定标准的密钥管理平台,它能够为所有网络应用提供加密和数字签名等密码服务及所必需的密钥和证书管理体系,简单来说,PKI就是利用公钥理论和技术建立的提供安全服务的基础设施。PKI技术是信息安全技术的核心,也是电子商务的关键和基础技术。

PKI的基础技术包括加密、数字签名、数据完整性机制、数字信封、双重数字签名等。

PKI的基本组成

完整的PKI系统必须具有权威认证机构(CA)、数字证书库、密钥备份及恢复系统、证书作废系统、应用接口(API)等基本构成部分,构建PKI也将围绕着这五大系统来着手构建。

  • 认证机构(CA):即数字证书的申请及签发机关,CA必须具备权威性的特征;

  • 数字证书库:用于存储已签发的数字证书及公钥,用户可由此获得所需的其他用户的证书及公钥;

  • 密钥备份及恢复系统:如果用户丢失了用于解密数据的密钥,则数据将无法被解密,这将造成合法数据丢失。为避免这种情况,PKI提供备份与恢复密钥的机制。但须注意,密钥的备份与恢复必须由可信的机构来完成。并且,密钥备份与恢复只能针对解密密钥,签名私钥为确保其唯一性而不能够作备份。

  • 证书作废系统:证书作废处理系统是PKI的一个必备的组件。与日常生活中的各种身份证件一样,证书有效期以内也可能需要作废,原因可能是密钥介质丢失或用户身份变更等。为实现这一点,PKI必须提供作废证书的一系列机制。

  • 应用接口(API):PKI的价值在于使用户能够方便地使用加密、数字签名等安全服务,因此一个完整的PKI必须提供良好的应用接口系统,使得各种各样的应用能够以安全、一致、可信的方式与PKI交互,确保安全网络环境的完整性和易用性。

通常来说,CA是证书的签发机构,它是PKI的核心。众所周知,构建密码服务系统的核心内容是如何实现密钥管理。公钥体制涉及到一对密钥(即私钥和公钥),私钥只由用户独立掌握,无须在网上传输,而公钥则是公开的,需要在网上传送,故公钥体制的密钥管理主要是针对公钥的管理问题,目前较好的解决方案是数字证书机制


Privacy-Enhanced Mail(PEM)

Privacy-Enhanced Mail (PEM) is an Internet standard that provides for secure exchange of electronic mail(电子邮件). PEM employs(采用) a range of cryptographic(密码) techniques to allow for confidentiality, sender authentication, and message integrity. The message integrity aspects allow the user to ensure that a message hasn't been modified during transport from the sender. The sender authentication allows a user to verify that the PEM message that they have received is truly from the person who claims to have sent it. The confidentiality feature allows a message to be kept secret from people to whom the message was not addressed.


The Public-Key Cryptography Standards (PKCS)

The Public-Key Cryptography Standards (PKCS)是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。

PKCS是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。到1999年底,PKCS已经公布了以下标准: 

PKCS#1:定义RSA公开密钥算法加密和签名机制,主要用于组织PKCS#7中所描述的数字签名和数字信封。 

PKCS#3:定义Diffie-Hellman密钥交换协议。 

PKCS#5:描述一种利用从口令派生出来的安全密钥加密字符串的方法。使用MD2或MD5 从口令中派生密钥,并采用DES-CBC模式加密。主要用于加密从一个计算机传送到另一个计算机的私人密钥,不能用于加密消息。 

PKCS#6:描述了公钥证书的标准语法,主要描述X.509证书的扩展格式。 

PKCS#7:定义一种通用的消息语法,包括数字签名和加密等用于增强的加密机制,PKCS#7与PEM兼容,所以不需其他密码操作,就可以将加密的消息转换成PEM消息。 

PKCS#8:描述私有密钥信息格式,该信息包括公开密钥算法的私有密钥以及可选的属性集等。 

PKCS#9:定义一些用于PKCS#6证书扩展、PKCS#7数字签名和PKCS#8私钥加密信息的属性类型。 

PKCS#10:描述证书请求语法。 

PKCS#11:称为Cyptoki,定义了一套独立于技术的程序设计接口,用于智能卡和PCMCIA卡之类的加密设备。 

PKCS#12:描述个人信息交换语法标准。描述了将用户公钥、私钥、证书和其他相关信息打包的语法。 

PKCS#13:椭圆曲线密码体制标准。 

PKCS#14:伪随机数生成标准。 

PKCS#15:密码令牌信息格式标准。 


数字证书文件的编码格式

ASN.1(Abstract Syntax Notation One)标准

这是一种描述数字对象的方法和标准。ASN1是一种结构化的数字对象描述语言,它包括两部分:数据描述语言(ISO 8824)和数据编码规则(ISO 8825)。ASN.1的数据描述语言允许用户自定义基本的数据类型,并可以通过简单的数据类型组成更复杂的数据类型。比如:一个复杂的数据对象,如X.509证书,就是在其他一些数据类型上定义的,而其他数据类型又是在更基本的数据类型上建立的,直到回溯到定义的最基本的数据类型。

ASN.1提供了多种数据编码方法。包括了BER、DER、PER和XER等。这些编码方法规定了将数字对象转换成应用程序能够处理、保存和网络传输的二进制编码形式的一组规则。目前经常被采用的是BER(Basic Encode Rules)编码,但是BER编码具有编码不唯 一的性质,也就是说,一个相同的对象通过BER编码可能会产生几种不同的编码数据。所以,在OpenSSL和其他密码学相关软件中经常使用BER的一个子DER(Distinguished Encoding Rules)。对于每一个ASN.1对象,使用DER编码得出的二制编码码数据是唯 一的。

Basic Encode Rules(BER)和 Distinguished Encoding Rules(DER)

基本编码规则(BER)和可辨别编码规则(DER)

OSI定义抽象对象的方法称为ASN.1(Abstract Syntax Notation One,X.208),把这些对象转换成“0”和“1”的比特流的一套规则称为BER(Basic Encoding Rules ,X.209)。ASN.1是一套灵活的记号,它允许定义多种数据类型,从integer、bit string一类的简单类型到结构化类型,如set和sequence,还可以使用这些类型构建复杂类型。BER说明了如何把每种ASN.1类型的值编码为8bit的octet流。通常每个值有不止一种的BER编码方法。一般使用另外一套编码规则DER,它是BER的一个子集,对每个ASN.1值只有唯一一种编码方法。

Basic Encode Rules(BER)

ASN.1的基本编码规则定义了一种或多种把任意ASN.1值表示成字节字符串的方法,缩写为BER。(当然还有其它的方法,但是BER是OSI中转换这些值的标准) 

使用BER,一个ASN.1的值有三种编码方法,选择哪种取决于值的类型和值的长度是否已知。这三种方法是:简单定长编码,结构化定长编码,及结构化不定长编码。简单的non-string类型使用第一种(简单定长编码);结构化类型可使用任一种结构化的编码方法;简单的string类型根据值的长度是否已知可使用任一种方法。隐式标签定义的类型可使用下层类型的方法,显式标签定义的类型使用结构化的编码方法。 

每种BER编码方法都有三或四部分: 

  • Identifier octets:定义了ASN.1值的类和标签值,指明编码方法是简单的还是结构化的。 

  • Length octets:对于定长编码方法,它指出了内容字节个数;对于结构化非定长编码方法,它指明长度是不确定的。

  • Contents octets:对于简单定长编码方法,它给出了值的具体表示;对于结构化的方法,它给出了值内容的BER编码的串联。 

  • End-of-contents octets:对于结构化非定长的编码方法,它表示内容结束;对于其它方法,没有该部分。

Distinguished Encoding Rules(DER)

DER是BER的子集,它定义了使用一个octet string来表示任何ASN.1值的编码方法。DER用于需要使用唯一的octet string编码的应用程序。

Privacy Enhanced Mail(PEM)

PEM编码全称是Privacy Enhanced Mail,是一种保密邮件的编码标准。通常来说,对信息的编码过程基本如下。

  1. 信息转换为ASCII码或其他编码方式,比如采用DER编码。

  2. 使用对称加密算法加密经过编码的信息。

  3. 使用BASE64对加密码后的信息进行编码。

  4. 使用一些头定义对信息进行封装,主要包含了进行正确解码需要的信息,头定义的格式形式如下:

    Proc-Type:4,ENCRYPTED

    DEK-Info:cipher-name,ivec

    其中,第一个头信息标注了该文件是否进行了加密,该头信息可能的值包括ENCRYPTED(信息已经加密和签名),MIC-ONLY(信息经过数据签名但没有加密),MIC-CLEAR(信息经过数字签名但是没有加密,也没有进行编码,可使用非PEM格式阅读),以及CLEAR;第二个头信息标注了加密的算法及对称加密块算法使用的初始向量。

  5. 在这些信息的前面加上如下形式头标注信息:

    ---BEGIN PRIVACY-ENHANCED MESSAGE---

    在这些信息的后面加上如下形尾标注信息:

    ---END PRIVACY-ENHANCED MESSAGE---

OpenSSL的PEM编码基本上是基于DER编码之上的,也就是说,它在上述第一步采用的是DER编码,所以,从本质上来说,OpenSSL的PEM编码就是在DER编码基础上进行BASE64编码,然后添加一些头尾信息组成的。


数字证书的标准

数据编码格式提供了封装数据的基本方法,但是,对于具体的数据对象,比如证书,根据其包含的内容的不同,还有更具体的表达式。

1、X.509证书

目前总的来说有三种常用的证书编码格式:X.509证书、PKCS#12证书和PKCS#7证书。X.509证书是最经常使用的证书,它仅包含了公钥信息而没有私钥信息,是可以公开进行发布的,所以X.509证书对象一般都不需要加密。

X.509证书的格式通常如下:

        ……相关的可读解释信息(省略)……

        ---BEGIN CERTIFICATE---

        ……PEM编码的X.509证书内容(省略)……

        ---END CERTIFICATE---

除了“---BEGIN CERTIFICATE---”和“---END CERTIFICATE---”头尾格式外,还可能有这样不同的标识符:“---BEGIN X.509 CERTIFICATE---”、“---END X.509 CERTIFICATE---”或者“---BEGIN TRUSTED CERTIFICATE---”、“---END TRUSTED          CERTIFICATE---”

在OpenSSL实际签发的证书文件中最前面的很多可读的证书明文解释,只是为了增加证书文件的可读性,并不代表真正的数据。在其他软件中,比如Windows软件,可能并不支持这些额外的明文信息,所以,先要将“---BEGIN CERTIFICATE---”之前的所有可读信息去掉。可以手动删除,也可以使用PEM到PEM的证书格式转换去掉这些明文可读信息。

在Windows平台,X.509证书文件的后缀名经常是der、cer或者crt,都是可以被自动识别的。对于OpenSSL来说,后缀名是没有实际意义的。

2、Netscape证书标准

Netscape提供了一种名为Netscap证书序列(Netscape Cerificate Sequence)的格式来封装一系列证书(实际上里面采用了一个PKCS#7格式来封装证书)。以便能够一次性地下载或者传输多个数字证书。所以,某些时候,Netscape证书序列可以替代PKCS#7的作用,用来打包一系列证书。

Netscape证书序列虽然不一定能够得到微软的支持,但是在其他一些开源软件和Linux软件中却得到了广泛的支持。


数字证书的封装

1、PKCS#12证书

PKCS#12 证书不同于X.509证书,它可以包含一个或多个证书,并且还可以包含证书对应的私钥。PKCS#12的私钥是经过加密的,密钥由用户提供的口令产生。所以,无论在使用PKCS#12证书的时候一般会要用用户输入密钥口令。

PKCS#12证书文件在Windwos平台和Mozzila中支持的后缀名是p12或者pfx,如果要在IE或者Mozzila 中正确使用自己的证书,那么一般来说都要求转换成包含公钥和私钥的PKCS#12证书忖入到相关软件中。


2、PKCS#7

PKCS#7可以封装一个或多个X.509证书或者PKCS#6证书(PKCS#6是一种证书格式,但是并不经常使用)、相关证书链上的CA证书,并且可以包含CRL信息。PKCS#7不包含私钥信息。PKCS#7可以将验证证书需要的整个证书上的证书都包含进来,从而方便证书的发布和正确使用。这样就可以直接把PKCS#7证书发给验证方验证,免去了把以上的验证内容一个一个发给接书方的烦琐了。

PKCS#7文件在Windows平台的合法后缀名是p7b。  


3、PKCS#8

PKCS#8标准是一个非常简单的标准,它主要用于封装私钥和其他相关的属性信息。一般来说,PKCS#8格式的私钥都是被加密的,支持PKCS#5和PKCS#12标准定义的算法,当然,私钥也可以不加密。PKCS#8标准一方面可以增强私钥的安全性,另一方面也为用户提供了一种简单的确立信任关系的方式,这主要是基于私钥特别名称和最高层可信者的权威公钥等属性信息。

OpenSSL提供的经过PEM编码的PKCS#8标准的文件,分为加密和非加密的两种方式。

加密的PKCS#8密钥标识如下:

——BEGIN ENCRYPTED PRIVATE KEY——

——END ENCRYPTED PRIVATE KEY——

非加密的PKCS#8密钥标识如下:

——BEGIN PRIVATE KEY——

——END PRIVATE KEY——


Java Cryptography Architecture(JCA)

JCA提供基本的加密框架,如证书、数字签名、消息摘要和密钥对产生器。

The Java Cryptography Architecture (JCA) is a framework for working with cryptography(密码) using the Java programming language. It forms part of the Java security API, and was first introduced in JDK 1.1 in the java.security package.


The JCA uses a "provider"-based architecture and contains a set of APIs for various purposes, such as encryption(加密), key generation and management, secure random number generation, certificate validation, etc. These APIs provide easy way for developers to integrate(整合) security into application code.


Java Cryptography Extension (JCE)

JCE在JCA的基础上做了扩展,提供了各种加密算法、消息摘要算法和密钥管理等功能。我们已经有所了解的DES算法,AES算法,RSA算法,DSA算法等就是通过JCE来提供的。有关JCE的实现主要在javax.crypto(及其子包)中。

The Java Cryptography Extension (JCE) is an officially released Standard Extension to the Java Platform. JCE provides a framework and implementation for encryption, key generation and key agreement, and Message Authentication Code (MAC) algorithms. JCE supplements the Java platform, which already includes interfaces and implementations of message digests and digital signatures. Installation is specific to the version of the Java Platform you are using, with downloads available for Java 6, Java 7, and Java 8.


JCA和JCE是Java平台提供的用于安全和加密服务的两组API,他们并不执行任何算法,他们只是连接应用和实际算法实现程序的一组接口。软件开发商可以提供根据JCE接口将各种算法实现后,打包成一个Provider(安全提供者),动态地加到Java运行环境中。

===================END===================

你可能感兴趣的:(加密与解密中的一些基本概念)