RSA课程设计

合集下载

rsa加解密课程设计代码

rsa加解密课程设计代码

rsa加解密课程设计代码一、课程目标知识目标:1. 学生能够理解RSA加密算法的基本原理,掌握其数学背景和计算步骤。

2. 学生能够描述公钥和私钥在加密和解密过程中的作用,并掌握生成公钥和私钥的方法。

3. 学生能够运用所学知识,编写简单的RSA加解密程序代码。

技能目标:1. 学生通过动手实践,提高编程能力,培养解决问题的技巧。

2. 学生通过小组合作,培养团队协作和沟通能力,共同完成加解密程序的设计和调试。

情感态度价值观目标:1. 学生培养对信息安全领域的兴趣,认识到加密技术在保护信息安全中的重要性。

2. 学生在学习过程中,培养勇于尝试、克服困难的积极态度,增强自信心。

3. 学生通过学习,增强网络安全意识,树立正确的网络安全观。

课程性质:本课程为信息技术学科,旨在让学生了解和掌握信息安全领域的基本知识,提高编程实践能力。

学生特点:学生为高中年级,具有一定的数学基础和编程经验,对新鲜事物充满好奇,喜欢探索和实践。

教学要求:课程应注重理论与实践相结合,鼓励学生动手实践,以培养学生实际操作能力为主。

在教学过程中,注重启发式教学,引导学生自主探究和合作学习,提高学生的综合素养。

通过本课程的学习,使学生能够将所学知识应用于实际生活中,为未来的学习和工作打下基础。

二、教学内容1. 理论知识:- RSA加密算法的数学原理,包括欧拉函数、模逆元等概念。

- 公钥和私钥的生成方法,以及它们在加解密过程中的应用。

- RSA算法的安全性分析,了解其抵御攻击的能力。

2. 实践操作:- 编程环境准备,如安装Python和相关的加密库。

- 编写RSA加密程序,实现公钥加密、私钥解密的功能。

- 编写RSA解密程序,实现私钥解密、公钥验证的功能。

3. 教学大纲:- 第一课时:介绍RSA加密算法的背景和基本概念,讲解数学原理。

- 第二课时:演示公钥和私钥的生成方法,分析加解密过程。

- 第三课时:指导学生编写RSA加解密程序,实践操作。

电子商务安全课程设计RSA算法

电子商务安全课程设计RSA算法

通信与信息工程学院电子商务安全课程设计班级:电子商务姓名:学号:指导教师:设计时间:2013.12.26成绩:评语:通信与信息工程学院二〇一三年目录1 引言 (3)2 加密算法 (4)2.1 加密算法RSA简介 (4)2.2 加密算法RSA原理 (5)2.2.1 RSA算法基本原理 (5)2.2.2 RSA算法实现步骤 (5)2.2.3 RSA算法过程 (5)2.3 加密算法RSA实现源码 (6)3 数字证书的申请和使用 (11)3.1 数字证书简介 (11)3.2.1 北京数字证书认证中心 (12)3.2.2 中国金融认证中心(CFCA) (13)3.3 国内主要认证机构网站浏览 (14)3.4 个人数字证书 (16)3.4.1 申请个人数字证书 (17)3.4.2 查看个人数字证书 (19)3.5 数字证书的导入和导出 (21)3.5.1 数字证书的导入 (21)3.5.2 数字证书的导出 (22)3.6 数字证书使用 (22)3.7 数字证书的管理 (29)4 PGP软件的使用 (30)4.1 PGP软件介绍 (30)4.2 PGP软件的使用 (31)5 网上银行和电子钱包的使用......................... 错误!未定义书签。

6 电子商务系统安全设计。

(46)6.1目的 (46)6.2 环境 (46)6.3 实验内容 (46)6.3.1 凡客诚品网站现状分析 (46)6.3.2 电子商务系统现状 (47)6.3.3网络安全风险分析 (48)6.4 安全需求与目标 (51)6.5 网络安全方案设计原则 (51)6.6 网络信息安全技术 (51)6.6.1 防火墙技术 (51)6.6.2 入侵检测技术 (51)6.7 电子商务网络安全解决方案 (52)6.7.1 物理层安全解决方案 (52)6.7.2 网络层安全解决方案 (52)6.7.3 入侵检测安全技术建议: (52)6.7.4数据传输安全建议: (53)6.8 系统层安全解决方案 (53)6.8.1 应用层安全解决方案 (53)7 总结 (54)8 参考文献 (54)\1 引言随着通信网络技术的飞速发展,特别是Internet的不断普及,人们的消费观念和整个商务系统也发生了巨大了变化,人们更希望通过网络的便利性来进行网络采购和交易,从而导致了电子商务(Electronic Commerce)的出现,并在世界范围内掀起了电子商务的热潮。

RSA算法课程设计报告

RSA算法课程设计报告
SK); PK公开,SK保密;从PK推出SK是很困难的;A、E双方通 信时,A通过任何途径取得E的公钥,用E的公钥加密信息,加密后的信 息可通过任何不安全信道发送。E收到密文信息后,用自己私钥解密恢复 出明文。公钥密码体制已成为确保信息的安全性的关键技术。RSA公钥密
码体制到目前为止还是一种被认可为安全的体制。

1课题综述
课题来源
课题意义
预期目标
2系统分析
基础知识
总体方案
功能模块
3系统设计
算法描述

错误!未定义书签
错误!未定义书签
错误!未定义书签
错误!未定义书签
错误!未定义书签
错误!未定义书签
错误!未定义书签
错误!未定义书签
错误!未定义书签
错误!未定义书签
流程图
4代码编写
5运行与测试
产生公钥和密钥
加密与解密
密体制保证了秘密信息的安全。
预期目标
在充分理解RSA加密体制概念和原理的基础上,用Microsoft Visual
C++实现RSAffl密与解密,演示公钥与密钥的生成及加密与解密的过程。
2系统分析
基础知识
2.1.1素数
称整数p(p>1)是素数,如果p的因子只有士1,士p。
称c是两个整数a、b的最大公因子,如果
a二qn+r,0<r<n,
其中x为小于或等于x的最大整数。
用a mod n表示余数r
如果(a modn)=(b modn),则称两整数a和b模n同余,记为a三b modn。
称与a模n同余的数的全体为a的同余类,记为[a],称a为这个同余类的十一.r十表示元素。

RSA加密解密的设计与实现

RSA加密解密的设计与实现

上海电力学院《应用密码学》课程设计题目:RSA加密解密的设计与实现院系:计算机科学与技术学院专业年级:2010级学生姓名:李正熹学号:20103273指导教师:田秀霞2013年1月8日目录目录1.设计要求2.开发环境与工具3.设计原理(算法工作原理)4.系统功能描述与软件模块划分5.设计核心代码6.参考文献7. 设计结果及验证8. 软件使用说明9. 设计体会附录1.设计要求1 随机搜索大素数,随机生成公钥和私钥2 用公钥对任意长度的明文加密3 用私钥对密文解密4 界面简洁、交互操作性强2.开发环境与工具Windows XP操作系统Microsoft Visual C++ 6.01.创建rsa工程2.在rsa工程中创建20103273 李正熹cpp文件3.设计原理RSA算法简介公开密码算法与其他密码学完全不同,它是基于数学函数而不是基于替换或置换。

与使用一个密钥的对称算法不同,公开密钥算法是非对称的,并且它使用的是两个密钥,包括用于加密的公钥和用于解密的私钥。

公开密钥算法有RSA、Elgamal等。

RSA公钥密码算法是由美国麻省理工学院(MIT)的Rivest,Shamir和Adleman 在1978年提出来的,并以他们的名字的有字母命名的。

RSA是第一个安全、实用的公钥密码算法,已经成为公钥密码的国际标准,是目前应用广泛的公钥密码体制。

RSA的基础是数论的Euler定理,其安全性基于二大整数因子分解问题的困难性,公私钥是一对大素数的函数。

并且该算法已经经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这不恰恰说明该算法有其一定的可信度。

4.系统功能描述与软件模块划分功能:1.进行加密加密第一步,随机两个素数p和q,并求出n = p*q,然后再求出n的欧拉函数值phi。

第二步,在[e,phi]中选出一个与phi互素的整数e,并根据e*d ≡1(mod phi),求出e 的乘法逆元。

密码学实验报告(AES,RSA)

密码学实验报告(AES,RSA)

华北电力大学实验报告||实验名称现代密码学课程设计课程名称现代密码学||专业班级:学生姓名:学号:成绩:指导教师:实验日期:[综合实验一] AES-128加密算法实现 一、实验目的及要求(1)用C++实现;(2)具有16字节的加密演示;(3)完成4种工作模式下的文件加密与解密:ECB, CBC, CFB,OFB.二、所用仪器、设备计算机、Visual C++软件。

三. 实验原理3.1、设计综述AES 中的操作均是以字节作为基础的,用到的变量也都是以字节为基础。

State 可以用4×4的矩阵表示。

AES 算法结构对加密和解密的操作,算法由轮密钥开始,并用Nr 表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系如表2所示)。

AES 算法的主循环State 矩阵执行1 r N 轮迭代运算,每轮都包括所有 4个阶段的代换,分别是在规范中被称为 SubBytes(字节替换)、ShiftRows(行位移变换)、MixColumns(列混合变换) 和AddRoundKey ,(由于外部输入的加密密钥K 长度有限,所以在算法中要用一个密钥扩展程序(Keyexpansion)把外部密钥 K 扩展成更长的比特串,以生成各轮的加密和解密密钥。

最后执行只包括 3个阶段 (省略 MixColumns 变换)的最后一轮运算。

表2 AES 参数比特。

3.2、字节代替(SubBytes )AES 定义了一个S 盒,State 中每个字节按照如下方式映射为一个新的字节:把该字节的高4位作为行值,低4位作为列值,然后取出S 盒中对应行和列的元素作为输出。

例如,十六进制数{84}。

对应S 盒的行是8列是4,S 盒中该位置对应的值是{5F}。

S 盒是一个由16x16字节组成的矩阵,包含了8位值所能表达的256种可能的变换。

S 盒按照以下方式构造:(1) 逐行按照升序排列的字节值初始化S 盒。

第一行是{00},{01},{02},…,{OF};第二行是{10},{l1},…,{1F}等。

基于RSA方式加密解密 面向对象程序设计

基于RSA方式加密解密  面向对象程序设计

题目加密解密课程名称面向对象程序设计课程设计目录1 题目描述 (1)2 功能分析 (2)2.1运算密钥模块 (3)2.2加密模块 (3)2.3解密模块 (3)2.4 退出3 系统设计 (4)3.1程序总体结构 (4)3.2主功能模块设计 (5)3.3程序设计 (7)3.4类与函数的设计与实现:包括功能、名称、参数说明 (8)4运行与测试结果 (10)5小结 (12)1.题目描述加密解密要求:(1)设计算法,对文件进行基于字符变形的加密/解密。

(2)编写程序,程序运行需要口令,口令存放在一个文件中,为了避免口令文件被阅读,不能以明文形式存放,利用(1)的思路,生成一个口令密文文件,可以修改口令。

2.功能分析RSA加密算法是第一个既能用于数据加密也能用于数字签名的算法。

它易于理解和操作,也十分流行。

算法的名字以发明者的姓氏首字母命名:Ron Rivest, Adi Shamir 和Leonard Adleman。

虽然自1978年提出以来,RSA的安全性一直未能得到理论上的证明,但它经历了各种攻击,至今(2006年)未被完全攻破。

随着越来越多的商业应用和标准化工作,RSA已经成为最具代表性的公钥加密技术。

2.1 运算密钥RSA算法首先需要运算出密钥,用户需输入两个素数,程序会给出处理后的密钥。

密钥分公钥和私钥两种,公钥用于加密文件,私钥用于解密文件。

2.2 加密该模块主要用于加密功能。

用户输入加密所需的公钥,然后输入所要加密的内容,程序会将其保存在mingwen.txt文件中,加密后的密文会保存于miwen.txt 文件中。

2.3 解密该模块主要用于解密功能。

用户需输入与公钥对应的私钥,然后输入加密后的密文,程序会解密该密文。

2.4 退出系统该模块用于推出本系统。

3 系统设计3.1 程序总体结构如图为程序的总体结构图,由于功能不多,程序不是很复杂。

系统从mian()函数开始执行。

从构造函数开始,根据用户的输入分别执行对应的函数。

rsa加密解密课程设计

rsa加密解密课程设计

rsa加密解密课程设计一、教学目标本课程旨在让学生了解和掌握RSA加密解密算法的基本原理和应用方法。

通过本课程的学习,学生应达到以下目标:1.知识目标:a.了解RSA加密算法的历史背景和发展过程。

b.掌握RSA算法的基本原理,包括公钥和私钥的生成、加密和解密过程。

c.理解RSA算法的数学基础,如大数分解、欧拉定理等。

d.熟悉RSA算法在现代通信技术中的应用场景。

2.技能目标:a.能够使用编程语言实现简单的RSA加密和解密功能。

b.能够分析RSA算法的优缺点,并根据实际需求选择合适的加密算法。

c.能够运用RSA算法解决实际问题,如数字签名、安全通信等。

3.情感态度价值观目标:a.培养学生对计算机科学和网络安全领域的兴趣,提高学生主动学习的积极性。

b.使学生认识到信息安全的重要性,增强学生的社会责任感和职业道德。

c.培养学生团队协作、创新思考和解决问题的能力。

二、教学内容本课程的教学内容主要包括以下几个部分:1.RSA加密算法的基本概念和历史背景。

2.RSA算法的数学原理,如大数分解、欧拉定理等。

3.RSA公钥和私钥的生成过程,以及加密和解密方法。

4.RSA算法的应用场景,如数字签名、安全通信等。

5.RSA算法的优缺点分析,以及与其他加密算法的比较。

三、教学方法为了提高学生的学习兴趣和主动性,本课程将采用多种教学方法,如:1.讲授法:教师讲解RSA加密算法的基本原理、数学基础和应用场景。

2.案例分析法:分析实际案例,让学生了解RSA算法在网络安全领域的应用。

3.实验法:引导学生动手实践,编写程序实现RSA加密和解密功能。

4.讨论法:学生分组讨论,分析RSA算法的优缺点,并提出改进意见。

四、教学资源为了支持教学内容和教学方法的实施,本课程将采用以下教学资源:1.教材:《计算机网络安全技术与应用》。

2.参考书:《密码学导论》、《信息安全原理与实践》。

3.多媒体资料:PPT课件、教学视频、网络资源等。

4.实验设备:计算机、网络设备、编程环境等。

RSA加解密的设计与实现 程序+报告

RSA加解密的设计与实现  程序+报告

上海电力学院《应用密码学》课程设计题目:RSA加解密的设计与实现院系:计算机与信息工程学院专业年级:信息安全专业2009252班学生姓名:学号:20093464指导教师:温蜜2011年1月6日目录一、设计要求 (3)二、开发环境与工具 (3)三、设计原理 (3)四、系统功能描述与软件模块划分 (4)五、设计核心代码 (6)六、设计结果及验证 (16)七、软件使用说明 (17)八、参考资料 (18)九、设计体会 (18)一、设计要求1、随机搜索大素数,随机生成公钥和私钥;2、用公钥对任意长度的明文加密;3、用私钥对密文解密;4、界面简洁、交互操作性强。

5、(可选)实现对汉字的加解密,把加密结果存放在文本文档二、开发环境与工具开发环境:win7 64位操作系统开发工具:VC++6.0三、设计原理(算法工作原理)首先设计一个能存放足够大数的类CBigInt ,这个类是把很大的数分解成一个个int 类型的数来i 存储的。

输入你要求的密钥位数,然后用rand ()函数生成一个个32位数,拼接成大数,进行素性检测,是素数就返回,就这样就产生了公钥(e,n)和私钥(d,n),然后利用 公式c=m^e mod n ,得到密文,保存得到的密文到文本文档,再用公式m=c^d mod n ,得到明文。

算法路程图如下:N 开始输入明文输入需要生成的密钥长度 产生随机大数进行拉宾-米勒 素性检测 通过? 加密解密验证结束 Y四、系统功能描述与软件模块划分CBigInt类的功能:class CBigInt{public:unsigned m_nLength;unsigned long m_ulV alue[BI_MAXLEN];CBigInt();~CBigInt();void Mov(unsigned __int64 A);void Mov( CBigInt& A);CBigInt Add( CBigInt& A); //加法CBigInt Sub(CBigInt& A); //减法CBigInt Mul(CBigInt& A); //乘法CBigInt Div(CBigInt& A); //除法CBigInt Mod( CBigInt& A); //模CBigInt Add(unsigned long A);CBigInt Sub(unsigned long A);CBigInt Mul(unsigned long A);CBigInt Div(unsigned long A);void FromString(char *,int len);int ToString(char *);unsigned long Mod(unsigned long A);int Cmp( CBigInt& A);CBigInt ModExp(CBigInt& A, CBigInt& B);CBigInt RsaTrans( CBigInt& A, CBigInt& B);int RabinMiller();CBigInt Euc(CBigInt& A);void GetPrime( unsigned bits);void Put(char *str, unsigned int system) ;void Get(char* str, unsigned int system);friend CBigInt operator +(CBigInt&a,CBigInt&b);friend CBigInt operator -(CBigInt&a,CBigInt&b);friend CBigInt operator *(CBigInt&a,CBigInt&b);friend CBigInt operator /(CBigInt&a,CBigInt&b);friend CBigInt operator %(CBigInt&a,CBigInt&b);CBigInt operator +( unsigned long b);CBigInt operator -( unsigned long b);CBigInt operator *( unsigned long b);CBigInt operator /( unsigned long b);};void Mov( CBigInt& A);void Mov(unsigned __int64 A)是实现大数复制的功能用法为a.Mov(b),就是把大数b赋给a CBigInt Add( CBigInt& A) 实现大数加法功能,用法为a.Add(b),等介于a+b;CBigInt Sub(CBigInt& A)实现大数减法功能,用法为a.Sub(b),等价于a-b;CBigInt Mul(CBigInt& A)实现大数乘法功能,用法为a.Mul(b),等价于a*b;CBigInt Div(CBigInt& A)实现大数除法功能,用法为a.Div(b),等价于a/b;CBigInt Mod( CBigInt& A)实现大数的模功能,用法为a.Mod(b)等价于a%b;void FromString(char *,int len)实现字符型的数转换成大数的功能,用法为a.FromString(m,n),意思是把n位的字符型m赋给大数a;int ToString(char *)实现把大数转变成字符型输出,用法为a.ToString(m),意思是把大数转换成字符型m;int Cmp( CBigInt& A)实现大数比较,用法为C=a.Cmp(b),如果a>b,则c=1,如果a=b则c=0,如果a<b=-1;CBigInt ModExp(CBigInt& A, CBigInt& B)实现大数模幂功能,用法为a=bModExp(c,d),等价于a=b^c mod d;void GetPrime( unsigned bits)获得大素数的函数,用法为a.GetPrime(n),则a获得一个32*bits 位的大素数;void Put(char *str, unsigned int system) 把字符型的转换成10进制或16进制的大数void Get(char* str, unsigned int system)把大数还原成10进制或16进制的字符型变量friend CBigInt operator +(CBigInt&a,CBigInt&b);friend CBigInt operator -(CBigInt&a,CBigInt&b);friend CBigInt operator *(CBigInt&a,CBigInt&b);friend CBigInt operator /(CBigInt&a,CBigInt&b);friend CBigInt operator %(CBigInt&a,CBigInt&b);这些是实现运算符重载的,方便与用户进行大整数的各种运算;class RSA{public:void GetKey(int len,CBigInt &p,CBigInt &q,CBigInt &n,CBigInt &_n,CBigInt &e,CBigInt&d);CBigInt Rsajiami(char* m,int len,CBigInt e,CBigInt n);//加密获得密文void Rsajiemi(CBigInt miwen,CBigInt d,CBigInt n,char *outs);//解密获得明文void Encryption(char* m,int len,CBigInt e,CBigInt n,CBigInt &cipher,RSA rsa);加密void Decryption(CBigInt cipher,CBigInt d,CBigInt n,RSA rsa);解密private:CBigInt p,q,n,_n,e,d;//RSA主要数据};GetKey(int len,CBigInt &p,CBigInt &q,CBigInt &n,CBigInt &_n,CBigInt &e,CBigInt&d)是生成len位的密钥以及p,q,n,_n,的函数Rsajiami(char* m,int len,CBigInt e,CBigInt n)是对明文进行加密,得到二进制密文的操作Rsajiemi(CBigInt miwen,CBigInt d,CBigInt n,char *outs)是对密文进行解密,并把明文转换成char类型的数据Encryption(char* m,int len,CBigInt e,CBigInt n,CBigInt &cipher,RSA rsa)对明文进行加密,并显示所得密文以及加密多用时间Decryption(CBigInt cipher,CBigInt d,CBigInt n,RSA rsa)对密文进行解密,并显示所得明文以及解密时间进行输出五、设计核心代码Cmp(CBigInt& A){if(m_nLength>A.m_nLength)return 1;if(m_nLength<A.m_nLength)return -1;for(int i=m_nLength-1;i>=0;i--){if(m_ulV alue[i]>A.m_ulV alue[i])return 1;if(m_ulV alue[i]<A.m_ulV alue[i])return -1;}return 0;}这个函数实现了大数的比较,如果a的长度小于b,那么a<b,如果a的长度大于b,那么a>b,如果ab的长度相等,那么,我们就从他们的高位开始比较,谁的高位比较大,那么谁就大。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

理工大学课程设计题目:RSA加密算法院、系:计算机科学与技术学院网络工程系班级:学号:姓名:同组成员:指导教师:成绩:2014年06月27日一.系统设计的目标通过运用RSA加密算法,实现对信息的加密和解密,掌握RSA算法的实现原理以及实现过程。

二.系统原理:RSA是在1978年,由美国麻省理工学院(MIT)的Rivest、Shamir和Adleman在题为《获得数字签名和公开钥密码系统的方法》的论文中提出的。

它是一个基于数论的非对称(公开钥)密码体制,是一种分组密码体制。

其名称来自于三个发明者的首字母。

它的安全性是基于大整数素因子分解的困难性,而大整数因子分解问题是数学上的著名难题,至今没有有效的方法予以解决,因此可以确保RSA算法的安全性。

RSA系统是公钥系统的最具有典型意义的方法,大多数使用公钥密码进行加密和数字签名的产品和标准使用的都是RSA算法。

RSA算法是第一个既能用于数据加密也能用于数字签名的算法,因此它为公用网络上信息的加密和鉴别提供了一种基本的方法。

它通常是先生成一对R SA 密钥,其中之一是密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册,人们用公钥加密文件发送给个人,个人就可以用私钥解密接受。

为提高强度,RSA密钥至少为500位长,一般推荐使用1024位。

该算法基于下面的两个事实,这些事实保证了RSA算法的安全有效性:1)已有确定一个数是不是质数的快速算法;2)尚未找到确定一个合数的质因子的快速算法。

目前,日益激增的电子商务和其它因特网应用需求使公钥体系得以普及,这些需求量主要包括对服务器资源的访问控制和对电子商务交易的保护,以及权利保护、个人隐私、无线交易和容完整性(如保证新闻报道或股票行情的真实性)等方面。

公钥技术发展到今天,在市场上明显的发展趋势就是PKI与操作系统的集成,PKI是“Public Key Infrastructure”的缩写,意为“公钥基础设施”。

公钥体制广泛地用于CA认证、数字签名和密钥交换等领域。

公钥加密算法中使用最广的是RSA。

RSA算法研制的最初理念与目标是努力使互联网安全可靠,旨在解决DES算法秘密密钥的利用公开信道传输分发的难题。

而实际结果不但很好地解决了这个难题;还可利用RSA来完成对电文的数字签名以抗对电文的否认与抵赖;同时还可以利用数字签名较容易地发现攻击者对电文的非法篡改,以保护数据信息的完整性。

目前为止,很多种加密技术采用了RSA算法,该算法也已经在互联网的许多方面得以广泛应用,包括在安全接口层(SSL)标准(该标准是网络浏览器建立安全的互联网连接时必须用到的)方面的应用。

此外,RSA加密系统还可应用于智能IC卡和网络安全产品。

RSA算法的编程思路1)确定密钥的宽度。

2)随机选择两个不同的素数p处q,它们的宽度是密钥宽度的二分之一。

3)计算出p和q的乘积n 。

4)在2和Φ(n)之间随机选择一个数e , e 必须和Φ(n)互素,整数e用做加密密钥(其中Φ(n)=(p-1)*(q-1))。

5)从公式ed ≡ 1 mod Φ(n)中求出解密密钥d 。

6)得公钥(e ,n ), 私钥 (d , n) 。

7)公开公钥,但不公开私钥。

8)将明文P (假设P是一个小于n的整数)加密为密文C,计算方法为: C = Pe mod n9) 将密文C解密为明文P,计算方法为: P = Cd mod n 然而只根据n和e(不是p和q)要计算出d是不可能的。

因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密三. 系统功能分析:1.产生密钥首先要使用概率算法来验证随机产生的大的整数是否质数,这样的算法比较快而且可以消除掉大多数非质数。

假如有一个数通过了这个测试的话,那么要使用一个精确的测试来保证它的确是一个质数。

除此之外这样找到的p和q还要满足一定的要求,首先它们不能太靠近,此外p-1或q -1的因子不能太小,否则的话N也可以被很快地分解。

此外寻找质数的算法不能给攻击者任何信息,这些质数是怎样找到的,尤其产生随机数的软件必须非常好。

要随机和不可预测。

这两个要求并不相同。

一个随机过程可能可以产生一个不相关的数的系列,但假如有人能够预测出(或部分地预测出)这个系列的话,那么它就已经不可靠了。

比如有一些非常好的随机数算法,但它们都已经被发表,因此它们不能被使用,因为假如一个攻击者可以猜出p和q一半的位的话,那么他们就已经可以轻而易举地推算出另一半。

此外密钥d必须足够大,1990年有人证明假如p大于q而小于2q(这是一个很经常的情况)而,那么从N和e可以很有效地推算出d。

此外e = 2永远不应该被使用。

和其它加密过程一样,对RSA来说分配公钥的过程是非常重要的。

分配公钥的过程必须能够抵挡一个从中取代的攻击。

假设Eve交给Bob一个公钥,并使Bob相信这是Alice 的公钥,并且她可以截下Alice和Bob之间的信息传递,那么她可以将她自己的公钥传给Bob,Bob以为这是Alice的公钥。

Eve可以将所有Bob传递给Alice的消息截下来,将这个消息用她自己的密钥解密,读这个消息,然后将这个消息再用Alice的公钥加密后传给Alice。

理论上Alice和Bob都不会发现Eve在偷听他们的消息。

今天人们一般用数字认证来防止这样的攻击。

和其它加密过程一样,对RSA来说分配公钥的过程是非常重要的。

分配公钥的过程必须能够抵挡一个从中取代的攻击。

假设Eve交给Bob一个公钥,并使Bob相信这是A lice的公钥,并且她可以截下Alice和Bob之间的信息传递,那么她可以将她自己的公钥传给Bob,Bob以为这是Alice的公钥。

Eve可以将所有Bob传递给Alice的消息截下来,将这个消息用她自己的密钥解密,读这个消息,然后将这个消息再用Alice的公钥加密后传给Alice。

理论上Alice和Bob都不会发现Eve在偷听他们的消息。

今天人们一般用数字认证来防止这样的攻击。

2.加密RSA用到的公式和定理一、数和互为素数任何大于1的整数a能被因式分解为如下唯一形式:a=p1p2…pl(p1,p2,…,pl为素数)二、模运算①{[a(mod n)]×[b(mod n)]}modn≡(a×b)(mod n)②如果(a×b)=(a×c)(mod n),a与n互素,则b=c(mod n)三、费马定理若p是素数,a与p互素,则a^(p-1)≡1 (mod p)四、欧拉定理欧拉函数φ(n)表示不大于n且与n互素的正整数的个数。

当n是素数,φ(n)=n-1。

n=pq,p,q均为素数时,则φ(n)= φ(p)φ(q)=(p-1)(q-1)。

对于互素的a和n,有a^φ(n)≡1(mod n)用程序实现这一原理既是将待加密信息又ASCII码形式进行运算,得到的结果就是密文。

3.解密解密过程和和加密过程算法原理一样,只是运用了不同的密钥解密,既私钥解密,因此实现原理和加密算法一致。

四.系统实现:1.产生密钥通过建立素数数组1到4000的,并通过随机数选取数组里两个元素来实现素数p,q的选择;并根据素数因子计算出公钥和私钥;随机数选取同样通过随机数函数srand()实现,由于计算机性能限制,将随机数值限定为1000以。

rand()函数的使用方法如下:random函数不是ANSI C标准,不能在gcc,vc等编译器下编译通过。

但在C语言中int random(num)可以这样使用,它返回的是0至num-1的一个随机数。

可改用C++下的rand函数来实现。

1、C++标准函数库提供一随机数生成器rand,返回0-RAND_MAX之间均匀分布的伪随机整数。

RAND_MAX必须至少为32767。

rand()函数不接受参数,默认以1为种子(即起始值)。

随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。

(但这样便于程序调试)2、C++中另一函数srand(),可以指定不同的数(无符号整数变元)为种子。

但是如果种子相同,伪随机数列也相同。

一个办法是让用户输入种子,但是仍然不理想。

3、比较理想的是用变化的数,比如时间来作为随机数生成器的种子。

time的值每时每刻都不同。

所以种子不同,所以,产生的随机数也不同。

// C++随机函数(VC program)#include <stdio.h>#include <iostream>#include <time.h>using namespace std;#define MAX 100int main(int argc, char* argv[]){srand( (unsigned)time( NULL ) );//srand()函数产生一个以当前时间开始的随机种子.应该放在for等循环语句前面不然要很长时间等待for (int i=0;i<10;i++)cout<<rand()%MAX<<endl;//MAX为最大值,其随机域为0~MAX-1return 0;}二、rand()的用法rand()不需要参数,它会返回一个从0到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数。

/* maximum value returned by "rand" function*/#define RAND_MAX 0x7fffu这个是bcc55中的定义,说明这个整数的最大数是0x7fffu,u代表unicode编码。

这样,如果你要产生0~10的10个整数,可以表达为:int N = rand() % 11;这样,N的值就是一个0~10的随机数,如果要产生1~10,则是这样:int N = 1 + rand() % 10;总结来说,可以表示为:a + rand() % n其中的a是起始值,n是整数的围。

a + rand() % (b-a+1) 就表示a~b之间的一个随机数若要0~1的小数,则可以先取得0~10的整数,然后均除以10即可得到随机到十分位的10个随机小数,若要得到随机到百分位的随机小数,则需要先得到0~100的10个整数,然后均除以100,其它情况依此类推。

通常rand()产生的随机数在每次运行的时候都是与上一次相同的,这是有意这样设计的,是为了便于程序的调试。

若要产生每次不同的随机数,可以使用srand( seed )函数进行随机化,随着seed的不同,就能够产生不同的随机数。

如大家所说,还可以包含time.h头文件,然后使用srand(time(0))来使用当前时间使随机数发生器随机化,这样就可以保证每两次运行时可以得到不同的随机数序列(只要两次运行的间隔超过1秒)。

相关文档
最新文档