Archive for June, 2005

桐庐地下游记

2005-6-19 21:22 | by 2ndboy

  这个标题多少有点恐怖+科幻大片的味道:)其实是公司组织的一次旅游,有四个地方可选,本来选了去海岛的,但是早上 5:30 的集合时间戳破我的希望肥皂泡,GF 周日又要加班,所以就选了一个最近的地方了:(

……

RSA 私钥保存格式的研究

2005-6-3 23:52 | by 2ndboy

  打算在文件里保存程序生成的 RSA 私钥以备后用,为了跟标准靠拢就研究了一下 PKCS#1 和 PKCS#8。PKCS#1 可以参考 RFC 2437,为了研究文件格式我还用到了 OpenSSL(用来方便的生成和转换样本)和 ASN1Viewer(用来观察和解读变态的 ASN.1 语法和 DER 编码)。

  首先用 OpenSSL 生成一个 512 位的 RSA 密钥对(其实就是一个私钥,但公钥包含在其中):

  1. openssl genrsa -out rsa_pem.key 512

这样得到的是 PEM 格式的私钥,为了给 ASN1Viewer 看还得转换成 DER 格式:

  1. openssl rsa -inform PEM -outform DER -in rsa_pem.key -out rsa_der.key

用 ASN1Viewer 打开得到的 rsa_der.key,结合 RFC 2437,搞明白了 RSA 私钥的保存格式,RSA 私钥的 ASN.1 定义如下:

  1. RSAPrivateKey ::= SEQUENCE {  30 82 01 3B
  2.   version Version,  02 01 00
  3.   modulus INTEGER,  02 41 ..
  4.   publicExponent INTEGER,
  5.   privateExponent INTEGER,
  6.   prime1 INTEGER,
  7.   prime2 INTEGER,
  8.   exponent1 INTEGER,
  9.   exponent2 INTEGER,
  10.   coefficient INTEGER }

  DER 编码的格式基本上就是:数据类型 type+内容的长度+内容。30 就是 SEQUENCE/SEQUENCE OF 的 type,02 是 INTEGER 的 type。因为目前的 RSA 私钥版本总是 0,所以 Version 这个字段就是 02 01 00 了。这个私钥的长度是 315 个字节(13Bh),但 82 01 3B 是什么意思呢,其实 DER 编码中表示长度有两种格式,127 个字节及以下长度的用一个字节的短格式来表示,超过 127 个字节的长度用长格式来表示。

  82 的最高位是 1,这表示它是一个长格式,剩下 7 位的 2 表示后面的两个字节用来存放长度值,那就是 13B 了:)

  呵呵,到此为止已经搞清楚了 RSA 私钥的保存格式了,当然自己程序里肯定不可能搞个 ASN1 编/解码器,就先 hard code 吧:)不管黑猫白猫,能抓到老鼠就是好猫嘛。

至于 PKCS#8 格式 DER 编码的样本可以这样得到:

  1. openssl pkcs8 -topk8 -inform PEM -outform DER -in rsa_pem.key -out pkcs8_der.key -nocrypt

  这里用了 -nocrypt,所以得到的是不加密的格式。不过想了一下觉得没必要把私钥保存成 PKCS#8 格式,反正现在也只用 RSA 算法,所以就此打住没有继续研究下去了。