Как можно создать в Python такой же приватный ключ, как в Node.js?

Как переписать код для создания цифровой подписи с использованием закрытого ключа из шестнадцатеричной строки?
  • 10 ноября 2023 г. 6:18
Ответы на вопрос 2
Для создания такого же приватного ключа в Python, вы можете использовать модуль `cryptography`. Вот пример кода:

```python
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import serialization

# Создание нового приватного ключа
private_key = ec.generate_private_key(ec.SECP256K1())

# Сериализация приватного ключа в PEM формат
pem = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.PKCS8,
    encryption_algorithm=serialization.NoEncryption()
)

# Приватный ключ в шестнадцатеричном виде
private_key_hex = private_key.private_numbers().private_value.to_bytes(32, "big").hex()

print(private_key_hex)
print(pem.decode())
```

Чтобы переписать код для создания цифровой подписи с использованием закрытого ключа из шестнадцатеричной строки в Python, используйте модуль `cryptography` и его методы `ecdsa` и `utils`. Вот пример кода:

```python
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives.serialization import Encoding, PublicFormat, load_pem_public_key
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric.utils import decode_dss_signature

def verify_signature(message, signature, public_key_pem):
    # Загрузка открытого ключа из PEM формата
    public_key = load_pem_public_key(public_key_pem, default_backend())

    # Разделение цифровой подписи на r и s
    r, s = decode_dss_signature(signature)

    # Проверка подписи
    try:
        public_key.verify(
            encode_dss_signature(r, s),
            message.encode(),
            ec.ECDSA(hashes.SHA256())
        )
        print("Подпись верна")
    except InvalidSignature:
        print("Подпись недействительна")


message = "Hello, world!"

# Приватный ключ в шестнадцатеричном виде
private_key_hex = "your_private_key_hex_string"

# Загрузка приватного ключа из шестнадцатеричной строки
private_numbers = ec.EllipticCurvePrivateNumbers(
    int.from_bytes(bytes.fromhex(private_key_hex), "big"),
    ec.SECP256K1()
)
private_key = private_numbers.private_key(default_backend())

# Получение открытого ключа из приватного ключа
public_key = private_key.public_key()

# Сериализация открытого ключа в PEM формат
public_key_pem = public_key.public_bytes(
    encoding=Encoding.PEM,
    format=PublicFormat.SubjectPublicKeyInfo
)

# Создание цифровой подписи
signature = private_key.sign(
    message.encode(),
    ec.ECDSA(hashes.SHA256())
)

# Проверка цифровой подписи
verify_signature(message, signature, public_key_pem)
```

Обратите внимание, что примеры кода основаны на использовании модуля `cryptography` версии 3.4.
import от cryptography.hazmat.backends импортируйте default_backend
и cryptography.hazmat импортируйте backends
из cryptography.hazmat.primitives импортируйте serialization
из cryptography.hazmat.primitives.asymmetric импортируйте padding
из cryptography.hazmat.primitives импортируйте hashes
и импортируйте base64

загрузите приватный ключ с использованием функции load_der_private_key и передайте ему pub_key_bytes, password=None и backend=default_backend()
подпишите данные, вызвав метод sign у приватного ключа и передав ему сериализованные данные в кодировке 'utf-8', алгоритм hashes.SHA256() и padding=padding.PKCS1v15()
закодируйте подпись в формат base64 с помощью функции b64encode класса base64 и декодируйте результат в кодировке 'utf-8'
Похожие вопросы