使用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;
}
相关推荐
极客 - L U17 小时前
卡尔曼滤波从零到精通
c语言·数据结构·单片机·嵌入式硬件·mcu
谙弆悕博士19 小时前
用 C 写了个 Windows 聊天室,踩了几个多线程和控制台的坑
c语言·开发语言·c++·windows·网络编程·聊天室
水饺编程19 小时前
第2章:Linux 基础,删除用户
linux·c语言·汇编
小鱼仙官21 小时前
使用Qt封装C/C++ 动态库 用于第三方调用
c语言·c++·qt
FLJwu1 天前
运动相机图像传感器选型实战|第二篇:参数看着一模一样,为什么骑行录像疯狂果冻、拖影翻车?
android·c语言·开发语言·数码相机·运动相机·oem 量产
Escalating_xu1 天前
【C语言项目实战】贪吃蛇(下):移动、碰撞与计分,完成一局可玩的游戏
c语言·开发语言·游戏
C++ 老炮儿的技术栈1 天前
机器人的坐标,像 XYZ 的坐标值,是用单精度浮点还是用双精度浮点?
c语言·c++·人工智能·单片机·c
lhbweilai2 天前
分析FreeRTOS内核对象API的源码实现(八)
c语言·开发语言·stm32·单片机
艾络迅Acceleronix2 天前
环境监测终端:STM32+EG800Z AT+ 艾络迅平台实战|多传感器采集联动全流程
c语言·stm32·单片机·嵌入式硬件·物联网·1024程序员节
Zwawa2 天前
一只按键不只“按下”:短按、长按和连按如何共存
c语言·单片机·嵌入式