Quantcast
Channel: Security – ArchBoy
Viewing all articles
Browse latest Browse all 9

RFC 4880 阅读笔记

$
0
0

《RFC 4880 OpenPGP Message Format》 定义和说明了 OpenPGP 数据的元素和结构,如果想深入了解 OpenPGP 的工作原理或者做一些基于它的开发的话,则阅读该文档是很有帮助的。在阅读该规范前,最好先对 OpenPGP 的作用、原理和使用方法有一定的了解,这里有几篇文章可以参考:

Packet

OpenPGP 数据的基本组成单位是packet(包),packet的结构图如下:

rfc 4880 read notes -01

一个 packet 包含 header 和 body 两部分,其中 header 包含一个用于表示当前packet类型的tag和表示packet内容长度的 body length。
OpenPGP 数据可以有1个或多个packet组成,另外每个packet里面还可以包含其他packet。OpenPGP 数据的结构图如下:

rfc 4880 read notes -02

已加密数据及Key数据

已加密数据及Key数据是 OpenPGP 主要两种数据(文件),其中已加密数据的结构图如下(每个框表示一个packet):

rfc 4880 read notes -03
加密数据的生成过程如下:

  • message为原始消息。
  • 首先使用摘要算法计算出一个hash值,然后使用消息发送者的private key加密,形成一个signature(签名)。
  • message经过压缩算法形成一个压缩包。
  • 生成一个随机session key。
  • 使用session key和对称加密算法加密message压缩包和signature。
  • 使用消息接收者的 public key 加密 session key。如果这个消息要同时发送给多个接收者,则分别使用每个接收者的public key解密。
  • 将已加密的 session key 和 已加密的“message和signature”通过base64编码为由可视字符组成的message block。注意message block有header和footer包围起来,其中header还允许一些“键-值”对,在body区还有一个crc24校验码。详细信息可阅读文档第6章“Radix-64 Conversions”。

Key数据的结构图如下:

rfc 4880 read notes -04

各个packet的简单介绍

  • public key:这个是非对称加密中 keypair (钥匙对)的public key(公钥部分)。如果当前key数据为private key(私钥),则这个packet同时包含 public key 和 private key。
  • Revocation signature:这个是撤销当前key的一个签名。因为 OpenPGP 的分布式key管理模式,一旦public key发布到服务器则无法被删除,如果key拥有者在某个时候的确想作废此key,则需要生成一个revocation signature,然后提交到key server。
  • User id:即用户名和Email地址,具体内容可以是多变的。一个key可以拥有多个user id(正如一个人可以拥有多个email地址),key拥有者必须签名每个user id,以证明这个user id是自己添加的。其他用户如果对这个user id表示信任,也可以签名它。
  • User attribute:这个跟user id作用是一样的,只不过内容可以多元一些,比如允许一张头像照片。
  • subkey:一个key可以拥有多个子key。一般情况下主key用户签名user id和subkey,或者用于对信息进行数字签名,而subkey则用于加密信息。这样做的好处是一旦某个subkey被泄露了,key拥有者只需撤销它然后重新生成一个subkey即可,而不至于需要整个key报废。GPG默认的组合是一个RSA用于签名一个RSA用户加密,或者一个DSA用于签名一个Elgamal用于加密,又或者单独一个DSA或者单独一个RSA仅用于签名。跟user id类似,key拥有者必须签名每个subkey,以证明这个subkey是自己添加的。

 

数据元素格式

OpenPGP数据由如下几种元素组成:

  • 整数:采用big-endian方式表示,即高位的数字放在前头,比如 [11 22 33] 表示 11*2^16 + 22*2^8 + 33。
  • 多倍整数:又叫MPIs,即编程当中的big integer。前2个字节表示整数的长度,后面的表示整数的数值。比如 [00 09 01 FF] 表示此数字的长度为9位,数字的值为 0x01FF,即511。
  • Key ID:Key ID是一个8字节的整数。这个整数其实是 fingerprint 的低64位。而fingerprint则是对整个public packet进行160位的SHA-1的hash值。一般来说不同的key应该有不同的key id,但也有可能出现重复的情况。
  • 文本:OpenPGP的文本均使用UTF-8编码。
  • 时间:一个32位整数,数值是由 1970-1-1 00:00:00 UTC 以来所经历的秒数。
  • Keyrings:即多个Key的集合。
  • S2K:String-to-key 的简称。即用户输入的密码(passphrase),一般用来(对称)加密用户的private key。

 

其他

OpenPGP 的结构相对来说比较简单,内容比较多的主要是文档的第5章“packet”,其中以第2节“Signature Packet”比较复杂,不过耐心阅读的话一般没有什么问题的。

当阅读完 RFC 4880 之后,另外还有一个文档 《RFC 3156 MIME Security with OpenPGP》描述了用 OpenPGP 对邮件进行加密和数字签名的规范,也是应该阅读的。

参考文档:

RFC 4880 OpenPGP Message Format http://tools.ietf.org/html/rfc4880
RFC 3156 MIME Security with OpenPGP http://tools.ietf.org/html/rfc3156

本站文章采用 CC BY-NC-ND 授权协议,转载时请保留署名和本文链接,谢谢!From ArchBoy, post RFC 4880 阅读笔记
ad:稳定靠谱的虚拟主机(VPS)提供商 Linode,点击这个链接了解一下吧~

Viewing all articles
Browse latest Browse all 9

Trending Articles