SSH primary Key 和 public key 解析

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 [email protected]
/.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= [email protected]

在文档 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值即可。


未完, 待续。。。

时间: 2024-07-31 12:51:14

SSH primary Key 和 public key 解析的相关文章

linux使用public key方式ssh邓肯、

一.前言: ssh远程登录密码认证的方式有三种,password.Keyboard Interactive.Public Key 前面两种方式就是密码认证,含义都是一样大同小异.第三种是登录方式最安全的一种. 下面我们就来实现第三种方式public key秘钥认证方式. 二.原理: ssh客户端利用服务端发过来的私钥,进行登录的认证,认证服务端的公钥.从来实现 安全的访问. 三.准备: 服务端 系统:Centos7.1 四.服务端生成秘钥 ssh-keygen -b 1024 -t dsa 接下

配置ssh public key登陆时遇到的两个问题

在添加本机的public key到远程服务器之后,理论上如果ssh的配置文件没有问题并且网络和端口是通的,就可以无密码登陆到远程服务器,然而如果不能登陆,则可能是如下两个原因: 远程服务器的$HOME/.ssh目录权限必须是700,$HOME/.ssh/authorized_keys的权限必须是600,本机的$HOME/.ssh/id_rsa或者$HOME/.ssh/id_dsa文件的权限必须是600.这种问题修改文件和目录的权限即可解决. 本机的$HOME/.ssh/known_hosts文件

Xshell配置ssh免密码登录-密钥公钥(Public key)与私钥(Private Key)登录

ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式.其中口令(密码)认证方式是我们最常用的一种,这里介绍密钥认证方式登录到linux/unix的方法. 使用密钥登录分为3步:1.生成密钥(公钥与私钥):2.放置公钥(Public Key)到服务器~/.ssh/authorized_key文件中:3.配置ssh客户端使用密钥登录. 一.生成密钥公钥(Public key)与私钥(Private Key) 打开Xshell,在菜单栏点击"tools",在弹出的菜单中选择&quo

jenkins 配置ssh remotes 报Failed to authenticate with public key

问题:jenkins配置ssh远程连接时候报 ERROR: Failed to authenticate with public key com.jcraft.jsch.JSchException: invalid privatekey: [[email protected] jenkins前端提示:Can't connect to server 原因分析: 本地机器秘钥生成不对 必须将本地私钥完整内容拷贝,包括----字符(可能是个bug) 生成秘钥时候的密码错误 配置步骤: 1. priva

从 ssh private key 中重新生成 public key

Use the -y option to ssh-keygen: ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub From the 'man ssh-keygen' -y This option will read a private OpenSSH format file and print an OpenSSH public key to stdout. 原文地址:https://www.cnblogs.com/pekkle/p/1177

Xshell配置ssh免密码登录-密钥公钥(Public key)

1 简介 ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式.其中口令(密码)认证方式是我们最常用的一种,这里介绍密钥认证方式登录到linux/unix的方法. 使用密钥登录分为3步: 1.生成密钥(公钥与私钥): 2.放置公钥(Public Key)到服务器~/.ssh/authorized_key文件中: 3.配置ssh客户端使用密钥登录. 1.1 生成密钥(公钥与私钥) 打开Xshell,在菜单栏点击“工具”,在弹出的菜单中选择“(新建用户密钥生成向导)”,如下图:   弹出“

使用public key来做SSH authentication

public key authentication(公钥认证)是对通过敲用户名.密码方式登录服务器的一种替代办法.这种方法更加安全更具有适应性,但是更难以配置. 传统的密码认证方式中,你通过证明你你知道正确的密码来证明你是你.证明你知道密码的唯一方式是你告诉服务器密码是什么.这意味着如果服务器被黑掉,或者欺骗,那么一个黑客攻击者就能学习到你的密码. Public key authentication(公钥认证)解决了这个问题.你产生一个密钥对,该密钥对由一个public key(公钥)(每个人都

mysql中key 、primary key 、unique key 与index区别

一.key与primary key区别 CREATE TABLE wh_logrecord ( logrecord_id int(11) NOT NULL auto_increment, user_name varchar(100) default NULL, operation_time datetime default NULL, logrecord_operation varchar(100) default NULL, PRIMARY KEY (logrecord_id), KEY wh

Public key for *.rpm is not installed

[[email protected] mnt]# cd /opt/cdrom/Packages/ [[email protected] Packages]# yum install google-chrome-stable_current_i386.rpm Loaded plugins: refresh-packagekit, rhnplugin This system is not registered with RHN. RHN support will be disabled. base