Форматирование строк и преобразование между представлениямиPython

Программы на Python
Ответить
Anonymous
 Форматирование строк и преобразование между представлениями

Сообщение Anonymous »

Я работаю над библиотекой, в которой сериализую данные. Проблема в том, что когда я пытался визуализировать сериализацию, я получал разные результаты, если бы у меня не было форматирования сериализации.

Код: Выделить всё

# ansi colour codes
g='\033[0;32m'
lp='\033[1;35m'
lc='\033[1;36m'
y='\033[1;33m'
r='\033[0m'
bb='\033[1;94m'
gr='\033[1;90m'
bc='\033[1;96m'
re='\033[1;31m'
rb='\033[1;91m'
w='\033[1;97m'

class Signature:
def __init__(self, r_x, value):
self.r_x = r_x
self.value = value

def der(self, display=False):
if not display:
rxbin = self.r_x.to_bytes(32, 'big')
# removing all null bytes
rxbin = rxbin.lstrip(b"\x00")
# if rxbin has high bit add \x00
if rxbin[0] & 0x80:
rxbin = b'\x00' + rxbin
result = bytes([2, len(rxbin)]) + rxbin
sigbin = self.value.to_bytes(32, 'big')
sigbin = sigbin.lstrip(b"\x00")
if sigbin[0] & 0x80:
sigbin = b'\x00' + sigbin
result += bytes([2, len(sigbin)]) + sigbin
return bytes([0x30, len(result)]) + result
else:
rxbin = self.r_x.to_bytes(32, 'big')
# removing all null bytes
rxbin = rxbin.lstrip(b"\x00")
# if rxbin has high bit add \x00
if rxbin[0] & 0x80:
rxbin = b'\x00' + rxbin

r_x_value = lp + f"{hex(int.from_bytes(rxbin, 'big'))}".lstrip("0x") + r
r_x_length =  lc  + f"{hex(len(rxbin))}".lstrip('0x') + r
r_prefxbyte = re + f"02" + r
# b'\x02'
result = bytes([2, len(rxbin)]) + rxbin

sigbin = self.value.to_bytes(32, 'big')
sigbin = sigbin.lstrip(b"\x00")
if sigbin[0] & 0x80:
sigbin = b'\x00' + sigbin
result += bytes([2, len(sigbin)]) + sigbin

sig_value =  y + f"{hex(int.from_bytes(sigbin, 'big'))}".lstrip("0x") + r
sig_length = gr  + f"{hex(len(sigbin))}".lstrip('0x') + r
sig_prefxbyte =  bb + "02" + r

prefix = g + f"{hex(0x30)}".lstrip("0x") + r + w + f"{hex(len(result))}".lstrip("0x") + r

print()
print("Distinguished encoding representation for signatures in hex base. der signature serialization:")
print()
print(prefix + r_prefxbyte +r_x_length + r_x_value  + sig_prefxbyte + sig_length+ sig_value )
print()
print("key:")
print(g + "Signature prefix "+ r )
print(w+ "Length of complete signature" + r)
print(y + "signature value " + r )
print(gr + "signature length " + r )
print(bb + "signature prefix " + r )

print(lc + "r_x length " + r )
print(lp + "r_x value " + r )
print(re + "r_x prefix " + r )
print()
, где я добавил метод if-else в .der () , чтобы помочь с визуализацией сериализации.
Использование заданных значений отсюда, то есть < /p>

Код: Выделить всё

r = 0x37206a0610995c58074999cb9767b87af4c4978db68c06e8e6e81d282047a7c6
s = 0x8ca63759c1157ebeaec0d03cecca119fc9a75bf8e6d0fa65c841c8e2738cdaec
Я даю правильную сериализацию при использовании исходного метода .der () (без отображения )

Код: Выделить всё

3045022037206a0610995c58074999cb9767b87af4c4978db68c06e8e6e81d282047a7c60221008ca63759c1157ebeaec0d03cecca119fc9a75bf8e6d0fa65c841c8e2738cdaec
< /code>
Но моя цветная версия немного отличается: < /p>
3045022037206a0610995c58074999cb9767b87af4c4978db68c06e8e6e81d282047a7c602218ca63759c1157ebeaec0d03cecca119fc9a75bf8e6d0fa65c841c8e2738cdaec
< /code>
, где все отличается от 00 < /code> между длиной значения подписи и фактическим значением подписи.
i.e
Правильная сериализация:
3045022037206A0610995C58074999CB9767B87AF4C4978DB68C06E8E6E81D282047A7C60221  00 < /strong> 8CA63759C11577EBEAC0D03CAC115B115B115BEAC0D03C115B115.  F8E6D0FA65C841C8E2738CDAEC < /p>
Цветная сериализация с отсутствующей 00 < /code>:
3045022037206A0610995C58074999CB9767B87AF4C4978DB6806E8978787878787AF4C4978DB6806E897878787AF87F4978DB6806E81878787F87AF4C4978DB6806E87878787AF4C4978DB6806E878787F87AF4C4978DB6806E878787F87AF4C4978DB6806E878787AF4C4978DB6807 2218CA63759C1157EBEAEC0D03CECCA119FC9A75BF8E6D0FA65C841C8E2738CDAEC
Кто -нибудь может видеть, что я делаю не так? Я проверил и дважды проверил реализацию и не могу понять, почему моя цветная печатная версия будет отличаться от версии, созданной оригинальным методом .der () 
.
Вот Скриншот цели этой опции отображения


Подробнее здесь: https://stackoverflow.com/questions/793 ... sentations
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»