2016-01-31 10 views
0

я использовал модуль PyCrypto для создания/закрытой пары открытого RSA ключа и пытаюсь импортировать ключи, отправив открытый ключ в качестве аргумента командной строки:Как импортировать ключи RSA по аргументу командной строки?

from Crypto.PublicKey import RSA 
from Crypto import Random 
import sys 

input_key = sys.argv[1] 
print('\n') 
print(type(input_key)) 
print('\n') 
print(input_key) 
print('\n') 

public_key = RSA.importKey(input_key) 
print(type(public_key)) 

но я получаю результат:

$ python3 encrypt.py '-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCaIRYO3hxr0ObcYcgKtxFequ6p\n9HVV8E95ghUUHmydVJYy16Ip9F6ik7G8wBU7X3VIfjdxHAtrwY9doCy8Ype6NNio\nS/ErGRtUQ1jgyT2f9okIdroEipnh1zwbXQcxveaxlwBhp7OFGZ/0W3FKgJLYtyzW\nEhfPO+8GkT0eLH5FaQIDAQAB\n-----END' 
    >>> <class 'str'> 

-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCaIRYO3hxr0ObcYcgKtxFequ6p\n9HVV8E95ghUUHmydVJYy16Ip9F6ik7G8wBU7X3VIfjdxHAtrwY9doCy8Ype6NNio\nS/ErGRtUQ1jgyT2f9okIdroEipnh1zwbXQcxveaxlwBhp7OFGZ/0W3FKgJLYtyzW\nEhfPO+8GkT0eLH5FaQIDAQAB\n-----END PUBLIC KEY----- 

    Traceback (most recent call last): 
File "encrypt.py", line 13, in <module> 
    public_key = RSA.importKey(input_key) 
File "/usr/lib/python3/dist-packages/Crypto/PublicKey/RSA.py", line 638, in importKey 
if lines[1].startswith(b('Proc-Type:4,ENCRYPTED')): 
    IndexError: list index out of range 

Но когда я копировать вставить один и тот же ключ в Python интерпретатора, я получаю это:

>>> input_key = '-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCaIRYO3hxr0ObcYcgKtxFequ6p\n9HVV8E95ghUUHmydVJYy16Ip9F6ik7G8wBU7X3VIfjdxHAtrwY9doCy8Ype6NNio\nS/ErGRtUQ1jgyT2f9okIdroEipnh1zwbXQcxveaxlwBhp7OFGZ/0W3FKgJLYtyzW\nEhfPO+8GkT0eLH5FaQIDAQAB\n-----END PUBLIC KEY-----' 
>>> pub_key = RSA.importKey(input_key) 
>>> type(pub_key) 
    <class 'Crypto.PublicKey.RSA._RSAobj'> 

Как импортировать их в качестве аргумента командной строки?

+0

Вы передаете ключ wohle в качестве аргумента командной строки? Вероятно, вы потеряете символы новой строки из кодированного ключа, так как ваш первый аргумент состоит только из одной строки. Как именно вы называете свою программу? – mata

+0

вся клавиша ввода права, я попытался ввести и распечатать ключ .. он работает абсолютно нормально .. –

ответ

1

При выполнении

 
$ python3 encrypt.py '-----BEGIN PUBLIC KEY-----\nMIG...' 

оболочка не интерпретирует \n, как новая строка убегает, но буквальным обратный слэш + п, и это то, что ваша программа видит в sys.argv[1].

Вы можете иметь новые строки в пределах собственной сбежавшей строки оболочки, так что это должно работать:

 
$ python3 encrypt.py '-----BEGIN PUBLIC KEY----- 
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCaIRYO3hxr0ObcYcgKtxFequ6p 
9HVV8E95ghUUHmydVJYy16Ip9F6ik7G8wBU7X3VIfjdxHAtrwY9doCy8Ype6NNio 
S/ErGRtUQ1jgyT2f9okIdroEipnh1zwbXQcxveaxlwBhp7OFGZ/0W3FKgJLYtyzW 
EhfPO+8GkT0eLH5FaQIDAQAB 
-----END PUBLIC KEY-----' 

Если вы действительно хотите использовать строку с побегами, вы можете обрабатывать побеги самостоятельно в вашей программе, делая input_key = sys.argv[1].replace('\\n', '\n') , или пусть оболочка выполняет экранирование, например, передавая строку через эхо: $ python3 encrypt.py "$(echo -ne '-----BEGIN PUBLIC KEY-----\nMIG...')".

+0

как это сделать? я попробовал ** Shift + Enter ** в месте ** \ n **, но он не работает. –

+0

Вам не нужно делать что-либо особенное, когда вы нажимаете клавишу ввода, в то время как в листе непрерывной строки вы должны иметь возможность возобновить работу на следующей строке. – mata

+0

Спасибо, что это работает :) –

 Смежные вопросы

  • Нет связанных вопросов^_^