使用c语言实现DH秘钥分配算法

使用c语言实现DH秘钥分配算法

DH算法原理

密钥分配

    • 选择一个大素数p, 选择一个整数g(g < p);
    • 通信方A选择一个随机数a,并发送 mod p 给 通信方B;
    • 通信方B选择一个随机数b,并发送 mod p 给 通信方A;
    • 通信方A计算k1 = ( mod p)a mod p;
    • 通信方B计算k2 = ( mod p)b mod p;
    • 由此,k1 = k2。
DH.h
cpp 复制代码
#pragma once
#include <tommath.h>
#include <time.h>
#include <iostream>
#include <Windows.h>

using namespace std;

#define SUBKEY_LENGTH 78  //  >512 bit

void Create_number(mp_int *number, int mode);
int Miller_rabin(mp_int *number);
void Create_prime_number(mp_int *number);
void initial();
void mp_print(mp_int *number);
void Write_num_2_File(char *file_name, mp_int *num);
DH.cpp
cpp 复制代码
#include "DH.h"

mp_int two;
mp_int five;
mp_int zero;
mp_int one;

void Create_number(mp_int *number, int mode)
{
	int i;

	srand((unsigned)time(NULL));

	char temp_number[SUBKEY_LENGTH + 1];

	temp_number[0] = rand() % 9 + 1 + 48;

	if (0 == mode)
	{
		int temp;
		for (i = 1; i <= SUBKEY_LENGTH - 2; i++)
			temp_number[i] = rand() % 10 + 48;

		temp = rand() % 10;
		if (0 == temp % 2)
			temp++;

		if (5 == temp)
			temp = 7;

		temp_number[SUBKEY_LENGTH - 1] = temp + 48;

		temp_number[SUBKEY_LENGTH] = '\0';
	}
	else if (1 == mode)
	{
		int digit = rand() % (SUBKEY_LENGTH - 2) + 2;

		for (i = 1; i <= digit - 1; i++)
			temp_number[i] = rand() % 10 + 48;

		temp_number[digit] = '\0';
	}

	mp_read_radix(number, temp_number, 10);
}


int Miller_rabin(mp_int *number)
{
	int result;
	mp_int base;
	mp_init_size(&base, SUBKEY_LENGTH);

	Create_number(&base, 1);

	mp_prime_miller_rabin(number, &base, &result);

	mp_clear(&base);

	return result;
}


void Create_prime_number(mp_int *number)
{
	mp_int r;
	mp_init(&r);

	int time = 100;
	int result;
	int i;

	Create_number(number, 0);

	while (1)
	{
		mp_prime_is_divisible(number, &result);

		if (0 != result)
		{
			do
			{
				mp_add(number, &two, number);
				mp_mod(number, &five, &r);
			} while (MP_EQ == mp_cmp_mag(&zero, &r));

			continue;
		}

		for (i = 0; i < time; i++)
		{
			if (!Miller_rabin(number))
				break;
		}

		if (i == time)
			return;
		else
		{
			do
			{
				mp_add(number, &two, number);
				mp_mod(number, &five, &r);
			} while (MP_EQ == mp_cmp_mag(&zero, &r));
		}
	}
}


void initial()
{
	mp_init_set_int(&two, 2);
	mp_init_set_int(&five, 5);
	mp_init_set_int(&zero, 0);
	mp_init_set_int(&one, 1);
}


void mp_print(mp_int *number)
{
	char str[SUBKEY_LENGTH * 2 + 1];
	mp_toradix(number, str, 10);
	cout << str << endl;
}


void Write_num_2_File(char *file_name, mp_int *num)
{
	remove(file_name);
	FILE *fp = fopen(file_name, "w+");

	if (NULL == fp)
	{
		cout << "open file error!" << endl;
		return;
	}

	char str[SUBKEY_LENGTH * 2];
	
	mp_toradix(num, str, 10);

	fprintf(fp, "%s", str);

	fclose(fp);
}
main.h
cpp 复制代码
#pragma once
#include "DH.h"
main.cpp
cpp 复制代码
#include "main.h"


int main()
{
	initial();

	mp_int p, g, a, b, ka, kb;

	mp_init_size(&p, SUBKEY_LENGTH);
	mp_init_size(&g, SUBKEY_LENGTH);
	mp_init_size(&a, SUBKEY_LENGTH);
	mp_init_size(&b, SUBKEY_LENGTH);
	mp_init_size(&ka, SUBKEY_LENGTH);
	mp_init_size(&kb, SUBKEY_LENGTH);

	Create_prime_number(&p);

	Create_number(&g, 1);
	Sleep(1000);
	
	Create_number(&a, 1);
	Sleep(1000);

	Create_number(&b, 1);
	
	mp_exptmod(&g, &a, &p, &ka);
	mp_exptmod(&g, &b, &p, &kb);

	cout << "p: ";
	mp_print(&p);
	cout << "g: ";
	mp_print(&g);
	cout << "a: ";
	mp_print(&a);
	cout << "b: ";
	mp_print(&b);

	cout << "ka: ";
	mp_print(&ka);
	cout << "kb: ";
	mp_print(&kb);
	
	Write_num_2_File("d:\\DH_p.txt", &p);
	Write_num_2_File("d:\\DH_g.txt", &g);
	Write_num_2_File("d:\\DH_a.txt", &a);
	Write_num_2_File("d:\\DH_b.txt", &b);
	Write_num_2_File("d:\\DH_ka.txt", &ka);
	Write_num_2_File("d:\\DH_kb.txt", &kb);

	mp_clear_multi(&p, &g, &a, &b, &ka, &kb, NULL);

	return 0;
}
相关推荐
请注意这个女生叫小美21 分钟前
C语言 斐波那契而数列
c语言
Legendary_00825 分钟前
Type-C 一拖二快充线:突破单口限制的技术逻辑
c语言·开发语言
智者知已应修善业42 分钟前
【查找字符最大下标以*符号分割以**结束】2024-12-24
c语言·c++·经验分享·笔记·算法
91刘仁德1 小时前
c++类和对象(下)
c语言·jvm·c++·经验分享·笔记·算法
No0d1es3 小时前
电子学会青少年软件编程(C语言)等级考试试卷(四级)2025年12月
c语言·青少年编程·电子学会·四级·2025年
皮皮哎哟3 小时前
深入浅出双向链表与Linux内核链表 附数组链表核心区别解析
c语言·数据结构·内核链表·双向链表·循环链表·数组和链表的区别
wanghu20244 小时前
AT_abc443_C~E题题解
c语言·算法
梵刹古音4 小时前
【C语言】 浮点型(实型)变量
c语言·开发语言·嵌入式
-dzk-4 小时前
【代码随想录】LC 203.移除链表元素
c语言·数据结构·c++·算法·链表
进击的小头5 小时前
陷波器实现(针对性滤除特定频率噪声)
c语言·python·算法