Код: Выделить всё
# 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()
Использование заданных значений отсюда, то есть < /p>
Код: Выделить всё
r = 0x37206a0610995c58074999cb9767b87af4c4978db68c06e8e6e81d282047a7c6
s = 0x8ca63759c1157ebeaec0d03cecca119fc9a75bf8e6d0fa65c841c8e2738cdaec
Код: Выделить всё
3045022037206a0610995c58074999cb9767b87af4c4978db68c06e8e6e81d282047a7c60221008ca63759c1157ebeaec0d03cecca119fc9a75bf8e6d0fa65c841c8e2738cdaec
Код: Выделить всё
3045022037206a0610995c58074999cb9767b87af4c4978db68c06e8e6e81d282047a7c602218ca63759c1157ebeaec0d03cecca119fc9a75bf8e6d0fa65c841c8e2738cdaec
< /code>
, где все отличается от 00 < /code> между длиной значения подписи и фактическим значением подписи.
i.e
Правильная сериализация:
3045022037206A0610995C58074999CB9767B87AF4C4978DB68C06E8E6E81D282047A7C60221 00 < /strong> 8CA63759C11577EBEAC0D03CAC115B115B115BEAC0D03C115B115. F8E6D0FA65C841C8E2738CDAEC < /p>
Цветная сериализация с отсутствующей 00 < /code>:
3045022037206A0610995C58074999CB9767B87AF4C4978DB6806E8978787878787AF4C4978DB6806E897878787AF87F4978DB6806E81878787F87AF4C4978DB6806E87878787AF4C4978DB6806E878787F87AF4C4978DB6806E878787F87AF4C4978DB6806E878787AF4C4978DB6807 2218CA63759C1157EBEAEC0D03CECCA119FC9A75BF8E6D0FA65C841C8E2738CDAEC
Кто -нибудь может видеть, что я делаю не так? Я проверил и дважды проверил реализацию и не могу понять, почему моя цветная печатная версия будет отличаться от версии, созданной оригинальным методом .der () Вот Скриншот цели этой опции отображения
Подробнее здесь: https://stackoverflow.com/questions/793 ... sentations
Мобильная версия