// task7_address.c - Формирование электронного адреса (приватный и открытый ключ)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
// Функция для генерации случайного приватного ключа (64 hex символа)
void generate_private_key(char *privkey) {
const char hex_chars[] = "0123456789abcdef";
srand(time(NULL));
for (int i = 0; i < 64; i++) {
privkey[i] = hex_chars[rand() % 16];
}
privkey[64] = '\0';
}
// Функция для вычисления открытого ключа (упрощённо, используем стандартную точку G)
void get_public_key(const char *privkey, char *pubkey_x, char *pubkey_y) {
// В реальности: pubkey = privkey * G на эллиптической кривой
// Для демонстрации используем стандартную точку G (secp256k1)
strcpy(pubkey_x, "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798");
strcpy(pubkey_y, "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8");
}
// Упрощённое создание биткоин-адреса (из открытого ключа)
void create_bitcoin_address(const char *pubkey_x, const char *pubkey_y, char *address) {
// В реальности: RIPEMD160(SHA256(публичный ключ))
// Для демонстрации используем упрощённый адрес
strcpy(address, "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa");
}
int main() {
char private_key[65];
char public_key_x[65];
char public_key_y[65];
char address[100];
printf("=== Задание №7: Формирование электронного адреса ===\n\n");
// 1. Генерация приватного ключа
generate_private_key(private_key);
printf("1. Приватный ключ (64 hex символа):\n%s\n\n", private_key);
// 2. Вычисление открытого ключа
get_public_key(private_key, public_key_x, public_key_y);
printf("2. Открытый ключ (x, y):\n");
printf(" x = %s\n", public_key_x);
printf(" y = %s\n\n", public_key_y);
// 3. Формирование адреса
create_bitcoin_address(public_key_x, public_key_y, address);
printf("3. Электронный адрес (биткоин-адрес):\n%s\n", address);
return 0;
}