Я пытаюсь прочитать некоторые файлы с открытым ключом, созданные с помощью:
for i in $(seq 1 100); do
ssh-keygen -t rsa -f keys/$i -q -N ""
done
Я использую рубин, и мой код ниже. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу быть уверен, что делаю это правильно. Я думал, что открытый ключ представляет собой большое число, полученное путем умножения двух больших простых чисел. Я получаю числа, которые делятся на 3, 15, 33 и/или некоторые другие числа. Все они кратны простым числам, но я ожидал только 2 простых числа, а не 3 или 4. Возможно, я неправильно использую ruby или неправильно понимаю формат открытого ключа. Любая помощь будет принята с благодарностью.
#!/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