Simplified number generation library for the Diffie-Hellman protocol.
Project description
Diffie - Hellman Python/C++ libray
Описание: Это библиотека для генерирования чисел для использования криптографического протокола Diffie-Hellman. Испольуется C++ для максимальной (которой мне удалось достичь) скорости генерации p - больших простых чисел. Используется python wrapper (обёртка) чтобы использовать функции из .dll (для Windows) или из .so (для Linux). я не нашёл другого способа как можно из питона использовать C++ функции =).
Обзор функций из utils.h и utils.cpp
1. generate_p_g_a
- Описание: Генерирует параметры ( p ) (простое число), ( g ) (основание) и ( a ) (приватное число).
- Реализация:
- Проверяет размер бит (от 512 до 8192).
- Ограничение было введено для безопасности, минимально 512 для тестов и проверок, в реальных задачах, минимум 1024 а лучше 2048 бит.
- Использует кэш для ускорения генерации ( p ), если число для данного размера уже сгенерировано.
- Устанавливает ( g ) как 2.
- Случайно генерирует ( a ) в диапазоне от ( 1 ) до ( p-1 ).
- В Python-врапере:
- Функция обёрнута как
generate_p_g. - Возвращаются только ( p ) и ( g ). ( a ) освобождается.
- Функция обёрнута как
2. generate_b
- Описание: Генерирует приватное число ( b ) или ( a ), как выводную цифру назовёте.
- Реализация:
- Принимает ( p ) и ( g ) как входные данные.
- Генерирует ( b ) или ( a ) в диапазоне от ( 1 ) до ( p-1 ).
- В Python-врапере:
- Переименована в
generate_a_or_b. - Универсальная функция для генерации либо ( a ), либо ( b ).
- Переименована в
3. generate_A
- Описание: Генерирует ( A ) на основе ( p ), ( g ) и ( a ), где ( A = g^a \mod p ), может аналогично генерировать ( B ), просто формула станет: ( B = g^b \mod p )
- Реализация:
- Использует модульное экспоненциальное вычисление с помощью OpenSSL.
- В Python-врапере:
- Переименована в
generate_A_or_B. - Универсальная функция для вычисления ( A ) или ( B ).
- Переименована в
4. generate_shared_key
- Описание: Генерирует общий ключ ( K ), используя ( A ), ( b ), ( p ), ( g ): ( K = A^b \mod p ), может также использовать и ( B ) с ( a ), также формула: ( K = B^a \mod p )
- Реализация:
- Вычисляет общий ключ на основе предоставленных данных.
- В Python-врапере:
- Общий ключ сразу передаётся в
hash_shared_keyдля хэширования. - Возвращается хэшированный ключ.
- Общий ключ сразу передаётся в
5. hash_shared_key
- Описание: Хэширует общий ключ с помощью SHA-256.
- Реализация:
- Преобразует ключ в строку 16-ричного формата.
- В Python-врапере:
- Вызов производится из
generate_shared_key.
- Вызов производится из
6. free_memory
- Описание: Освобождает выделенную память для строк.
- Реализация:
- Использует
OPENSSL_freeдля предотвращения утечек памяти.
- Использует
- В Python-врапере:
- Используется для освобождения памяти после вызова каждой функции.
Дополнительные возможности Python-врапера
-
Автоматическая загрузка библиотеки:
- Определяет необходимую версию библиотеки DLL/SO на основе архитектуры и операционной системы.
- Поддерживаются Windows (x86, x64) и Linux (x86, x64, ARMv7, ARM64).
-
Переименование функций:
generate_b→generate_a_or_b.generate_A→generate_A_or_B.- Это сделано для повышения универсальности функций.
-
Автоматическое хэширование ключа:
- Логика изменена: теперь общий ключ сразу хэшируется в
generate_shared_key.
- Логика изменена: теперь общий ключ сразу хэшируется в
-
Управление памятью:
- Все строки, выделенные в C++, освобождаются с помощью
free_memory, чтобы избежать утечек памяти.
- Все строки, выделенные в C++, освобождаются с помощью
Использование/Примеры
- Генерация параметров ( p ) и ( g )
from diffie_hellman_lib.wrapper import generate_p_g
# Генерация параметров с использованием 2048-битного ключа
p, g = generate_p_g(2048)
print(f"Generated p: {p}")
print(f"Generated g: {g}")
Результат: Выводит значения ( p ) и ( g ), сгенерированные для криптографических операций.
- Генерация приватного числа ( a ) или ( b )
from diffie_hellman_lib.wrapper import generate_a_or_b
# Пример значений p и g
p = 23 # Пример числа p
g = 5 # Пример числа g
# Генерация приватного числа a или b
private_value = generate_a_or_b(p, g)
print(f"Generated private value: {private_value}")
Возвращает случайное приватное число, используемое для генерации ключей.
- Генерация значения ( A ) или ( B )
from diffie_hellman_lib.wrapper import generate_A_or_B
# Пример значений
p = 23
g = 5
a = 6 # Приватное число
# Генерация A или B
public_value = generate_A_or_B(p, g, a)
print(f"Generated public value: {public_value}")
Результат: Возвращает значение ( A ) или ( B ).
- Генерация общего ключа ( K )
from diffie_hellman_lib.wrapper import generate_shared_key
# Пример значений
A = 8
p = 23
g = 5
b = 15
# Генерация общего ключа
shared_key = generate_shared_key(A, p, g, b)
print(f"Generated shared key (hashed): {shared_key}")
Результат: Возвращает общий ключ, который автоматически хэшируется с использованием SHA-256.
- Хэширование ключа
from diffie_hellman_lib.wrapper import hash_shared_key
# Пример общего ключа
shared_key = "123456"
# Хэширование общего ключа
hashed_key = hash_shared_key(shared_key)
print(f"Hashed key: {hashed_key}")
Результат: Возвращает SHA-256-хэш переданного общего ключа.
Пример полного использования
Логика Alice (первой стороны):
from diffie_hellman_lib import wrapper
p, g = wrapper.generate_p_g(1024) # получаем p и g, p размером 1024 бит. (рекомендуемо 2048)
a = wrapper.generate_a_or_b(p, g) # генерируем собственный секретный ключ
A = wrapper.generate_A_or_B(p, g, a) # генерируем свой публичный ключ
# логика отправки p, g, A Bob-у (Второй стороне) и логика получения B От Bob-а (Второй стороны) например через https или сокеты...
shared_key = wrapper.generate_shared_key(B, p, g, a) # Получаем общий секретный ключ
print(shared_key) # выводим полученный ключ
Логика Bob (второй стороны):
from diffie_hellman_lib import wrapper
# Логика получения от Alice чисел p, g, A...
b = wrapper.generate_a_or_b(p, g) # Генерируем свой секретный ключ
B = wrapper.generate_A_or_B(p, g, b) # генерируем свой публичный ключ
# Логика отправки B (публичного ключа), Alice (первой стороне) например через https или сокеты...
shared_key = wrapper.generate_shared_key(A, p, g, b) # Получаем общий секретный ключ
print(shared_key) # выводим общий секретный ключ
Таким вот образом можно обменятся ключами шифрования между двумя сторонами по не зашифрованному каналу.
Лицензия
Авторы
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file diffiehellmanlib-1.5.14.tar.gz.
File metadata
- Download URL: diffiehellmanlib-1.5.14.tar.gz
- Upload date:
- Size: 8.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.0.1 CPython/3.13.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8d11300a7f3dca73f721a7fc2805b99acb4deaf535ebe9b0cce40c45944d0b4d
|
|
| MD5 |
c33155558fc2037225d2809571802c57
|
|
| BLAKE2b-256 |
ff87416cced88c3483388f030a401bdb113a8399d196af155d7bebb0fc03db52
|
File details
Details for the file diffiehellmanlib-1.5.14-py3-none-any.whl.
File metadata
- Download URL: diffiehellmanlib-1.5.14-py3-none-any.whl
- Upload date:
- Size: 2.1 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.0.1 CPython/3.13.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2ecf14faed2bda64547f1850366b90cb25b265d50c8f6cedfe6d76f3ff2fe3ac
|
|
| MD5 |
0bbb5f3ecc268e30a7ce377b1b70c28a
|
|
| BLAKE2b-256 |
b9153a38b881314aec55621236c144059c6137ab534237a7f37680ed3168a8f9
|