日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php 公钥格式转换,如何把OpenSSH公钥转换成OpenSSL格式

發布時間:2023/12/9 php 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的php 公钥格式转换,如何把OpenSSH公钥转换成OpenSSL格式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。