Как прочитать id_rsa.pub в ruby ​​Bignum?

Я пытаюсь прочитать некоторые файлы с открытым ключом, созданные с помощью:

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

person mjwhitta    schedule 23.12.2013    source источник
comment
Основываясь на предоставленном вами коде, позвольте мне задать вам вопрос: разве это не библиотека openssl, которую вы пытаетесь реализовать на простом ruby?   -  person phil pirozhkov    schedule 24.12.2013
comment
Может быть, я новичок в рубине и хотел попробовать сам. Теперь, когда я знаю как, я могу просто использовать библиотеку. Возможно, это будет более эффективно, чем мой способ. Спасибо что подметил это!   -  person mjwhitta    schedule 25.12.2013


Ответы (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/

person Charlie    schedule 23.12.2013