Я пытаюсь создать unit тест для проверки следующей функции:
def decrypt_keys(self, enc_password):
with open ('id_rsa','r') as privkeyfile:
pem_key = privkeyfile.read()
print(pem_key)
priv = rsa.PrivateKey.load_pkcs1(pem_key)
return rsa.decrypt(base64.b64decode(bytes(enc_password, 'utf-8')),priv).decode('utf-8')
Тем не менее, unit тест не проходит со следующей ошибкой:
ValueError: No PEM start marker "b'-----BEGIN RSA PRIVATE KEY-----'" found
----------------------------------------------------------------------
Ran 1 test in 0.012s
FAILED (errors=1)
b'-----BEGIN RSA PRIVATE KEY-----
... rest of private key here ...
-----END RSA PRIVATE KEY-----'
Сразу после этого, как видно, содержимое файла печатается так, как ожидается библиотекой. Как я могу убедиться, что файл полностью прочитан до того, как функция попытается загрузить его как ключ rsa?
Похоже, ваш файл содержит двоичные кавычки Python, которые нарушают код чтения RSA, поскольку он не знает, как интерпретировать b'...'
вокруг вашего закрытого ключа.
Я предлагаю открыть файл закрытого ключа в текстовом редакторе и удалить эти отметки. Возможно, вы также захотите выяснить, откуда был записан файл, и исправить его, если это какая-то другая часть вашего кода. Вы, наверное, называя str
на bytes
объекта, когда вы должны быть вызовом decode
метод (например, binary_key_text.decode()
). Или, в качестве альтернативы, вы можете открыть файл в двоичном режиме ('wb'
), когда вы пишете его, а затем написать объект bytes
напрямую.
Возможно, вы могли бы решить эту проблему в своем чтении кода Python (с помощью чего-то вроде pem_key = pem_key[2:-1]
, обрезав первые два символа и последний). Но если вы добавите это в свой код, то он будет работать только для неправильно написанных файлов, а не для обычных. Вот как ошибки закрепляются в программном обеспечении, поэтому они не могут быть исправлены в будущем! (Полагаю, вы могли бы защитить операцию нарезки с помощью if pem_key.startswith("b'") and pem_key.endswith("'")
, но я бы побеспокоился, если бы код ошибки записи файлов был опубликован широко, и вы действительно нужно гарантировать обратную совместимость.)
b'
в начале строки, так что, возможно, вы неправильно написали файл ключа из какого-то другого кода?