RSA加密解密算法

1 引言

1.1 任务概要

本次课程设计即完成RSA算法签名验证。

1.1.1 任务要求

(1)产生两个奇数,判断是否是素数。
(2)计算得到n=pq的值和φ(n)的值。
(3)设定加密用的参数e=17,用辗转相除法求得解密用的参数d。
(4)设默认要加密的明文为31631,使用模重复平方法对该明文进行加密和解密。
(5)给出辗转相除法求得解密用的参数d的演示过程,如图16演示。
(6)界面设计友好、简洁和美观,图为参考界面,可自行根据功能设计界面。

图 1

图 2

1.2 运行环境和开发环境

1.2.1 运行环境

Windows 10

1.2.2 开发环境

Visual studio 2017

1.3 密码算法原理简单介绍

RSA的安全性基于复杂性理论中的计算安全性,依赖于大整数分解这–NP难题可靠性与所用密钥的长度有很大关系,假如有人找到一种很快的分解因子的算法,即从一个公钥中通过因数分解得到私钥,那么用RSA加密的信息的可靠性肯定会极度下降但由于其工作量巨大,按目前计算机的处理能力是不可能实现的实践证明,在当前的技术和方法下,密钥不小于1025bit的RSA算法仍然是安全的, 这充分说明RSA系统具有良好的保密性能。
因此,尽管先后出现了很多新的公钥体制算法。但RSA仍然在不同应用领域占据了重要的位置。随着计算机运算速度的提高以及因子分解算法的突破,RSA的密钥长度将越来越大,其软硬件实现速度将成为制约其使用的重要因素。

2 密码算法程序各模块详细设计

2.1 核心模块主要实现算法的流程

如图所示核心代码模块。随机大素数、模逆、加密解密、循环冗余模块。

2.2核心模块的函数说明和实现方式

2.1.1 辗转相除法

该算法实现展示辗转相除法的过程和求模逆。

2.1.2 代码展示

unsigned long inverse(unsigned long euler, unsigned long e,int * len, unsigned long ** array)
{
	int count = 0;
	int flags = true;
	(*array) = (unsigned long * ) malloc(sizeof(unsigned long) * 10);
	(*array)[count++] = euler;
	(*array)[count++] = e;
	
	while (flags)
	{	
		unsigned long temp;
		temp = (*array)[count -2] % (*array)[count-1];
		(*array)[count++] = temp;
		
		if (temp == 1)
		{
			unsigned long ret_val = 1;
			unsigned long b0 = (*array)[count - 3] / (*array)[count - 2];
			unsigned long C = 1;
			for (int i = count - 4; i >= 0; i--)
			{
					ret_val = b0 * ((*array)[i] / (*array)[i + 1]) + C;
					C = b0; 
					b0 = ret_val; //计算私钥
			}
			if ((count - 3) % 2 == 0)
			{
				ret_val = euler - ret_val;//
			}
			*len = count;
			return ret_val;
		}
		else if(temp == 0)
		{
			flags = false;
			break;
		}
	}
	return 0;
}

2.1.3 加密解密模块

实现RSA算法签名验证

2.1.4 代码展示

 long long validate(long long c, long long n, long  long e)
{
	 long long m = c;
	for (int i = 1; i < e; i++)
	{
		m = (c * m) % n;
	}
	return m;

}

 long long sign( long long m,  long long n,  long long d)
{
	 long long c = m;
	for (int i = 1; i < d; i++)
	{
		c = (c * m) % n;
	}
	return c;
}

3 程序测试

3.1程序测试过程

(1)随机产生两个大素数,如图5-1所示。
RSA加密解密算法_第1张图片
图5-1 测试结果1
(2)输入 公钥e , 点击演示 。
RSA加密解密算法_第2张图片
图5-2 测试结果2

(3)获得私钥d , 点击计算 开始RSA 签名。
RSA加密解密算法_第3张图片

图5-3 测试结果3

4 密码算法课程设计实践总结

在本次课程设计中,熟悉掌握了RSA算法加密解密和签名验证,再用C++解决问题时,了解了MFC 的API , 熟悉使用了visual studio 下windows 开发,其中遇到最麻烦的问题是要通过array数组来动态的更行演示对话框,我通过使用C语言中灵活的指针进行解决,RSA加密解密过程进行模逆运算,也遇到了问题,发现arary数组在大小小于3时 ,出现bug 加密解密错误,主要原因就是模逆运算时 , 考虑不周全。
本次课程设计收获了MFC 框架的使用, 亲身实践RSA签名验证 , 与理论知识学习还是不同。 提高了代码能力,和逻辑思维能力。

你可能感兴趣的:(Hacker之路)