如何把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
相關文章
- openssh key格式轉換
- openSSL生成公鑰和私鑰
- 如何把PDF轉換成EXCELExcel
- php使用openssl生成公鑰私鑰PHP
- 格式轉換分享:怎麼把mp4轉換成mp3?
- 使用openssl生成rsa公鑰和私鑰
- OpenSSL 公鑰私鑰加解密封裝解密封裝
- 如何把騰訊影片的qlv格式的影片轉換成mp4格式
- ofd檔案如何轉換成pdf格式 電腦上ofd檔案如何轉換成pdf格式
- C# Rsa加密(私鑰加密、公鑰解密、金鑰格式轉換、支援超大長度分段加密)C#加密解密
- 如何將檔案PDF格式轉換成Word格式
- 如何用Python把pdf轉換成wordPython
- Mac 使用openssl生成RSA公鑰和私鑰Mac
- csv格式怎麼轉換成excel?csv格式轉換成excel格式檔案的方法Excel
- C#和JAVA的RSA金鑰、公鑰轉換C#Java
- 如何將heic格式轉換成jpg圖片?
- ofd檔案如何轉換成pdf格式 電腦ofd檔案如何免費轉換為pdf格式
- win10系統把cdr格式轉換成psd檔案的方法Win10
- 把圖片轉換成CAD圖紙該如何操作?
- 如何把電腦裡的圖片轉換成Word
- 圖片格式轉換,JPG圖片轉換成PDF
- win10 pdf怎麼轉換成word_win10如何把pdf轉換成word文件Win10
- 用OpenSSL把二進位制的Cer證書轉換程Base64格式的PEM格式的證書
- win10 怎麼把mp3改成wav_win10如何把mp3/mp4格式轉換成wav格式Win10
- 如何把HTTP轉成HTTPS?HTTP
- 如何把多張jpg轉換成一個pdf檔案?
- Win10系怎麼將HEIC轉換成JPG格式_win10怎樣把heic照片格式變成jpgWin10
- openSSH升級公鑰失效Permission denied (publickey)解決方案
- js把時間戳轉換成時間格式yyyy-MM-dd HH:mm:ssJS時間戳
- Keras 轉換成 Tensorflow 模型格式並使用Keras模型
- 圖片格式怎麼轉換,如何轉換jpg
- 把 .xyz 檔案轉換成 .ply 檔案
- JZ-049-把字串轉換成整數字串
- 怎麼把圖片文字轉換成word?
- png圖片怎麼轉換成jpg 電腦上怎麼把png格式改成jpg
- 把JSON資料格式轉換為Python的類物件JSONPython物件
- ppt轉換word文件怎麼操作 把ppt轉換成word純文字
- m4v如何轉換成mp4?影片格式轉換的實用方法操作
- 如何把電子書轉成EPUB?