我正在尝试阅读使用以下内容生成的一些公钥文件:
for i in $(seq 1 100); do
ssh-keygen -t rsa -f keys/$i -q -N ""
done
我正在使用ruby,我的代码如下。我遇到的问题是我 不能确定我做得对。我以为是公钥 是一个由2个大素数乘以产生的大数。我 获取可被3,15,33和/或其他部分整除的数字 数字。这些都是素数的倍数,但我期待 只有2个素数,而不是3或4.可能是我使用红宝石 错误或我误解了公钥的格式。 任何帮助将不胜感激。
#!/usr/bin/env ruby
pubhash = Hash.new
# Read in public key files
pubfiles = File.join("**", "*.pub")
Dir.glob(pubfiles) do |filename|
File.open(filename) do |file|
file.each do |line|
base64 = line.chomp.split[1]
bytes = base64.unpack("m").first.unpack("C*").reverse
key = bytes.each_with_index.inject(0) do
|sum, (byte, index)|
sum + byte * (256 ** index)
end
pubhash[filename] = key
end
file.close
end
end
File.open(filename) do |file|
file.each do |line|
base64 = line.chomp.split[1]
keydata = base64.unpack("m").first
parts = Array.new
while (keydata.length > 0)
dlen = keydata[0, 4].bytes.inject(0) do |a, b|
(a << 8) + b
end
data = keydata[4, dlen]
keydata = keydata[(dlen + 4)..-1]
parts.push(data)
end
@type = parts[0]
@e = parts[1].bytes.inject do |a, b|
(a << 8) + b
end
@n = parts[2].bytes.inject do |a, b|
(a << 8) + b
end
end
file.close
end
答案 0 :(得分:1)
您找到此数字的其他除数的原因可能是因为base64块包含的不仅仅是密钥。
例如,我使用ssh-keygen -t rsa -b 768 -C so-is-cool
生成密钥对,并将其作为我的.pub:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAYQDK92Q/FMsaOuBE9NL7OufMYWVPWj62F6QXl4ADcYgFMrGMJRF1njg5UGujgqaIrouGjoqudt23fykUNG7HRZV4M4Plxknj4TSvFIG5hi+6x/AQzzPP7xnLkYBKDOxSs+M= so-is-cool
启动IRB:
base64='AAAAB3NzaC1yc2EAAAADAQABAAAAYQDK92Q/FMsaOuBE9NL7OufMYWVPWj62F6QXl4ADcYgFMrGMJRF1njg5UGujgqaIrouGjoqudt23fykUNG7HRZV4M4Plxknj4TSvFIG5hi+6x/AQzzPP7xnLkYBKDOxSs+M='
base64.unpack('m').first
你会看到它的第一个字节是:
\x00\x00\x00\assh-rsa\x00\x00\x00\
或换句话说我的密钥算法。您可能需要将此值更多地解析为实际值。我发现这个博客讨论了OpenSSH .pub文件的格式:http://blog.oddbit.com/2011/05/08/converting-openssh-public-keys/