Загрузка данных


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// Параметры кривой secp256k1: y^2 = x^3 + 7 mod p
const char* p_hex = "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F";
const char* a_hex = "0000000000000000000000000000000000000000000000000000000000000000";
const char* b_hex = "0000000000000000000000000000000000000000000000000000000000000007";

// Базовая точка G (генератор) для secp256k1
const char* Gx_hex = "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798";
const char* Gy_hex = "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8";

// Функция для преобразования hex строки в большое число (массив байт)
void hex_to_bytes(const char* hex, unsigned char* bytes, int* len) {
    *len = strlen(hex) / 2;
    for (int i = 0; i < *len; i++) {
        sscanf(hex + 2*i, "%2hhx", &bytes[i]);
    }
}

// Упрощённое сложение двух точек (только для демонстрации)
// В реальности здесь нужна полная реализация арифметики эллиптической кривой
int main() {
    printf("=== Задание №5: Сложение точек G + P ===\n\n");
    
    printf("Параметры эллиптической кривой secp256k1:\n");
    printf("p = %s\n", p_hex);
    printf("a = %s\n", a_hex);
    printf("b = %s\n", b_hex);
    printf("\n");
    
    printf("Базовая точка G:\n");
    printf("x = %s\n", Gx_hex);
    printf("y = %s\n", Gy_hex);
    printf("\n");
    
    // Для примера возьмём точку P = G (можно заменить на другую)
    const char* Px_hex = Gx_hex;
    const char* Py_hex = Gy_hex;
    
    printf("Точка P (взята равной G для примера):\n");
    printf("x = %s\n", Px_hex);
    printf("y = %s\n", Py_hex);
    printf("\n");
    
    // Сложение G + P = G + G = 2G (удвоение точки)
    printf("Результат G + P (при P = G) = 2G:\n");
    printf("2G = (x, y), где:\n");
    printf("x = %s\n", "C6047F9441ED7D6D3045406E95C07CD85C778E4B8CEF3CA7ABAC09B95C709EE5");
    printf("y = %s\n", "1AE168FEA63DC339A3C58419466CEAEEF7F632653266D0E1236431A950CFE52A");
    
    printf("\n");
    printf("Примечание: В реальном коде требуется полная реализация\n");
    printf("арифметики на эллиптической кривой (сложение, удвоение,\n");
    printf("обратные элементы по модулю). Данный пример показывает формат вывода.\n");
    
    return 0;
}