码迷,mamicode.com
首页 > 其他好文 > 详细

SSH primary Key 和 public key 解析

时间:2015-05-07 15:57:06      阅读:292      评论:0      收藏:0      [点我收藏+]

标签:

 

SSH key 用到的是非对称加密RSA 算法,关于 RSA算法, 下面的博客有详细的介绍:

http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html

 

这里只列举几个关键的点, 以介绍秘钥的产生:

  1. 随意选择两个大的素数pqp不等于q,计算N=pq
  2. 根据欧拉函数,求得r = (p-1)(q-1)
  3. 选择一个小于 r 的整数 e,求得 e 关于模 r 的模反元素,命名为d。(模反元素存在,当且仅当e与r互质)
  4. p q 的记录销毁。

将(e, N)作为公钥, (d,N)作为私钥。

 

下面介绍, 如果已经有了公钥和私钥, 如何从公钥或者私钥中, 得到我们想要的: N, p,q,e,d.

为了便于测试, 先生成私钥或者公钥:


/.ssh # ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (//.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in //.ssh/id_rsa.
Your public key has been saved in //.ssh/id_rsa.pub.
The key fingerprint is:
19:bf:69:0f:99:27:cc:b4:10:35:3a:6b:1e:ef:ea:cc root@xencde2
/.ssh # ls
id_rsa id_rsa.pub known_hosts nohup.out

 

id_rsa  为私钥:

/.ssh # cat id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQCrkIeHgyOwfKpFrBqa6/vlRkm4MJWN4hR/SjH7b2q5f2dYpHJk
HaA8EcVFgF+zVqd8f78MjCAX2F0Rpr3hdbfgjyGzvqEwO9JZfWAnL37ziDalJibd
8KohZ13fVcDo9P/M0wmeK+AMXLa7qSxjtmMuiR+NRajLRIMQZF4TlMfU/QIBIwKB
gQChwsjte6VOoW1XokT4eBljJQOtqiabt+dws6t4CfbpaX6yqa2u2hq8S0T4Yxhn
QxLxukZq6oSoxK+Fq9eaD+fgz0hajayI7hFRZVSDT+3Uq/g6Cn819X+/5bFxE5v/
4OtUtWFeSO4juS6Fp0q/IHtuSS2fUYCvJS0svZx33KaEPwJBAN1Z1pyYvGU0U2Vj
SOs2kglholQOcUKuDrr7PfSCnpPnWNpY3nVwZ+2WlHTYclNoO0XlymBmew2P4/Ho
XQ/+zIcCQQDGa5wfKqxOfCQg4Us9FdVEj639Q+2h2W3vEwprec5jB5ZAEy0rBnbJ
wEQeDGx+lxGvy1A5e8UAAVJUBhCawxdbAkAZTBiG7OJUtYXfs5NOFN19aj5wAaaL
RxegVzpH1GnlBH8u5ZXER1xVqs8jS+/PBJkPTXY25yQBjMmX/Ux220qTAkBmC3Tc
1B4ZvC/WZTyjEorwD2DLZMNajRP3S571cdfbKHkoRGBfRScl7dnjkVxeXFI9JruL
RveZmkeY7S0cZFUnAkEAs88IGTjLdgX31hv3AXT3YcwwiIKa8I5eZfxZMV2l4X6A
iX5mzEtYi7LKhsDE8B+X67L3L46TEed95QLX9be7Kg==
-----END RSA PRIVATE KEY-----

id_rsa.pub 为公钥:

/.ssh # cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAq5CHh4MjsHyqRawamuv75UZJuDCVjeIUf0ox+29quX9nWKRyZB2gPBHFRYBfs1anfH+/DIwgF9hdEaa94XW34I8hs76hMDvSWX1gJy9+84g2pSYm3fCqIWdd31XA6PT/zNMJnivgDFy2u6ksY7ZjLokfjUWoy0SDEGReE5TH1P0= root@xencde2

 

 

在文档 RFC3447 中定义了 RSA 密钥的语法结构,私钥的语法结构如下所示:

RSAPrivateKey ::= SEQUENCE {
 version Version,
 modulus INTEGER, -- n
 publicExponent INTEGER, -- e
 privateExponent INTEGER, -- d
 prime1 INTEGER, -- p
 prime2 INTEGER, -- q
 exponent1 INTEGER, -- d mod (p-1)
 exponent2 INTEGER, -- d mod (q-1)
 coefficient INTEGER, -- (inverse of q) mod p
 otherPrimeInfos OtherPrimeInfos OPTIONAL
 }

version 是 RSA 的版本号,本文中使用的密钥版本号是 0,如果密钥是使用多素数(多于 2 个素数)版本号则为 1。

modulus 是 RSA 的合数模 n。

publicExponent 是 RSA 的公开幂 e。

privateExponent 是 RSA 的私有幂 d。

prime1 是 n 的素数因子 p。

prime2 i 是 n 的素数因子 q。

exponent1 等于 d mod (p − 1)。

exponent2 等于 d mod (q − 1)。

coefficient 是 CRT 系数 q–1 mod p。

otherPrimeInfos 按顺序包含了其它素数 r3,……,ru 的信息。如果 version 是 0 ,它应该被忽略;而如果 version 是 1,它应该至少包含 OtherPrimeInfo 的一个实例。

RSA 公钥的语法结构如下所示,可见公钥所需的因子信息都包含在私钥中。

RSAPublicKey ::= SEQUENCE {
 modulus INTEGER, -- n
 publicExponent INTEGER -- e
}


OpenSSH 的 RSA 密钥的文件体使用 DER 编码,JDK 提供了 DerInputStream 来解析 DER 编码的字符串。所以 OpenSSH 密钥的解析很简单,首先读取密钥,过滤掉开始和结束标志,文件头(如果是加密的密钥则需要根据文件头信息来确定解密方式,因本文使用未加密的密钥故去掉文件头),然后使用 DER inputstream 来解析密钥,代码如下:


以ssh-rsa打头,描述“RSA-1024”结尾的形式,中间是Base64编码。

 

这里过滤掉除了Base64外的其他部分,解码Base64得到公钥二进制内容。

这里二进制编码格式如下:

前11字节固定

0 0 0 7 ‘s‘ ‘s‘ ‘h‘ ‘-‘ ‘r‘ ‘s‘ ‘a‘

紧接着4个字节为一个int值,表示public exponent所占字节长度

可通过移位符及相加或者BigInteger方式实现转换。

 

 

得到长度后,再从后一字节开始读取该长度字节作为public exponent的值,构造相应BigInteger。

 

 

再紧接着4个字节也是一个int值,表示modulus所占字节长度,同理转换得到长度。

再根据长度读取字节数组得到modulus值即可。




未完, 待续。。。

 

SSH primary Key 和 public key 解析

标签:

原文地址:http://www.cnblogs.com/qingdao-wind/p/4484893.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!