BG Development


  Reply to this topicStart new topicStart Poll

> Python3 pycryptodome
dedal
Публикувано на: 28-12-2022, 14:52
Quote Post



Име: Григор Колев
Група: Потребител
Ранг: Активен

Мнения: 200
Регистриран на: 17.11.10



Пренаписвам код от python2 на python3
Стана по лесно отколкото очаквах.
Тук там поправка в wxpython, малко играчка с импортите в пакетите които трябва да станат от import module на from . import module
Лека заигравка с raise MyClassException, msg и то си тръгна.
Oгромна час от промените станаха с find and replace на PyCharm.

Обаче смяната на pycrypto с pycryptodome ме изтормози в часта RSA.verify

Как работи: има msg в json.
msg се подписва с RSA после се криптира с друг алгоритъм и се праща през сокет към сървъра.
Сървъра декриптира и ако е успешно проверява подписа, ако и подписа е ОК отваря json.

И двата кода трябва да могат да си говорят за да не премахвам старата версия, има прекалено много устройства и ще я извадя от употреба когато ги бракувам.
Обаче бъркам някъде в типовете данни при верификация на подписа, нямам идея къде.

когато подам към стария код чете и валидира подписа успешно
CODE
bytes.hex(self.signer.sign(digest))


Когато получавам се троши при verify
CODE
self.signer.verify(digest, signature) # връща False
bytes.hex(self.signer.sign(digest)) == signature # Връща True

От стария код подавам hex 100%

Какво аджаба не и е наред на функцията verify в pycryptodome

Това мнение е било редактирано от dedal на 28-12-2022, 14:53
PMEmail Poster
Top
ici
Публикувано на: 28-12-2022, 15:27
Quote Post


Group Icon
Име: Ивайло Илчев
Група: VIP
Ранг: Почетен член

Мнения: 18218
Регистриран на: 06.06.04



Грам идея нямам от пъцрипто, ама опитай с низовете да използваш encode/decode. Те вече са утф както надявам се знаеш.

Това мнение е било редактирано от ici на 28-12-2022, 15:27


--------------------
Ние не сме в една лодка, ние сме в една буря. Лодките са различни.

Следващият път когато се почувстваш ненужен, грозен и недооценен, помни че освен това си и тъп.
PMEmail PosterUsers Website
Top
dedal
Публикувано на: 28-12-2022, 16:05
Quote Post



Име: Григор Колев
Група: Потребител
Ранг: Активен

Мнения: 200
Регистриран на: 17.11.10



QUOTE (ici @ 28-12-2022, 15:27)
Грам идея нямам от пъцрипто, ама опитай с низовете да използваш encode/decode. Те вече са утф както надявам се знаеш.

Опитах encode е ОК обаче decode са го махнали гадовете от python3

Тука не е проблема в encode/decode а в какъв формат идва през сокета нещо което се подава в hex и как да го обърна в тип който да е същия като digest за да мине през verify.

Щом bytes.hex(self.signer.sign(digest)) == signature то значи при verify или digest или signature е в грешен тип.
Вероятно digest е различен, обаче как да сменя типа без да строша подписа

Това мнение е било редактирано от dedal на 28-12-2022, 16:11
PMEmail Poster
Top
dedal
Публикувано на: 28-12-2022, 16:37
Quote Post



Име: Григор Колев
Група: Потребител
Ранг: Активен

Мнения: 200
Регистриран на: 17.11.10



Да погледнах.
digest е Cryptodome.Hash.SHA256.SHA256Hash докато signature е hex
Как да обърна сигнатурата за да сработи правилно или да обърна digest за да работи verify

Не че с == не работи, но игнорира time expire и никак не искам да я пренаписвам

Това мнение е било редактирано от dedal на 28-12-2022, 16:39
PMEmail Poster
Top
wqw
Публикувано на: 01-01-2023, 21:32
Quote Post


Group Icon
Име: Владимир Висулчев
Група: VIP
Ранг: Почетен член

Мнения: 6345
Регистриран на: 10.06.04



QUOTE (dedal @ 28-12-2022, 16:05)
.Щом bytes.hex(self.signer.sign(digest)) == signature то значи при verify или digest или signature е в грешен тип.
Вероятно digest е различен, обаче как да сменя типа без да строша подписа

За verify ти трябва public key. С public key не можеш да sign-ваш така че мещо не е наред щом в случая sign не ти гърми.


--------------------
PMEmail PosterUsers Website
Top
dedal
Публикувано на: 04-01-2023, 13:47
Quote Post



Име: Григор Колев
Група: Потребител
Ранг: Активен

Мнения: 200
Регистриран на: 17.11.10



QUOTE (wqw @ 01-01-2023, 21:32)
QUOTE (dedal @ 28-12-2022, 16:05)
.Щом bytes.hex(self.signer.sign(digest)) == signature то значи при verify или digest или signature е в грешен тип.
Вероятно digest е различен, обаче как да сменя типа без да строша подписа

За verify ти трябва public key. С public key не можеш да sign-ваш така че мещо не е наред щом в случая sign не ти гърми.

Не е ОК типът на подписа.
От едната страна е signature == unicode # True
от другата signature == unicode #False

На python3 signature == Cryptodome.Hash.SHA256.SHA256Hash и нямам грам идея как да обърна unicode което си е прост hex в Cryptodome.Hash.SHA256.SHA256Hash

И нямам public и private. Имам два еднакви private.
Първо комуникацията е двупосочна между два софтуера които са лично мои и аз само имам достъп до компютрите и то по мой протокол.
Това с public и private е за web а това не е web а просто два компа си говорят, идеята на подписа е да не се промени съобщението по пътя
PMEmail Poster
Top
wqw
Публикувано на: 04-01-2023, 14:04
Quote Post


Group Icon
Име: Владимир Висулчев
Група: VIP
Ранг: Почетен член

Мнения: 6345
Регистриран на: 10.06.04



QUOTE (dedal @ 04-01-2023, 13:47)
Това с public и private  е за web а това не е web а просто два компа си говорят, идеята на подписа е да не се промени съобщението по пътя

Подписите не се ползват за това. Ако идеята е "да не се промени съобщението по пътя" тогава ти трябва MAC (Message authentication code) като HMAC и пр.

MAC е като hash, който обаче сe ползва с предварително избран key. Примерно SHA256 ти е unkeyed hash, но ако го ползваш в конструкция като HMAC-SHA256 вече можеш да подадеш key и това може да се ползва за MAC на съобщението.

Идиеята на signature е authenticity т.е. да си сигурен кой ти го праща съобщението и принципно това е по-силно от MAC и съответно "по-скъпо" за реализиране (по-бавно).

Anyway. . .

Имай предвид че self.signer.verify(digest, signature) винаги връща False, а ако има проблем с подписа raise-ва грешка:

QUOTE (https://pycryptodome.readthedocs.io/en/latest/src/signature/dsa.html)
Raises: ValueError – if the signature is not authentic

Примера в документацията е така:

CODE
try:
   verifier.verify(h, signature)
   print "The message is authentic."
except ValueError:
   print "The message is not authentic."

cheers,
</wqw>


--------------------
PMEmail PosterUsers Website
Top
dedal
Публикувано на: 07-01-2023, 12:53
Quote Post



Име: Григор Колев
Група: Потребител
Ранг: Активен

Мнения: 200
Регистриран на: 17.11.10



QUOTE (wqw @ 04-01-2023, 14:04)
QUOTE (dedal @ 04-01-2023, 13:47)
Това с public и private  е за web а това не е web а просто два компа си говорят, идеята на подписа е да не се промени съобщението по пътя

Подписите не се ползват за това. Ако идеята е "да не се промени съобщението по пътя" тогава ти трябва MAC (Message authentication code) като HMAC и пр.

MAC е като hash, който обаче сe ползва с предварително избран key. Примерно SHA256 ти е unkeyed hash, но ако го ползваш в конструкция като HMAC-SHA256 вече можеш да подадеш key и това може да се ползва за MAC на съобщението.

Идиеята на signature е authenticity т.е. да си сигурен кой ти го праща съобщението и принципно това е по-силно от MAC и съответно "по-скъпо" за реализиране (по-бавно).

Anyway. . .

Имай предвид че self.signer.verify(digest, signature) винаги връща False, а ако има проблем с подписа raise-ва грешка:

QUOTE (https://pycryptodome.readthedocs.io/en/latest/src/signature/dsa.html)
Raises: ValueError – if the signature is not authentic

Примера в документацията е така:

CODE
try:
   verifier.verify(h, signature)
   print "The message is authentic."
except ValueError:
   print "The message is not authentic."

cheers,
</wqw>

Намерих проблема:
CODE

signature = self.signer.sign(digest)
print (signature)
'''
Връща следното
b'\x90\xb4\x07\xa8\x80\xee\x9f\x10\xae\x02`\xe0\x01\x8a\x86\xd4\xb8\xd6\x18\x95\xa0m)vY\xfa\x07#/\xa8\x1c\x92\xd6kR\xf04\xa0[0\xf6@le\xe0\xc9V\xaf@*\x9a\xce\x90\x1csy\x1f\xf9\xc4\x14d\xb6\xdbp2\xa5\xe2)_<\x82\x87\x86\x92*T\xb9C\xf9\xe2\x99w\x19%=\xb1\xd4\x15\x19\xddq\xf6d\xa9\xde\n\xcfN6Q\xee\xc0z\x0f\xf8_\xfd\n\xc5\\=\x8eV}\x0c\x1d\xa8s\xa2\xff\xd4\xc6\xc8\xe7<\x89U['
'''
self.signer.verify(digest, signature) # Минава

# обаче това не мога да го прекарам през мрежата и правя така
signature = self.signer.sign(digest).hex()
print (signature)
'''
6a621f37b7b89736d7a31fe3329eef9b6ec2f856323cd16ae9f863970db3c976f1a0c0eaea28e9d2d22bb62bbce3b4d3d1e2b4f0b438d3d6bb5330ad9acbea69ea1e7a89042707f3e72dd5de4b0e95afb7b51cb018813572020875b7bba17743a66be370eaf1819b2402847a216d6543b77f50736afede2b5b0debcd70d1462c'''

# как да го завъртя от другата страна от hex ????
PMEmail Poster
Top
dedal
Публикувано на: 07-01-2023, 12:56
Quote Post



Име: Григор Колев
Група: Потребител
Ранг: Активен

Мнения: 200
Регистриран на: 17.11.10



Решено
CODE

signature = self.signer.sign(digest).hex()
self.signer.verify(digest, binascii.unhexlify(signature))
PMEmail Poster
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0