rsa加解密实验报告
实验一 RSA加解密

实验一密码学相关实验之RSA加解密算法的实现一、实验目的在本实验中,用VC/ C/C++/Java实现RSA的加解密算法。
完成实验后将能够深入理解RSA 加解密算法及其在VC/ C/C++/Java中的实现过程。
二、实验条件熟悉VC/ C/C++/Java开发环境和有关RSA算法的有关知识;一台安装有VC/ C/C++/Java的计算机。
三、实验内容RSA算法实验1、生成密钥参数①选取两互异大素数:p和q②计算 N=p×q 和φ(N)=(p-1) ·(q-1)③选一整数 e:满足1< e<φ(N), gcd(φ(N), e)=1④在模φ(N)下,计算e的乘法逆元d:e · d = 1 mod φ(N)⑤E、公钥pk=(N, e),私钥sk=d (p, q不再需要,可以销毁)2、加密算法给定一个整数 M < N,计算C = M e mod N3、解密算法M = C d mod N四、实验要求提示1. 从键盘输入两个素数 p,q,并输出参数 N, φ(N), e, d2.从键盘输入明文数据 m,计算出密文数据 c3. 从键盘输入密文数据 c,计算出明文数据 m.4.如何判断一个数是素数5.如何判断两个数互素6.乘法逆元怎么实现7.当p=7,q=17,e=5,d=77 ,加密m=19. 实验得出结果。
8.如果加密的消息为char类型,如何实现加解密?(不强制要求做,但能实现的同学有加分!!)9.认真填写实验报告,电子版,下次课上交。
以下以VC为例:1.实验环境的建立主要内容:在VC中建立一个项目。
操作步骤:(1)进入VC环境;(2)在VC环境中,执行“File | New”命令,在“New”对话框中(如图1)选择“Projects”页,在其左侧的列表框中选择“MFC AppWizard [exe]”,在右侧的“Project name”文本框中输入新的项目名称“RSA加解密算法”,在“Location”文本框中选择项目的存储路径(比如选择“d:\rsa”)。
现代密码算法实验报告(3篇)

第1篇一、实验目的1. 了解现代密码学的基本原理和数论基础知识;2. 掌握非对称密码体制的著名代表RSA加密算法的工作原理和流程;3. 设计实现一个简单的密钥系统;4. 掌握常用加密算法AES和DES的原理及实现。
二、实验内容1. RSA加密算法实验2. AES加密算法实验3. DES加密算法实验三、实验原理1. RSA加密算法RSA算法是一种非对称加密算法,由罗纳德·李维斯特、阿迪·沙米尔和伦纳德·阿德曼三位密码学家于1977年提出。
其基本原理是选择两个大质数p和q,计算它们的乘积n=pq,并计算欧拉函数φ(n)=(p-1)(q-1)。
选择一个整数e,满足1<e<φ(n)且e与φ(n)互质。
计算e关于φ(n)的模逆元d。
公开密钥为(e,n),私有密钥为(d,n)。
加密过程为C=Me mod n,解密过程为M=Cd mod n。
2. AES加密算法AES(Advanced Encryption Standard)是一种分组加密算法,采用128位分组大小和128、192或256位密钥长度。
AES算法主要分为四个阶段:初始轮、密钥扩展、中间轮和最终轮。
每个轮包括字节替换、行移位、列混淆和轮密钥加。
3. DES加密算法DES(Data Encryption Standard)是一种分组加密算法,采用64位分组大小和56位密钥长度。
DES算法主要分为16轮,每轮包括置换、置换-置换、S盒替换和密钥加。
四、实验步骤及内容1. RSA加密算法实验(1)选择两个大质数p和q,计算n=pq和φ(n)=(p-1)(q-1);(2)选择一个整数e,满足1<e<φ(n)且e与φ(n)互质,计算e关于φ(n)的模逆元d;(3)生成公开密钥(e,n)和私有密钥(d,n);(4)用公钥对明文进行加密,用私钥对密文进行解密。
2. AES加密算法实验(1)选择一个128、192或256位密钥;(2)初始化初始轮密钥;(3)进行16轮加密操作,包括字节替换、行移位、列混淆和轮密钥加;(4)输出加密后的密文。
rsa算法实验报告

rsa算法实验报告RSA算法实验报告摘要:RSA算法是一种非对称加密算法,被广泛应用于网络安全领域。
本实验通过对RSA算法的原理和实现进行了深入研究,并通过编写代码实现了RSA算法的加密和解密过程。
实验结果表明,RSA算法具有较高的安全性和可靠性,能够有效保护数据的机密性和完整性。
一、引言RSA算法是一种基于大数因子分解的非对称加密算法,由Rivest、Shamir和Adleman三位数学家于1977年提出。
它的安全性基于两个大素数的乘积难以分解,因此被广泛应用于数字签名、数据加密等领域。
本实验旨在通过对RSA 算法的原理和实现进行研究,深入了解其加密和解密过程,并通过编写代码实现RSA算法的加密和解密过程。
二、RSA算法原理RSA算法的原理主要包括密钥生成、加密和解密三个过程。
首先,选择两个大素数p和q,并计算它们的乘积n=p*q,然后计算欧拉函数φ(n)=(p-1)*(q-1)。
接下来选择一个整数e,使得1<e<φ(n),且e与φ(n)互质,即e和φ(n)的最大公约数为1。
然后计算e的乘法逆元d,使得(e*d) mod φ(n) = 1。
最后,公钥为(n, e),私钥为(n, d)。
加密过程中,将明文m通过公钥加密为密文c,即c=m^e mod n;解密过程中,将密文c通过私钥解密为明文m,即m=c^d mod n。
三、实验设计本实验使用Python语言编写了RSA算法的加密和解密代码,通过输入明文和密钥,实现了对明文的加密和解密过程。
具体实验步骤如下:1. 选择两个大素数p和q,并计算n=p*q,以及φ(n)=(p-1)*(q-1);2. 选择一个整数e,使得1<e<φ(n),且e与φ(n)互质;3. 计算e的乘法逆元d,使得(e*d) mod φ(n) = 1;4. 将明文m通过公钥加密为密文c,即c=m^e mod n;5. 将密文c通过私钥解密为明文m,即m=c^d mod n。
加解密实验报告

一、实验模块1. 实验名称:加解密实验2. 实验目的:掌握基本的加密和解密方法,理解加密算法的工作原理,并能够使用C语言实现加解密功能。
3. 实验环境:Windows操作系统,C语言编译器(如Visual Studio)二、实验标题加解密实验:基于RSA算法和DES算法的加密与解密三、实验内容概述本次实验主要涉及两种加密算法:RSA算法和DES算法。
通过学习这两种算法的原理,使用C语言实现加解密功能,并验证加密和解密过程是否正确。
四、实验日期、实验操作者实验日期:2023年10月15日实验操作者:张三五、实验目的1. 理解RSA算法和DES算法的原理。
2. 使用C语言实现RSA算法和DES算法的加解密功能。
3. 验证加密和解密过程是否正确。
六、实验步骤1. RSA算法原理及实现(1)生成密钥对:使用C语言实现RSA算法的密钥生成过程,生成公钥和私钥。
(2)加密过程:使用公钥对明文进行加密,得到密文。
(3)解密过程:使用私钥对密文进行解密,得到明文。
2. DES算法原理及实现(1)密钥生成:生成DES算法的密钥,通常为56位。
(2)加密过程:使用DES算法对明文进行加密,得到密文。
(3)解密过程:使用DES算法对密文进行解密,得到明文。
3. 验证加密和解密过程(1)选择一段明文,分别使用RSA算法和DES算法进行加密,记录密文。
(2)使用相应的私钥或密钥对密文进行解密,得到明文。
(3)比较加密后的密文和解密后的明文,验证加密和解密过程是否正确。
七、实验环境1. 操作系统:Windows 102. 编译器:Visual Studio 20193. 编程语言:C语言八、实验过程1. RSA算法实验(1)生成密钥对```c#include <stdio.h>#include <stdlib.h>// RSA算法生成密钥对void generateKeys(int n, int e, int d, int p, int q) {// 初始化公钥和私钥p = 61;q = 53;n = p q;e = 17;// 计算私钥d = 2753;}int main() {int p, q, n, e, d;generateKeys(&p, &e, &d, &q, &n);printf("Public Key: (%d, %d)\n", n, e); printf("Private Key: (%d, %d)\n", n, d); return 0;}```(2)加密过程```c#include <stdio.h>#include <math.h>// RSA算法加密int encrypt(int m, int n, int e) {int c = pow(m, e) % n;return c;}int main() {int m, n, e, c;printf("Enter the message: ");scanf("%d", &m);printf("Public Key: (%d, %d)\n", n, e);c = encrypt(m, n, e);printf("Encrypted Message: %d\n", c);return 0;}```(3)解密过程```c// RSA算法解密int decrypt(int c, int n, int d) {int m = pow(c, d) % n;return m;}int main() {int c, n, d, m;printf("Enter the encrypted message: "); scanf("%d", &c);printf("Private Key: (%d, %d)\n", n, d); m = decrypt(c, n, d);printf("Decrypted Message: %d\n", m);return 0;}```2. DES算法实验(1)密钥生成```c#include <stdio.h>// DES算法密钥生成void generateDESKey(char key, char desKey) {// 将密钥转换为DES密钥for (int i = 0; i < 56; i++) {desKey[i] = key[i / 8] & (1 << (7 - (i % 8))); }}int main() {char key[8];char desKey[56];printf("Enter the DES key: ");scanf("%s", key);generateDESKey(key, desKey);printf("DES Key: ");for (int i = 0; i < 56; i++) {printf("%02x", desKey[i]);}printf("\n");return 0;}```(2)加密过程```c#include <stdio.h>// DES算法加密void encryptDES(char input, char key, char output) { // 使用DES算法对输入数据进行加密// 此处省略加密算法的具体实现}int main() {char input[64];char key[8];char output[64];printf("Enter the message: ");scanf("%s", input);printf("DES Key: ");scanf("%s", key);encryptDES(input, key, output);printf("Encrypted Message: %s\n", output);return 0;}```(3)解密过程```c#include <stdio.h>// DES算法解密void decryptDES(char input, char key, char output) { // 使用DES算法对输入数据进行解密// 此处省略解密算法的具体实现}int main() {char input[64];char key[8];char output[64];printf("Enter the encrypted message: ");scanf("%s", input);printf("DES Key: ");scanf("%s", key);decryptDES(input, key, output);printf("Decrypted Message: %s\n", output);return 0;}```3. 验证加密和解密过程(1)RSA算法验证```c#include <stdio.h>#include <math.h>// RSA算法加密int encrypt(int m, int n, int e) {int c = pow(m, e) % n;return c;}// RSA算法解密int decrypt(int c, int n, int d) {int m = pow(c, d) % n;return m;}int main() {int m, n, e, d, c, m2;printf("Enter the message: ");scanf("%d", &m);printf("Public Key: (%d, %d)\n", n, e);c = encrypt(m, n, e);printf("Encrypted Message: %d\n", c);printf("Enter the Private Key: (%d, %d)\n", n, d); m2 = decrypt(c, n, d);printf("Decrypted Message: %d\n", m2);if (m == m2) {printf("Encryption and Decryption are successful!\n"); } else {printf("Encryption and Decryption failed!\n");}return 0;}```(2)DES算法验证```c#include <stdio.h>// DES算法加密void encryptDES(char input, char key, char output) {// 使用DES算法对输入数据进行加密// 此处省略加密算法的具体实现}// DES算法解密void decryptDES(char input, char key, char output) {// 使用DES算法对输入数据进行解密// 此处省略解密算法的具体实现}int main() {char input[64];char key[8];char output[64];printf("Enter the message: ");scanf("%s", input);printf("DES Key: ");scanf("%s", key);encryptDES(input, key, output);printf("Encrypted Message: %s\n", output);decryptDES(output, key, input);printf("Decrypted Message: %s\n", input);if (strcmp(input, "Hello") == 0) {printf("Encryption and Decryption are successful!\n");} else {printf("Encryption and Decryption failed!\n");}return 0;}```九、实验结论通过本次实验,我们掌握了RSA算法和DES算法的原理,并使用C语言实现了加解密功能。
实验二 RSA加密解密

实验二 RSA加密解密实验目的1.了解RSA算法的基本原理2.掌握RSA算法的实现方法3.通过实际编程了解非对称密码算法RSA的加密和解密过程,同时锻炼编程能力。
实验原理RSA算法的加密和解密过程在RSA算法中,每个实体有自己的公钥(e,n)及私钥(d,n),其中n=p*q,p,q是两个大素数,e*d=1modф(n),显然e应该满足gcd(e,ф(n))=1。
实体B加密消息m,将密文在公开信道上传送给实体A。
实体A接到密文后对其解密。
具体算法如下。
1)公钥的生成算法RSA的公钥生成算法十分简单,可以分为四步:(1)选择两个素数,p和q;(2)计算n=p×q和o=(p-1)×(q-1);(3)选择一个与o互质的数e;(4)找出一个d,使得e×d=1modz。
公开密钥是由(e,n)构成,私有密钥由(d,n)构成。
2)加密算法实体B的操作如下:(1)得到实体A的真实公钥(e,n);(2)把消息表示成整数m,0<m≤n-1;(3)使用平方-乘积算法,计算C=Ek(m)=memodn;(4)将密文C发送给实体A。
核心代码#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;for(i=1;;i++){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[7500];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;}实验总结与心得体会通过做这个实验充分了解其原理,在这个实验中,这个实验中公钥和私钥的产生没什么问题,而在加密与解密的过程中,由于中间结果会非常大,pow函数不能实现功能,所以必须将中间结果对n取模,才能使计算切实可行。
RSA算法的实现实验报告

RSA算法的实现实验报告一、实验目的本实验的主要目的是了解和掌握RSA(Rivest-Shamir-Adleman)算法的原理以及其在加密和解密过程中的具体实现。
通过实践和对比分析,了解RSA算法的安全性和效率,并加深对大数计算的理解。
二、算法原理1.密钥生成(1)选择两个大素数p和q,并计算其乘积n=p*q。
(2)计算n的欧拉函数φ(n)=(p-1)*(q-1)。
(3)选择一个整数e,满足1<e<φ(n),并且e与φ(n)互质,即gcd(e, φ(n)) = 1(4)计算e的乘法逆元d,满足e*d ≡ 1 (mod φ(n))。
(5)公钥为(n,e),私钥为(n,d)。
2.加密加密过程使用公钥对明文进行加密:(1)明文转化为整数m,满足0≤m<n。
(2)计算密文c = m^e mod n。
3.解密解密过程使用私钥对密文进行解密:(1)计算明文m = c^d mod n。
(2)还原明文。
三、实验步骤1.实现大数的运算由于RSA算法的关键在于处理大数运算,我们首先实现了大数的加法、减法和乘法运算,并使用这些运算函数作为之后RSA算法中的基础运算。
2.实现RSA算法的密钥生成(1)随机选择两个大素数p和q。
(2)计算n=p*q。
(3)计算φ(n)=(p-1)*(q-1)。
(4)选择一个满足要求的公钥e。
(5)计算e的乘法逆元d。
(6)生成公钥(n,e)和私钥(n,d)。
3.实现RSA算法的加密和解密(1)输入明文。
(2)使用公钥对明文进行加密。
(3)得到密文。
(4)使用私钥对密文进行解密。
(5)还原明文。
四、实验结果与分析我们使用python语言实现了RSA算法,并进行了一些测试和分析,得到以下结果和结论。
1.RSA算法的安全性2.RSA算法的效率3.实验结果分析我们对一些常见文本进行了加密和解密实验,得到了正确的结果。
实验结果表明,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)数据完整性;(3)不可抵赖性2.实验环境(设备、仪器、网络):(1)虚拟机(2)加密工具(3)Windows系统环境3.实验内容(实验方案、实验步骤、测量数据及处理等):3.1实验方案加密方和解密方利用RSA加密算法分别生成一对公钥和私钥,并告知对方自己的公钥。
加密方实验流程如图3-1所示:图3-1将加密后的明文和签名发送给解密方。
解密方实验流程如图3-2所示:图3-2将明文同样进行hash运算得出摘要,与验证签名后得出的摘要相比较,如果相同则可以证明明文没有被破坏或改变,同时也可使确定是加密方发送的信息。
3.2实验过程加密方(1)加密方通过RSA算法得出公钥(e,n)=(101,253),私钥(d,n)=(61,253);(2)编辑明文为we are in xinjiang,and you?(3)在加密工具的环境中利用解密方的公钥对明文进行加密,如图3-3所示:图3-3(4)在加密工具中利用MD5对明文进行hash运算,如图3-4所示:图3-4(5)用加密方的私钥对生成的摘要进行签名,如图3-5所示:图3-5(6)将签名与密文发送给解密方。
解密方(1)通过RSA算法得出公钥(e,n)=(1003,2173),私钥(d,n)=(1827,2173) (2)利用解密方的私钥对密文解密,如图3-6所示:图3-6(3)验证签名,将加密方发送的签名用加密方的公钥解密,如图3-7所示:图3-7(4)把解密的明文利用MD5进行hash运算,并与验证签名得出摘要相比较,一致则可以知道明文没有被篡改且完整。
4.实验结果与分析:(1)使用RSA算法可以方便对密钥的管理,使得密钥更加安全,实现了数据的机密性。
(2)解密方可以用加密方的公钥对签名进行验证,则可以确定消息是来自加密方,实现了数据的不可抵赖性;(3)将验证签名得出的摘要与利用MD5对明文进行hash运算得出的摘要相符,可以确定明文没有被改变,实现了数据的完整性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
五、实验目的:
目的:实现一种密码算法(古典密码算法,DES算法,AES算法,RSA算法,ECC算法)并掌握其原理。这次实验我们决定实现RSA算法。
a)选择并熟悉一种密码算法。
b)编写概要设计,详细设计报告
c)使用Eclipse工具,编码.
d)调试及测试
九、实验数据及结果分析:
公钥:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCYU/+I0+z1aBl5X6DUUOHQ7FZpmBSDbKTtx89J
EcB64jFCkunELT8qiKly7fzEqD03g8ALlu5XvX+bBqHFy7YPJJP0ekE2X3wjUnh2NxlqpH3/B/xm
}
/**
*校验数字签名
*
* @param data
*加密数据
* @param publicKey
*公钥
* @param sign
*数字签名
*
* @return校验成功返回true失败返回false
* @throws Exception
*
*/
public static boolean verify(byte[] data, String publicKey, String sign)
Df2B5JmdEG5Y2o0nLXwG2w44OLct/k2uD4cEcuITY5Dvi/4BftMCZwm/dnhEgQJACIktJSnJwxLV
o9dchENPtlsCM9C/Sd2EWpqISSUlmfugZbJBwR5pQ5XeMUqKeXZYpP+HEBj1nS+tMH9u2/IGEwJA
// KEY_ALGORITHM指定的加密算法
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
//取私钥匙对象
PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);
signature.initVerify(pubKey);
signature.update(data);
//验证签名是否正常
return signature.verify(decryptBASE64(sign));
}
/**
*解密<br>
*用私钥解密
*
* @param data
* @param key
9rwbuEh3+iTPOGSxhoSQpOED0vOb0ZIMkBXZSgsxLaBSin2RZ09YKWRjtpCA0kDkiD11gj4tzTiM
l9qq1kwSK7ZkGAgodEn3yIILVmQDuEImHOXFtulvJ71ka07u3LuwUNdB/wIDAQAB
私钥:
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAN06PjTIQHjxepbGY8guYkBztR5w
public static final String KEY_ALGORITHM = "RSA";
public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
private static final String PUBLIC_KEY = "RSAPublicKey";
i3wwbYWs9wSzIf0UjlM=
状态:
true
十、实验结论:
使用公钥加密、私钥解密,完成了乙方到甲方的一次数据传递,通过私钥加密、公钥解密,同时通过私钥签名、公钥验证签名,完成了一次甲方到乙方的数据传递与验证,两次数据传递完成一整套的数据交互!
十一、实验代码:
public abstract class RSACoder extends Coder {
fL8mZiZXan/oBKrblAbplNcKWGRVD/3y65042PAEeghahlJMiYquV5DzZajuuT0wbJ5xQuZB01+X
nfpFpBJ2dw==
公钥加密——私钥解密
加密前: abc
解密后: abc
公钥:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDdOj40yEB48XqWxmPILmJAc7UecIN7F32etSHF
9jA/Wc0wp29SbGTh5CcMuGpXm1g0M+FKW3dGiHgS3rVUKim4owJAbnxgapUzAgiiHxxMeDaavnHW
9C2GrtjsO7qtZOTgYI/1uT8itvZW8lJTF+9OW8/qXE76fXl7ai9dFnl5kzMk2QJBALfHz/vCsArt
2、甲方使用私钥加密数据,然后用私钥对加密后的数据签名,发送给乙方签名以及加密后的数据;乙方使用公钥、签名来验证待解密数据是否有效,如果有效使用公钥对数据解密。
3、乙方使用公钥加密数据,向甲方发送经过加密后的数据;甲方获得加密数据,通过私钥解密。
七、实验器材(设备、元器件):
PC、java开发环境
八、实验步骤:
六、实AES算法,RSA算法,ECC算法);
b)依据所算则的算法,编程实现该该算法;
提供该算法的使用说明手册,可执行代码、源代码及测试用例(包括测试用例手册、可执行代码和源代码)。
以RSA算法为例:
1、甲方构建密钥对儿,将公钥公布给乙方,将私钥保留。
private static final String PRIVATE_KEY = "RSAPrivateKey";
/**
*用私钥对信息生成数字签名
*
* @param data
*加密数据
* @param privateKey
*私钥
*
* @return
* @throws Exception
*/
public static String sign(byte[] data, String privateKey) throws Exception {
/MB06Huifh6qf/X9NQA7SeZRRC8gnCQk6JuDIEVJOud5jU+9tyumJakDKodQ3Jf2zQtNr+5ZdEPl
uwWgv9c4kmpjhAdyMuQmYQJBANn6pcgvyYaia52dnu+yBUsGkaFfwXkzFSExIbi0MXTkhEb/ER/D
gYEAz2JWBizjI31bqhP4XiP9PuY5F3vqBW4T+L9cFbQiyumKJc58yzTWUAUGKIIn3enXLG7dNqGr
mbJro4JeFIJ3CiVDpXR9+FluIgI4SXm7ioGKF2NOMA9LR5Fu82W+pLfpTN2y2SaLYWEDZyp53BxY
j9gUxaxi1MQs+C1ZgDF2xmECQQDy70bQntbRfysP+ppCtd56YRnES1Tyekw0wryS2tr+ivQJl7JF
gp5rPAOXpgrq36xHDwUspQ0sJ0vj0O7ywxr1AkEA6SAaLhrJJrYucC0jxwAhUYyaPN+aOsWymaRh
mkRiwY6zApE4Z6tPl1V33ymSVovvUzHnOdD1SKQdD5t+UV/crb3QVi8ED0t2B0u0ZSPfDT/D7kMC
QDpwdj9k2F5aokLHBHUNJPFDAp7a5QMaT64gv/d48ITJ68Co+v5WzLMpzJBYXK6PAtqIhxbuPEc2
//解密由base64编码的私钥
byte[] keyBytes = decryptBASE64(privateKey);
//构造PKCS8EncodedKeySpec对象
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
throws Exception {
//解密由base64编码的公钥
byte[] keyBytes = decryptBASE64(publicKey);
//构造X509EncodedKeySpec对象
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
I2k1Afmrwyw=
私钥加密——公钥解密
加密前: sign
解密后: sign
私钥签名——公钥验证签名
签名:
ud1RsIwmSC1pN22I4IXteg1VD2FbiehKUfNxgVSHzvQNIK+d20FCkHCqh9djP3h94iWnIUY0ifU+
mbJkhAl/i5krExOE0hknOnPMcEP+lZV1RbJI2zG2YooSp2XDleqrQk5e/QF2Mx0Zxt8Xsg7ucVpn
rLytukkUu5S5ecz/KBa8U4xIslZDYQbLz5ECQQCy5dutt7RsxN4+dxCWn0/1FrkWl2G329Ucewm3
QU9CKu4D+7Kqdj+Ha3lXP8F0Etaaapi7+EfkRUpukn2ItZV/AkEAlk+I0iphxT1rCB0Q5CjWDY5S
1ZdSlCwDIkbijhBVDjA/bu5BObhZqQmDwIxlQInL9oVz+o6FbAZCyHBd7wIDAQAB