Как дополнить содержимое файла pem base64 в конце? - PullRequest
0 голосов
/ 03 мая 2018

Я должен прочитать закрытый ключ RSA в python и получить исключение «Неверное заполнение» для закрытого ключа pem, которое должно быть допустимым.

rsa_p_file = open(rsa_p_filename, "r")
content = rsa_p_file.read()
rsa_p = RSA.importKey(content)

Теперь, чтобы найти проблему, я экспериментировал с другим файлом pem, для которого он работает. Этот файл pem заканчивается на

8YPmbfUbUcCj6CQfIcSZcg==
-----END PRIVATE KEY-----

Насколько мне известно, = в конце являются байтами заполнения, чтобы сделать общую длину base64 кратной 4. В этом случае общая длина равна 1624, так что все в порядке.

Однако, когда я удаляю последнюю букву "g" и заменяю ее на "="

8YPmbfUbUcCj6CQfIcSZc===
-----END PRIVATE KEY-----

Это дает исключение:

Error: Incorrect padding
Traceback:
Traceback (most recent call last):
  File "app.py", line 204, in t1_process
    meters = extract.parseShipmentFile(ifile, pkpath, serials)
  File "D:\Siemens\Projects\DLMS_becom\code\python\shipment\extract.py", line 146, in parseShipmentFile
    rsa_p = RSA.importKey(content)
  File "C:\Users\atw11a92\AppData\Local\Programs\Python\Python36\lib\site-packages\Crypto\PublicKey\RSA.py", line 736, in import_key
    (der, marker, enc_flag) = PEM.decode(tostr(extern_key), passphrase)
  File "C:\Users\atw11a92\AppData\Local\Programs\Python\Python36\lib\site-packages\Crypto\IO\PEM.py", line 168, in decode
    data = a2b_base64(b(''.join(lines[1:-1])))
binascii.Error: Incorrect padding

Почему заполнение все еще некорректно, потому что общая длина% 4 снова равна 0?

1 Ответ

0 голосов
/ 05 мая 2018

Вам повезло, вы можете получить доступ к источнику a2b_base64 в git: https://github.com/python/cpython/blob/master/Lib/base64.py

И вы можете видеть, что ошибка «Неверное заполнение» поднимается с 2 пунктов:

s = _bytes_from_decode_data(s)
if len(s) % 8:
    raise binascii.Error('Incorrect padding')

Здесь проверяется, является ли размер вашей строки кратным 8, а не 4.

У вас есть также другие проверки символов заполнения:

l = len(s)
s = s.rstrip(b'=')
padchars = l - len(s)
(...)

if padchars:
    acc <<= 5 * padchars
    last = acc.to_bytes(5, 'big')
    if padchars == 1:
        decoded[-5:] = last[:-1]
    elif padchars == 3:
        decoded[-5:] = last[:-2]
    elif padchars == 4:
        decoded[-5:] = last[:-3]
    elif padchars == 6:
        decoded[-5:] = last[:-4]
    else:
        raise binascii.Error('Incorrect padding')
return bytes(decoded)

Но эта другая часть потребует небольшого изучения, чтобы лучше понять ее поведение.

Надеюсь, это поможет!

...