标签:
SSH key 用到的是非对称加密RSA 算法,关于 RSA算法, 下面的博客有详细的介绍:
http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html
这里只列举几个关键的点, 以介绍秘钥的产生:
将(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