RSA数字签名算法的模拟实现

合集下载

Java实现的数字签名算法RSA完整示例

Java实现的数字签名算法RSA完整示例

Java实现的数字签名算法RSA完整⽰例本⽂实例讲述了Java实现的数字签名算法RSA。

分享给⼤家供⼤家参考,具体如下:⼀背景介绍数字签名:带有密钥(公钥、私钥)的消息摘要算法。

验证数据完整性、认证数据来源、抗否认。

私钥签名、公钥验证。

常⽤算法:RSA、DSA、ECDSA⼆ RSA介绍包括MD和SHA两类三 Java代码实现package com.imooc.security.rsa2;import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.PrivateKey;import java.security.PublicKey;import java.security.Signature;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import mons.codec.binary.Hex;public class ImoocRSA {private static String src = "cakin security rsa";public static void main(String[] args) {jdkRSA();}public static void jdkRSA() {try {//1.初始化密钥KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(512);KeyPair keyPair = keyPairGenerator.generateKeyPair();RSAPublicKey rsaPublicKey = (RSAPublicKey)keyPair.getPublic();RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)keyPair.getPrivate();//2.执⾏签名PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());KeyFactory keyFactory = KeyFactory.getInstance("RSA");PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);Signature signature = Signature.getInstance("MD5withRSA");signature.initSign(privateKey);signature.update(src.getBytes());byte[] result = signature.sign();System.out.println("jdk rsa sign : " + Hex.encodeHexString(result));//3.验证签名X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());keyFactory = KeyFactory.getInstance("RSA");PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);signature = Signature.getInstance("MD5withRSA");signature.initVerify(publicKey);signature.update(src.getBytes());boolean bool = signature.verify(result);System.out.println("jdk rsa verify : " + bool);} catch (Exception e) {e.printStackTrace();}}}四实现效果jdk rsa sign : 64b62967438d05f8f9837a089aaecd3b1379fd8eef89b924632536deb95d94d8389da456014ee953a1ac1befe44612c61b750b48c8574b98a9855a07a724e7e4 jdk rsa verify : true五应⽤场景PS:关于加密解密感兴趣的朋友还可以参考本站在线⼯具:更多关于java相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》和《》希望本⽂所述对⼤家java程序设计有所帮助。

5基于RSA算法的数字签名的实现

5基于RSA算法的数字签名的实现

5 基于RSA算法的数字签名的实现5.1开发环境介绍以其强大的性能,世界级的工具支持,操作简易性,扩展性,安全性等等优点,迅速的风靡全球,随着使用者的越来越多,数字签名的问题就越来越受关注。

C# 是.NET的关键性语言,它整个.NET平台是的基础。

5.1.1 C#语言概述在过去的20年里,C和C++已经成为在商业软件的开发领域中使用最广泛的语言。

他们为程序员提供了十分灵活的操作,不过同时也牺牲了一定的效率。

与诸如Microsoft V isual Basic等语言相比,同等级别的C/C++应用程序往往需要更长时间来开发。

由于C/C++语言的复杂性,许多程序员都试图寻找一种新的语言,希望能在功能与效率之间找到一个更为理想的平衡点。

对于C/C++用户来说,最理想的解决方案无疑是在快速开发的同时又可以调用底层平台的所有功能。

他们想要一种和最新的网络标准保持同步并且能和已有的应用程序良好整合的环境。

另外,一些C/C++开发人员还需要在必要的时候进行一些底层的编程。

C#是微软对这一问题的解决方案。

C#是一种最新的,面向对象的编程语言,他使得程序员可以快速地编写各种基于平台的应用程序。

提供了一系列的工具和服务来最大程度地开发利用计算与通信领域。

正是由于C#面向对象的卓越设计,使他成为构建各类组件的理想之选,无论是高级的商业对象还是系统级的应用程序,使用简单的C#语言结构,这些组件可以方便地转化为XML 网络服务,从而使它们可以由任何语言在任何操作系统上通过Internet进行调用。

最重要的是,C#使得C++程序员可以高效地开发程序,而绝不损失C/C++原有的强大功能。

因为这种继承关系,C#与C/C++具有极大的相似性,熟悉类似语言的开发者可以很快地转向C#。

5.1.2C#语言的特点C#语言自C/C++演变而来,它是给那些愿意牺牲C++一点底层功能,以获得更方便和更产品化的企业开发人员而创造的。

C#主要特点:简洁、与Web紧密结合、完全面向对象、强壮安全、灵活性和兼容性。

RSA数字签名

RSA数字签名

密码学与信息安全技术实验报告实验名称:RSA算法数字签名实验编号:实验七实验内容描述:通过实验实例了解RSA算法数字签名。

实验设计与实现:1、RSA数字签名体制:RSA算法中数字签名技术实际上是通过一个Hash函数来实现的。

数字签名的特点是它代表了文件的特征,文件如果发生改变,数字签名的值也将发生变化。

不同的文件将得到不同的数字签名。

一个最简单的Hash函数是把文件的二进制码相累加,取最后的若干位。

Hash函数对发送数据的双方都是公开的。

只有加入数字签名及验证才能真正实现在公开网络上的安全传输。

加入数字签名和验证的文件传输过程如下: (1) 发送方首先用Hash函数从原文得到数字签名,然后采用公开密钥体系用发达方的私有密钥对数字签名进行加密,并把加密后的数字签名附加在要发送的原文后面; (2) 发送一方选择一个秘密密钥对文件进行加密,并把加密后的文件通过网络传输到接收方; (3) 发送方用接收方的公开密钥对密秘密钥进行加密,并通过网络把加密后的秘密密钥传输到接收方; (4) 接受方使用自己的私有密钥对密钥信息进行解密,得到秘密密钥的明文; (5) 接收方用秘密密钥对文件进行解密,得到经过加密的数字签名; (6) 接收方用发送方的公开密钥对数字签名进行解密,得到数字签名的明文; (7) 接收方用得到的明文和Hash函数重新计算数字签名,并与解密后的数字签名进行对比。

如果两个数字签名是相同的,说明文件在传输过程中没有被破坏。

如果第三方冒充发送方发出了一个文件,因为接收方在对数字签名进行解密时使用的是发送方的公开密钥,只要第三方不知道发送方的私有密钥,解密出来的数字签名和经过计算的数字签名必然是不相同的。

这就提供了一个安全的确认发送方身份的方法。

2、RSA数字签名体制的基本算法表述:(1)体制参数 假设用户甲使用如下的参数: 大合数n=p1*p2,其中p1和p2是大素数; 用户甲将公开模数n和公钥e,而将p1,p2与私钥d严格保密。

RSA算法的应用与实现

RSA算法的应用与实现

1RSA简述随着IT技术迅猛的发展,各个行业的信息化、网络化的增强,信息的安全性越来越得到人们的重视。

一个完整的、先进的信息系统无不考虑到信息安全技术的应用。

RSA加密体制是一种公开的密码体制。

RSA公匙密码体制是又R.L.Rivest,A.Shamir和L.Adelman于1978年提出的。

RSA算法完善,既可用于加密,又可用于签名,并为用户的公开密钥签发公钥证书、发放证书、管理证书等提高了服务质量,RSA公钥密码体制在世界许多地方已经成为事实上的标准。

RSA是一个基于数论的非对称密码体制,是一种分组密码体制,是一种基于因子分解的指数函数作为单向陷门函数的公钥体制算法。

它基础是数论的欧拉定理,素数检测,它的安全性是基于大数分解,后者在数学上是一个困难问题。

2RSA算法2.1RSA算法描述RSA的安全性基于复杂性理论中的计算安全性,依赖于大整数分解这一NP难题。

可靠性与所用密钥的长度有很大关系,假如有人找到一种很快的分解因子的算法,即从一个公钥中通过因数分解得到私钥,那么用RSA加密的信息的可靠性肯定会极度下降。

但由于其工作量巨大,按目前计算机的处理能力是不可能实现的。

实践证明,在当前的技术和方法下,密钥不小于1024bit的RSA算法仍然是安全的。

这充分说明RSA系统具有良好的保密性能。

因此,尽管先后出现了很多新的公钥体制算法,但RSA仍然在不同应用领域占据了重要的位置。

随着计算机运算速度的提高以及因子分解算法的突破,RSA的密钥长度将越来越大,其软硬件实现速度将成为制约其使用的重要因素。

RSA系统由以下几部分组成[1]:1)随机选取的在素数P和Q,还有N,其中N=P*Q,P和Q保密, N公开。

2)任取Φ(n)=(P-1)*(Q-1),其中(n)表示比n小的素数的个数,任取2<=e<=(n),且(e,(n))=1,e为加密密钥,公开。

3)计算d,使e*d=1(mod(n)),称d为e对模(n)的逆,其中d为解密秘钥,保密。

RSA算法和实现及实例

RSA算法和实现及实例

<一>基础RSA算法非常简单,概述如下:找两素数p和q取n=p*q取t=(p-1)*(q-1)取任何一个数e,要求满足e<t并且e与t互素(就是最大公因数为1)取d*e%t==1这样最终得到三个数:n d e设消息为数M (M <n)设c=(M**d)%n就得到了加密后的消息c设m=(c**e)%n则m == M,从而完成对c的解密。

注:**表示次方,上面两式中的d和e可以互换。

在对称加密中:n d两个数构成公钥,可以告诉别人;n e两个数构成私钥,e自己保留,不让任何人知道。

给别人发送的信息使用e加密,只要别人能用d解开就证明信息是由你发送的,构成了签名机制。

别人给你发送信息时使用d加密,这样只有拥有e的你能够对其解密。

rsa的安全性在于对于一个大数n,没有有效的方法能够将其分解从而在已知n d的情况下无法获得e;同样在已知n e的情况下无法求得d。

或者说,rsa的安全性在于对于一个大数n,没有有效的办法将其分解成p和q。

<二>实践接下来我们来一个实践,看看实际的操作:找两个素数:p=47q=59这样n=p*q=2773t=(p-1)*(q-1)=2668取e=63,满足e<t并且e和t互素用perl简单穷举可以获得满主e*d%t ==1的数d:C:\Temp>perl -e "foreach $i (1..9999){ print($i),last if $i*63%2668==1 }"847即d=847最终我们获得关键的n=2773d=847e=63取消息M=244我们看看加密:c=M**d%n = 244**847%2773用perl的大数计算来算一下:C:\Temp>perl -Mbigint -e "print 244**847%2773"465即用d对M加密后获得加密信息c=465解密:我们可以用e来对加密后的c进行解密,还原M:m=c**e%n=465**63%2773 :C:\Temp>perl -Mbigint -e "print 465**63%2773"244即用e对c解密后获得m=244 , 该值和原始信息M相等。

RSA算法分析与编程实现

RSA算法分析与编程实现

实验二 RSA算法实验目的:1.深入了解RSA加密算法的加密原理2.通过编程模拟RSA算法的加密过程实验内容:一. RSA概述①RSA加密算法是一种最常用的非对称加密算法,CFCA在证书服务中离不了它。

在公钥加密标准和电子商业中,RSA被广泛使用。

②公钥和私钥1. 随意选择两个大的质数p和q,p不等于q,计算N=pq。

2. 根据欧拉函数,不大于N且与N互质的整数个数为(p-1)(q-1)3. 选择一个整数e与(p-1)(q-1)互质,并且e小于(p-1)(q-1)4. 用以下这个公式计算d:d× e≡ 1 (mod (p-1)(q-1))5. 将p和q的记录销毁。

(N,e)是公钥,(N,d)是私钥。

(N,d)是秘密的。

Alice将她的公钥(N,e)传给Bob,而将她的私钥(N,d)藏起来。

二.RSA算法的编程实现#include<iostream>#include<cmath>using namespace std;void main(){int p,q;//定义存放两个质数的变量cout<<"请输入两个较大的素数:"<<endl;cin>>p>>q;cout<<"p="<<p<<",q="<<q<<endl;int n,o;n=p*q;o=(p-1)*(q-1);cout<<"n="<<n<<",o="<<o<<endl;cout<<"请从【0,"<<o-1<<"】中选择一个与"<<o<<"互素的数e:"<<endl;int e,i;float d;cin>>e;//输入e值for(i=1;;i++)//计算d值{d=(float)(o*i+1)/e;if(d-(int)d==0)break;}cout<<"e="<<e<<",d="<<d<<endl;cout<<"公开密钥Pk={e,n}={"<<e<<","<<n<<"}"<<endl;//输出公开密钥cout<<"秘密密钥Sk={d,n}={"<<d<<","<<n<<"}"<<endl; //输出私密密钥cout<<endl;cout<<"请输入要加密的正整数(以-1结束):"<<endl;int m1[500],m3[500],m4[500];double m2[500];int j;for(j=0;j<500;j++)//对明文进行加密{cin>>m1[j];if(m1[j]==-1)break;m2[j]=pow(m1[j],e);m4[j]=m2[j]/n;m3[j]=m2[j]-m4[j]*n;}cout<<"密文为:"<<endl;int k;for(k=0;k<j;k++)//输出密文cout<<m3[k]<<" ";cout<<endl;}三.实例描述在以下实例中只选取小数值的素数p,q,以及e,假设用户A需要将明文“key”通过RSA加密后传递给用户B,过程如下:(1)设计公私密钥(e,n)和(d,n)。

电子商务中常用的RSA算法实现

电子商务中常用的RSA算法实现

电子商务中常用的RSA算法实现简介RSA算法是一种非对称加密算法,广泛应用于电子商务中的数据加密和数字签名。

RSA算法的原理基于数论中的大数分解问题,它依赖于两个大质数的秘密,在安全性上非常可靠。

RSA算法包括三个主要步骤:密钥生成、加密和解密。

本文将介绍RSA算法的实现步骤和相关概念,以及在电子商务中常见的应用场景。

密钥生成在RSA算法中,密钥生成是算法的第一步。

密钥生成包括以下几个步骤:1.选择两个大质数p和q,计算它们的乘积N:N = p * q。

2.计算Euler函数φ(N):φ(N) = (p - 1) * (q - 1)。

3.选择一个整数e,1 < e < φ(N),且e与φ(N)互质。

4.计算e的乘法逆元d,使得(e * d) mod φ(N) = 1。

经过以上步骤,我们就可以得到公钥( N, e )和私钥( N, d )。

加密在RSA算法中,加密是算法的第二步。

加密操作使用公钥进行。

加密的过程如下:1.将明文信息转换为整数m,其中 m < N。

2.计算密文c = (m ^ e) mod N。

通过以上步骤,我们可以得到加密后的密文c。

解密在RSA算法中,解密是算法的第三步。

解密操作使用私钥进行。

解密的过程如下:1.将密文c转换为整数m。

2.计算明文信息m = (c ^ d) mod N。

通过以上步骤,我们可以得到解密后的明文m。

RSA算法的安全性RSA算法的安全性主要依赖于大数分解问题的困难程度。

目前,没有有效的算法可以快速分解大数。

然而,RSA算法的安全性仍然受到一些攻击的威胁,例如:穷举搜索攻击、选择明文攻击、选择密文攻击等。

为了提高RSA算法的安全性,通常会采取以下措施:1.使用足够长的密钥,一般建议使用2048位或以上的密钥长度。

2.在生成密钥对时,应使用随机数生成器生成大质数p和q。

RSA算法在电子商务中的应用RSA算法在电子商务中有很多应用场景,主要包括数据加密和数字签名。

RSA加密算法及实现

RSA加密算法及实现

RSA加密算法及实现RSA 是一种非对称加密算法,由Rivest、Shamir 和Adleman 三位数学家于1977年提出,现在广泛应用于电子邮件加密、数字签名和安全传输等领域。

RSA 算法基于两个大素数的乘积难以分解的特性,实现了安全的加密和解密过程。

RSA算法的核心原理是利用数论中的欧拉函数、模逆和模幂运算。

下面将详细介绍RSA算法的加密和解密流程。

1.生成密钥对首先选择两个不同的大素数p和q,计算它们的乘积n=p*q。

然后计算欧拉函数φ(n)=(p-1)*(q-1)。

选择一个与φ(n)互质的整数e,作为公钥的指数。

再利用模逆运算求解整数d,使得(d*e)%φ(n)=1,d即为私钥的指数。

2.加密过程假设要加密的消息(明文)为m,公钥为(n,e)。

将明文转换成整数M,并满足0≤M<n。

加密过程即为计算密文C=M^e%n,然后将密文发送给接收者。

3.解密过程接收者使用私钥(n,d)进行解密。

将密文C转换成整数,并计算明文M=C^d%n。

最后将整数M转换成消息,并得到解密后的明文。

RSA算法的安全性基于分解大整数n的困难性,如果有人能够有效地分解n,并得到p和q,那么整个算法的安全性将被破坏。

目前,分解大整数依然是一个非常耗费计算资源的问题,因此RSA算法在理论上是安全的。

实现 RSA 加密算法需要涉及大数运算和模幂运算等复杂的数学运算。

下面是一个简化版的 RSA 加密算法的 Python 代码实现:```pythonimport random#扩展欧几里得算法求解模逆def extended_gcd(a, b):if b == 0:return a, 1, 0gcd, x, y = extended_gcd(b, a % b)return gcd, y, x - (a // b) * y#计算模幂运算def mod_exp(a, b, n):result = 1while b > 0:if b % 2 == 1:result = (result * a) % na=(a*a)%nb//=2return result#生成密钥对def generate_keys(:p = random.randint(100, 1000)q = random.randint(100, 1000)while p == q or not is_prime(p) or not is_prime(q): p = random.randint(100, 1000)q = random.randint(100, 1000)n=p*qphi = (p - 1) * (q - 1)e = random.randint(2, phi - 1)gcd, d, _ = extended_gcd(e, phi)#确保d为正数if d < 0:d += phireturn (n, e), (n, d)#加密过程def encrypt(message, public_key):n, e = public_keym = int.from_bytes(message.encode(, 'big')c = mod_exp(m, e, n)return c#解密过程def decrypt(ciphertext, private_key):n, d = private_keym = mod_exp(ciphertext, d, n)message = m.to_bytes((m.bit_length( + 7) // 8, 'big').decode return message#判断一个数是否为素数def is_prime(n):if n <= 1:return Falsefor i in range(2, int(n ** 0.5) + 1):if n % i == 0:return Falsereturn True#示例运行代码if __name__ == '__main__':public_key, private_key = generate_keysmessage = "Hello, RSA!"ciphertext = encrypt(message, public_key)plaintext = decrypt(ciphertext, private_key)print("Public key:", public_key)print("Private key:", private_key)print("Ciphertext:", ciphertext)print("Decrypted plaintext:", plaintext)```以上代码是一个简单的实现,仅用于理解RSA加密算法的基本原理。

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

RSA数字签名算法的模拟实现摘要本程序为简易版RSA算法加密解密过程的模拟实现。

程序分为加密和验证两部分。

根据课上所学的MD5加密过程,以及RSA算法,本程序采用MD5算法,先对文件内容进行加密,得到文字摘要;再利用RSA算法的私钥,对文字摘要进行加密,得到数字签名。

在验证部分,用RSA公钥对数字证书签名解密,得到文字摘要S1,再将需要验证的文档用公用的MD5算法处理,得到文字摘要S2,检验文字摘要S1与S2的一致性,从而断定原文是否被篡改。

程序采用树形图对文件进行直观的显示管理。

采用文本文档存储数字签名。

关键词:RSA MD5 文字摘要数字签名AbstractThis program is simple version of the RSA algorithm encryption and decryption process simulation.The procedures are divided into two parts, encryption and authentication. Lessons learned based on the MD5 encryption process, as well as RSA algorithm, the procedures used MD5 algorithm, first pairs contents of the file carry on encrypt, to obtain text abstract; re-use RSA algorithm's private key, encryption for text abstract, obtain the digital signature. In the verification part, with the RSA algorithm's public key pairs of digital certificate signature decryption, get text abstract S1, and then using a public MD5 algorithm encryption the document which need to be verify, to obtain text abstract S2, text the consistency of S1 and S2, thereby conclude that original text whether the been tampered with. Program uses the file tree intuitively display management the files. Adopt text document storage digital signatures.Key words:RSA MD5 Text abstract Digital signature目录一引言 (1)1.1理论背景 (1)1.2教学目的 (1)1.3任务和要求 (1)1.4意义 (1)1.5论文结构安排 (1)二问题分析 (2)2.1程序要求 (2)2.2实验原理 (2)2.2.1 MD5 (2)2.2.2 RSA算法 (2)三实验设计 (3)3.1设计流程图 (3)3.2关键问题及算法设计 (3)3.2.1素数判定 (3)3.2.2互质的判断 (3)3.2.3乘法逆元求解 (4)3.2.4快速幂模算法 (4)3.2.5文字摘要生成 (5)3.2.6文字摘要加密 (5)3.3数据处理 (6)3.3.1树形图显示 (6)3.3.2文件存取 (6)四实验实现 (7)4.1整体界面如下设计: (7)4.2文件操作 (8)4.3加密区 (8)五结束语 (15)六源代码 (16)一引言1.1理论背景RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和Leonard Adleman 开发的,是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有的密码攻击,已被ISO推荐为公钥数据加密标准。

RSA是第一个能同时用于加密和数字签名的算法,采用公开密钥密码体制,即使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。

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

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

1.2教学目的通过模拟RSA数字签名算法,了解RSA数字签名体制原理,掌握一般数字签名算法的工作过程。

1.3任务和要求1、实现RSA算法的参数选择;2、用MD5算法得到给定电子文档的信息摘要;3、将信息摘要变换为大整数形式,并在其上使用RSA数字签名体制进行签名,得到电子文档的数字签名;4、给定电子文档及其数字签名,判断电子文档的完整性和真实性。

1.4意义通过模拟RSA数字签名算法,了解RSA算法的加密解密原理和过程,提升学生分析实际问题的能力以及动手能力,为今后在相关领域开展工作打下基础。

1.5论文结构安排第一章、引言,说明课程设计理论背景、目的、要求和意义以及论文结构安排。

第二章、问题分析,写出程序要求和主要算法原理。

第三章、实验设计,包括流程图和各个功能的原理和代码实现。

第四章、实验实现和成员分工,结合截图说明各个部件的功能以及小组成员分工。

第五章、结束语,总结课程设计的体会。

二问题分析2.1程序要求模拟实现RSA数字签名的加密、解密和验证过程。

2.2实验原理2.2.1 MD5MD5即Message-Digest Algorithm 5(信息摘要算法5),用于确保信息传输完整一致。

是计算机广泛使用的杂凑算法之一,又译摘要算法、哈希算法。

将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理。

MD5在本程序中起到的作用是让大容量信息在用数字签名签署私人密钥前,被“压缩”成一种保密的格式,就是把一个任意长度的字节串变换成一定长的十六进制数字串。

MD5以512位分组处理输入的信息,且每一分组又被划分为16个32为子分组,经过一系列的处理后,算法的输入由32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

此处我们称这个128位的散列值为文件摘要。

对于原始文件的大量信息进行整合,所得到文件摘要与原文保持一致性,且具有唯一性,为证明文件是否在传输过程中被篡改,提供了可靠的证据。

2.2.2 RSA算法RSA的算法涉及三个参数,n、e1、e2。

其中,n是两个大素数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。

e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。

(n,e1)(n,e2)就是密钥对。

其中(n,e1)为公钥,(n,e2)为私钥。

RSA加密与解密的算法完全相同,设A为明文,B为密文,则:A=B^e2 mod n;B=A^e1 mod n。

e1和e2可以互相使用,即:A=B^e1 mod n;B=A^e2 mod n。

本程序,主要是利用RSA算法的原理进行的操作,对于过程有个细致的操作。

三实验设计3.1设计流程图对于简单RSA模拟程序设计,现设计好RSA算法中的密钥,根据自设的P、Q值算出私钥,组合好后期所需要的公钥与私钥。

选择要加密的文本,对其用公钥加密,等到数字签名,并加以保存。

验证过程将原文进行MD5算法加密,得到文字摘要a;对于保存的数字签名,用保存的私钥进行解密,等到文字摘要b,将两个文字摘要进行比较,验证一致性。

如下图:3.2关键问题及算法设计3.2.1素数判定在本程序中,对于素数判定很重要,素数P、Q的输入需要验证,在这里设计一个函数sushu (),利用循环找其可能存在的因数,判断是否为素数。

int sushu(long m){int i;for(i=2;i*i<=m;i++)if(m%i==0)return 0;return 1;}3.2.2互质的判断因为存在e1与(p-1)*(q-1)互质,所以判定互质也是必要的问题。

设计函数bool gcb(a,b),利用辗转相处法判定。

int gcd(long a, long b){if(b == 0)return a;return gcd(b, a % b);}3.2.3乘法逆元求解因为需要计算私钥d= e ˆ-1(modψ(n)),所以有函数long ExtendedEuclid()计算d并返回d的值,这里用到扩展欧几里德算法。

大体思路与欧几里德算法一致:如果gcd(a,b)=d,则存在m,n,使得d = ma + nb,称呼这种关系为a、b 组合整数d,m,n称为组合系数。

当d=1时,有ma + nb = 1 ,此时可以看出m 是a模b的乘法逆元,n是b模a的乘法逆元。

long ExtendedEuclid(long f,long d ,long *result){int x1,x2,x3,y1,y2,y3,t1,t2,t3,q;x1 = y2 = 1;x2 = y1 = 0;x3 = ( f>=d )?f:d;y3 = ( f>=d )?d:f;while( 1 ){if ( y3 == 0 ) { *result = x3; return 0; }if ( y3 == 1 ) { *result = y2; return 1; }q = x3/y3; t1 = x1 - q*y1; t2 = x2 - q*y2; t3 = x3 - q*y3;x1 = y1; x2 = y2; x3 = y3; y1 = t1; y2 = t2; y3 = t3;}}3.2.4快速幂模算法在加密解密时都要用到类似A ˆB(mod C)的计算,当指数B较大时,如果先计算A ˆB的值时间较慢,且结果过大会溢出。

依据模运算的性质(a*b)mod n=((a mod n)*(b mod n))mod n 可以将A ˆB分解为较小几个数的乘积分别进行模运算,利用将指数分解成二进制,根据其分解的过程,逆推将原来的算式分解成较小的数相互叠乘的形式,最后用迭代法计算。

例如(3 ^ 999)可以分解为(3 ^ 512) * (3 ^ 256) * (3 ^ 128) * (3 ^ 64) * (3 ^ 32) * (3 ^ 4) * (3 ^ 2) * 3 这样只要做16次乘法。

相关文档
最新文档