php 公鑰格式轉換,如何把OpenSSH公鑰轉換成OpenSSL格式

《如何把OpenSSH公鑰轉換成OpenSSL格式》要點:

本文介紹了如何把OpenSSH公鑰轉換成OpenSSL格式,希望對您有用。如果有疑問,可以聯系我們。

首先看看OpenSSL工具的簡單使用方法,我們以rsa加密算法為例

生成一個私鑰:

openssl genrsa -out private.key 1024

-out指定生成私鑰文件名 1024是生成密鑰的長度

利用私鑰生成對應的公鑰:

openssl rsa -in private.key -pubout -out public.key

-in 指定的私鑰,-out 指定公鑰文件名

加密文件:

openssl rsautl -encrypt -in test -inkey public.key -pubin -out test_encrypt

-in 指定加密的文件,-inkey 指定公鑰,-pubin表明是用純公鑰文件加密,-out為加密后的密文文件

解密文件:

openssl rsautl -decrypt -in test_encrypt -inkey private.key -out test_decrypt

-in指定加密后的密文文件,-inkey指定公鑰對應的私鑰,-out為解密后的文件.

然后你就可以直接diff一把原文件和test_decrypt,看看是不是一樣了

不過玩過OpenSSL的兄弟一定知道,OpenSSL生成的公鑰跟OpenSSH的公鑰雖然來自同一個私鑰,不過格式卻完全不一樣

這就是很多兄弟遭遇悲劇的所在,因為OpenSSH的公鑰借助ssh的互信可以在authorized_key中非常容易就得到

不過這個openssh的公鑰格式不一樣,沒法用openssl加密

openssl的公鑰例子:

—–BEGIN PUBLIC KEY—–

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7vbqajDw4o6gJy8UtmIbkcpnk

O3Kwc4qsEnSZp/TR+fQi62F79RHWmwKOtFmwteURgLbj7D/WGuNLGOfa/2vse3G2

eHnHl5CB8ruRX9fBl/KgwCVr2JaEuUm66bBQeP5XeBotdR4cvX38uPYivCDdPjJ1

QWPdspTBKcxeFbccDwIDAQAB

—–END PUBLIC KEY—–

openssh的公鑰例子:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC7vbqajDw4o6gJy8UtmIbkcpnkO3Kwc4qsEnSZp/TR+fQi62F79RHWmwKOtFmwteURgLbj7D/WGuNLGOfa/2vse3G2eHnHl5CB8ruRX9fBl/KgwCVr2JaEuUm66bBQeP5XeBotdR4cvX38uPYivCDdPjJ1QWPdspTBKcxeFbccDw==

不過還好這個早就不是什么新問題了,如果是OpenSSH v.5.6或者以上版本,可以用下面的命令生成(這個沒驗證過,確實找不到這么高版本的環境)

ssh-keygen -f key.pub -e -m pem

不過你的OpenSSH還沒這么高版本,也不想費勁去升級依賴的一堆庫文件,也有用代碼實現的方式

附上python實現代碼:

#!/usr/bin/env python

# with help and inspiration from

# * ASN1_generate_nconf(3) (specifically the SubjectPublicKeyInfo structure)

# * http://www.sysmic.org/dotclear/index.php?post/2010/03/24/Convert-keys-betweens-GnuPG%2C-OpenSsh-and-OpenSSL

# * http://blog.oddbit.com/2011/05/converting-openssh-public-keys.html

import sys

import base64

import struct

from pyasn1.type import univ

from pyasn1.codec.der import encoder as der_encoder, decoder as der_decoder

if len(sys.argv) != 2:

sys.stderr.write(“Usage: %s \n” % sys.argv[0])

sys.exit(1)

keyfields = open(sys.argv[1]).read().split(None)

if len(keyfields) I’, keydata[:4])[0]

# read in bytes

data, keydata = keydata[4:dlen+4], keydata[4+dlen:]

parts.append(data)

e_val = eval(‘0x’ + ”.join([‘%02X’ % struct.unpack(‘B’, x)[0] for x in parts[1]]))

n_val = eval(‘0x’ + ”.join([‘%02X’ % struct.unpack(‘B’, x)[0] for x in parts[2]]))

bitstring = univ.Sequence()

bitstring.setComponentByPosition(0, univ.Integer(n_val))

bitstring.setComponentByPosition(1, univ.Integer(e_val))

bitstring = der_encoder.encode(bitstring)

bitstring = ”.join([(‘00000000’+bin(ord(x))[2:])[-8:] for x in list(bitstring)])

bitstring = univ.BitString(“‘%s’B” % bitstring)

pubkeyid = univ.Sequence()

pubkeyid.setComponentByPosition(0, univ.ObjectIdentifier(‘1.2.840.113549.1.1.1’)) # == OID for rsaEncryption

pubkeyid.setComponentByPosition(1, univ.Null(”))

pubkey_seq = univ.Sequence()

pubkey_seq.setComponentByPosition(0, pubkeyid)

pubkey_seq.setComponentByPosition(1, bitstring)

print “—–BEGIN PUBLIC KEY—–”

if keycomment:

print “X-Comment: ” + keycomment

print

base64.MAXBINSIZE = (64//4)*3 # this actually doesn’t matter, but it helped with comparing to openssl’s output

print base64.encodestring(der_encoder.encode(pubkey_seq)),

print ‘—–END PUBLIC KEY—–‘

http://stackoverflow.com/questions/1011572/convert-pem-key-to-ssh-rsa-format

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/392211.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392211.shtml
英文地址,請注明出處:http://en.pswp.cn/news/392211.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

模擬操作系統(Java)

gitee完整代碼下載 github完整代碼下載 一、 需求分析 模擬一個采用多道程序設計方法的單用戶操作系統,該操作系統包括進程管理、存儲管理、設備管理、文件管理和用戶接口四部分。預計程序所能達到的功能: 進程管理模擬:實現操作系統進程管…

數據庫面試復習_數據科學面試復習

數據庫面試復習大面試前先刷新 (REFRESH BEFORE THE BIG INTERVIEW) 介紹 (Introduction) I crafted this study guide from multiple sources to make it as comprehensive as possible. This guide helped me prepare for both the technical and behavioral aspects of the …

hibernate緩存

(轉自:http://www.cnblogs.com/java-class/p/6108175.html) 閱讀目錄 1. 為什么要用 Hibernate 緩存?2. 項目實戰3. Hibernate 緩存原理回到頂部1. 為什么要用 Hibernate 緩存? Hibernate是一個持久層框架,…

oracle 連接greenplum,Oracle通過DBLINK訪問GreenPlum

為多個數據庫之間的整合和遷移做POC,嘗試使用Oracle Gateway和Heterogeneous Service來中轉訪問,測試過好多次,最終發現只有在32位的Oracle當中才能成功配置。 配置環境如下: Windows 2003 32bit 或 Windows 2008 64bit Oracle10G…

如何使用React和Redux前端創建Rails項目

by Mark Hopson馬克霍普森(Mark Hopson) 如何使用React和Redux前端(加上Typescript!)創建Rails項目 (How to create a Rails project with a React and Redux front-end (plus Typescript!)) 在Rails項目中使用React和Redux設置單頁Javascript App的完整指南。 (A …

分布與并行計算—用任務管理器畫CPU正弦曲線(Java)

class drawSin implements Runnable{Overridepublic void run() {final double SPLIT 0.01;// 角度的分割final int COUNT (int) (2 / SPLIT);// 2PI分割的次數,也就是2/0.01個,正好是一周final double PI Math.PI;final int interval 100;// 時間間…

Rails文件上傳file_field報錯Encoding::UndefinedConversionError

服務器用的是ubuntu12 64bit,環境是ruby1.9.3rails3mysql,測試是在windows2003上。 上傳一個【.gitconfig】文件,沒有問題,上傳【新浪微博數據挖掘.pdf】報錯,上傳【back.jpg】報錯。 下面是兩段信息,是從【…

好久不來這里寫東西了.

我正準備離開學校去實現自己的目標,很清楚自己在學校的... ...做共享程序員,就不得不考慮些商業上的東西,自己要吃飯啊!我想我是該好好的處理一下這二者的關系. 轉載于:https://www.cnblogs.com/wangxiang/archive/2007/01/01/609714.html

Asp.net mvc中使用配置Unity

第一步:添加unity.mvc 第二步:在添加之后會在app_start中生成UnityConfig.cs,UnityMvcActivator.cs 第三步:使用 第四步:效果展示 轉載于:https://www.cnblogs.com/WJ--NET/p/7117839.html

頂級數據恢復_頂級R數據科學圖書館

頂級數據恢復Data science is the discipline of making data useful數據科學是使數據有用的學科 When we talk about the top programming language for Data Science, we often find Python to be the best fit for the topic. Sure, Python is undoubtedly an excellent cho…

xp系統oracle數據庫,Oracle10g 數據庫的安裝基于windowsXP

Oracle的安裝一、首先去官網下載自身系統相對應的數據庫軟件http://www.oracle.com/cn/index.htmlOracle軟件本身是免費的,個人用途完全沒關系,商業用途并被發現才會被Oracle所要求收費,收費買的不是軟件,而是授權。何謂授權&…

了解React Native中的不同JavaScript環境

by Khoa Pham通過Khoa Pham 了解React Native中的不同JavaScript環境 (Get to know different JavaScript environments in React Native) React Native can be very easy to get started with, and then at some point problems occur and we need to dive deep into it.Reac…

分布與并行計算—生命游戲(Java)

生命游戲其實是一個零玩家游戲,它包括一個二維矩形世界,這個世界中的每個方格居住著一個活著的或死了的細胞。一個細胞在下一個時刻生死取決于相鄰八個方格中活著的或死了的細胞的數量。如果相鄰方格活著的細胞數量過多,這個細胞會因為資源匱…

正確認識 Vista 激活期限

當我們在安裝 Vista 時,可以不輸入序列號進行安裝,這和以往的操作系統安裝有所不同,我們不必再為安裝系統時找不到我們的序列號標簽而發愁。如果不輸入序列號而繼續安裝系統,那么系統將提示我們有30天的激活期限!這里的…

Oracle使用hs odbc連接mssql2008

1.創建odbc 2.在 product\11.2.0\dbhome_1\hs\admin\ 下拷貝initdg4odbc,把名字改為initcrmsql(init所建odbc的名稱) HS_FDS_CONNECT_INFO crmsql #odbc名稱 HS_FDS_TRACE_LEVEL 0 HS_FDS_RECOVERY_ACCOUNTsa #要連接的數據庫名稱 HS_FDS_RECOVERY_PWD…

oracle修改物化視圖字段,獲取物化視圖字段的修改矢量(一)

當表建立了物化視圖日志之后,表的DML修改會被記錄到物化視圖日志中,而物化視圖日志則包含了一個修改矢量,來記錄哪個列被修改。在文章列的修改矢量可以通過2的N次方來獲得,也就是POWER(2, N)。而N的值,就是列的位置。但…

聚合 數據處理_R中聚合的簡介:強大的數據處理工具

聚合 數據處理by Satyam Singh Chauhan薩蒂揚辛格喬漢(Satyam Singh Chauhan) R中聚合的簡介:強大的數據處理工具 (An introduction to aggregates in R: a powerful tool for playing with data) Data Visualization is not just about colors and graphs. It’s …

大數據 notebook_Dockerless Notebook:數據科學期待已久的未來

大數據 notebookData science is hard. Data scientists spend hours figuring out how to install that Python package on their laptops. Data scientists read many pages of Google search results to connect to that database. Data scientists write a detailed docume…

【NGN學習筆記】6 代理(Proxy)和背靠背用戶代理(B2BUA)

1. 什么是Proxy模式? 按照RFC3261中的定義,Proxy服務器是一個中間的實體,它本身即作為客戶端也作為服務端,為其他客戶端提供請求的轉發服務。一個Proxy服務器首先提供的是路由服務,也就是說保證請求被發到更加”靠近”…

分布與并行計算—并行計算π(Java)

并行計算π public class pithread extends Thread {private static long mini1000000000;private long start,diff;double sum0;double cur1/(double)mini;public pithread(long start,long diff) {this.startstart;this.diffdiff;}Overridepublic void run() {long istart;f…