密码学-RSA加密解密算法的实现课程设计报告

时间:2024.4.14

                                      

       密码学课程报告

  RSA加密解密算法》

专业:信息工程(信息安全)

班级:1132102

学号:201130210214

姓名:周林

指导老师:阳红星

时间:20##110

一、课程设计的目的

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

RSA算法是第一个既能用于数据加密也能用于数字签名的算法,因此它为公用网络上信息的加密和鉴别提供了一种基本的方法。它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册,人们用公钥加密文件发送给个人,个人就可以用私钥解密接受。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。

    公钥加密算法中使用最广的是RSA。RSA算法研制的最初理念与目标是努力使互联网安全可靠,旨在解决DES算法秘密密钥的利用公开信道传输分发的难题。而实际结果不但很好地解决了这个难题;还可利用RSA来完成对电文的数字签名以抗对电文的否认与抵赖;同时还可以利用数字签名较容易地发现攻击者对电文的非法篡改,以保护数据信息的完整性。此外,RSA加密系统还可应用于智能IC卡和网络安全产品。

二、RSA算法的编程思路

1.   确定密钥的宽度。    

2.   随机选择两个不同的素数p与q,它们的宽度是密钥宽度的1/2。

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 n

9.将密文C解密为明文P,计算方法为:P = Cd mod n

然而只根据n和e(不是p和q)要计算出d是不可能的。因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密

三、程序实现流程图:

1、密钥产生模块:

2、解加密流程模块:

四、部分算法代码

 判定一个数是否为素数

bool test_prime(Elemtype m) {

if (m <= 1) {

   return false;

}

else if (m == 2) {

   return true;

}

else {

   for(int i=2; i<=sqrt(m); i++) {

    if((m % i) == 0) {

     return false;

     break;

    }

   }

   return true;

}

}

求最大公约数

Elemtype gcd(Elemtype a, Elemtype b) {

order(a,b);

int r;

if(b == 0) {

return a;

}

else {

   while(true) {

    r = a % b;

    a = b;

    b = r;

    if (b == 0) {

    return a;

    break;}

用扩展的欧几里得算法求乘法逆元

Elemtype extend_euclid(Elemtype m, Elemtype bin) {

order(m,bin);

Elemtype a[3],b[3],t[3];

a[0] = 1, a[1] = 0, a[2] = m;

b[0] = 0, b[1] = 1, b[2] = bin;

if (b[2] == 0) {

    return a[2] = gcd(m, bin);

   }

if (b[2] ==1) {

    return b[2] = gcd(m, bin);

}

while(true) {

   if (b[2] ==1) {

    return b[1];

    break;

   }

   int q = a[2] / b[2];

   for(int i=0; i<3; i++) {

    t[i] = a[i] - q * b[i];

    a[i] = b[i];

    b[i] = t[i];  }}}

加密

void encrypt() {

if(flag == 0) {

   cout<<"setkey first:"<<endl;

   produce_key();

}

label3:

cout<<"input m:";

cin>>m;

while (!cin)

{

cin.clear();

char a;

cin>>a;

cout<<"wrong input,Please enter an integer !"<<endl;

goto label3;

}

c = modular_multiplication(m,pu.e,pu.n);

cout<<"c is:"<<c<<endl;}

解密

void decrypt() {

if(flag == 0) {

   cout<<"setkey first:"<<endl;

   produce_key();

}

label4:

cout<<"input c:";

cin>>c;

while (!cin)

{

cin.clear();

char a;

cin>>a;

cout<<"wrong input,Please enter an integer !"<<endl;

goto label4;

}

m = modular_multiplication(c,pr.d,pr.n);

cout<<"m is:"<<m<<endl;

五、部分截图

六、程序代码

#include   <iostream.h>

#include   <conio.h>

#include   <math.h>

#include   <stdlib.h>

#include   <string.h>

int  go(int k,char bk[16]);

int   Transform(int   m,int   k,int   n);

int   gcd(int   a,int   b);

int   IsPrime(int   a);

go(int k,char bk[16])

{

int n = 0;

while( k > 0) {

   bk[n] = k % 2;

   n++;

   k/= 2;

}

return k;

}

int   Transform(int m,int  k,int  n)

{

long   int   r=1;

char   bk[16];

go(k,bk);

for(int i=15; i>=0; i--)

{

r=(r*r)%n;

if  (bk[i] ==1)

{

     r=(r*m)%n;

}

}

return   r;

}

int   gcd(int a,int  b)

{

for(int   i=2;i <=sqrt(a <b?a:b);i++)

if   ((a%i ==0)&&(b%i==0))

return   0;

return   1;

}

int IsPrime(int   a) 

{

for(int  i=2;i <=sqrt(a);i++)

if(a%i==0)   return   0;

return   1;

}

void   main()

{

int   c,e,d,m,n,z,p,q;

cout << "\t************简单RSA加密解密算法***********\n\n ";

cout <<"请输入 p:   ";

cin>> p;

while(!IsPrime(p))

{

cout << "您输入的p不是素数,请重新输入:   ";

cin>> p;

}

cout << "请输入q:   ";

cin>> q;

while(!IsPrime(q))

{

cout << "您输入的q不是素数,请重新输入: ";

cin>> q;

}

cout << "\n由p和q求得n和ф(n) " <<endl;

n=p*q;

z=(p-1)*(q-1);

cout << "n =" <<n << "   and   " << "ф(n) =" <<z <<endl;

cout <<endl << "请输入e:   ";

cin>> e;

while   (!gcd(e,z))

{

cout << "e应该和ф(n)互素:   ";

cin>> e;

}

cout << "求得解密密钥" ;

d=1;

while   (((e*d)%z)!=1)   d++;

cout <<   "d ="   <<   d   <<   endl;

cout <<endl << "请输入明文m: " ;

cin>> m;

while (m>=n||m<=0)

{

cout << "请重新输入明文m(0<m<"<<n<<")";

cin>> m;

}

cout << "求得密文为:";

c=Transform(m,e,n);

cout << "c =" <<c <<endl;

cout <<endl << "请输入密文c: " ;

cin>> c;

cout << "求得明文为:" ;

m=Transform(c,d,n);

cout << "m =" <<m <<endl;

getch();

}

七、 心得体会

通过做此次课程设计,对RSA加密解密算法有了更近一步的了解。RSA通过使用公钥加密、私钥解密,完成了乙方到甲方的一次数据传递,通过私钥加密、公钥解密,同时通过私钥签名、公钥验证签名,完成了一次甲方到乙方的数据传递与验证,两次数据传递完成一整套的数据交互!掌握了RSA算法的基本原理、体验应用效果,以及如何判断一个数是否为素数,以及用扩展的欧几里得算法求乘法逆元问题,以及解密和加密算法。虽然中间遇到了一些难题,但是在老师及同学的帮助下,顺利完成此次课程设计。


第二篇:密码学实验(RSA完整算法)


密码学实验

——RSA算法实现

姓名:

班级: 

学号: 

教师:

助教:

一.         程序功能函数定义

public static String toHexString(byte[] b)

——格式转换函数

public KeyPair generateKey() throws     NoSuchAlgorithmException

——密钥对生成函数

protected byte[] PKCS1Ecryption(RSAPublicKey  publicKey, String Data)

——PKCS1机制下RSA加密函数

protected byte[] PKCS1DeEcryption

(RSAPrivateKey

privateKey, byte[] raw)

——PKCS1机制下RSA解密密函数

protected byte[] OAEPEcryption(RSAPublicKey  publicKey, String Data)

——OAEP机制下RSA加密函数

protected byte[] OAEPDeEcryption

(RSAPrivateKey

privateKey, byte[] raw)

——OAEP机制下RSA解密密函数

public static void main(String[] args)

——主函数(Main

二.         程序功能函数说明(含返回、参数)

《1》     public KeyPair generateKey() throws NoSuchAlgorithmException

A.    入口参数:无

B.    返回类型:KeyPair类(JAVA库类)——密钥对

C.    函数功能:利用系统随机源(且这里指定密钥长度为512bit)与指定的算法类(RSA)构造一对密钥对

《2》          protected byte[] PKCS1Ecryption(RSAPublicKey publicKey, String Data)

A.    入口参数:RSA公钥类publickey和字符串类data

B.    返回类型:字节数组类——密文形式

C.    函数功能:能将原明文首先转化成字节数组形式,并且利用加密库CipherSecurity指定PKCS1机制下的RSA加密算法对明文加密并且以字节数组的形式返回加密后得到的密文

《3》          protected byte[] OAEPEcryption(RSAPublicKey publicKey, String Data)

A.    入口参数:RSA公钥类publickey和字符串类data

B.    返回类型:字节数组类——密文形式

C.    函数功能:能将原明文首先转化成字节数组形式,并且利用加密库CipherSecurity指定OAEP机制下的RSA加密算法对明文加密并且以字节数组的形式返回加密后得到的密文

《4》          protected byte[] PKCS1DeEcryption

(RSAPrivateKey privateKey, byte[] raw)

A.    入口参数:RSA私钥类privatekey和字节数组类raw

B.    返回类型:字节数组类——明文形式

C.    函数功能:利用加密库CipherSecurity指定PKCS1机制下的RSA解密算法对密文解密并且以字节数组的形式返回解密后得到的明文

《5》          protected byte[] OAEPDeEcryption

(RSAPrivateKey privateKey, byte[] raw)

A.    入口参数:RSA私钥类privatekey和字节数组类raw

B.    返回类型:字节数组类——明文形式

C.    函数功能:利用加密库CipherSecurity指定OAEP机制下的RSA解密算法对密文解密并且以字节数组的形式返回解密后得到的明文

《6》          public static String toHexString(byte[] b)

A.    入口参数:字节数组

B.    返回类型:字符串

C.    函数功能:将任意的字节数组转换成ASCII码形式的(十六进制)字符串,便于在屏幕上显示和方便阅读

《7》          public static void main(String[] args)

A.    入口参数:字符串(主函数只可一次调用)

B.    返回类型:无

C.    函数功能:提供用户手动输入,由用户指定需要加密的明文和加密的机制(3项选择),生成密钥对并对明文加密再对密文解密,最后全部显示出来供用户审阅

三.         编程关键与疑难解决

本次编程实验重在掌握加密库的使用,这里JAVA(JDK1.7)提供了两大库——Cipher与Security,正确利  用它们进行RSA加密是本实验的关键所在

老实说,由于这两大库内容很多比较复杂,自己慢慢研究是很费时间的,于是我在网上查找文档和资料,需求论坛高手解答,最终确定主要用到以下库类:

java.security.KeyPair;  

java.security.KeyPairGenerator;  

java.security.NoSuchAlgorithmException;  

java.security.SecureRandom;  

java.security.interfaces.RSAPrivateKey;  

java.security.interfaces.RSAPublicKey;  

java.util.Scanner;

javax.crypto.Cipher;

确认了库类后,就可以根据eclipse提示正确找到JDK1.7提供的RSA加密函数了,接下来操作就是搞懂每个库函数的用法即可了!

四.         程序运行结果截图(部分)

更多相关推荐:
密码学课程设计报告

沈阳工程学院课程设计设计题目院系信息学院班级信安本111学生姓名学号指导教师祝世东王素芬职称工程师副教授起止日期20xx年1月6日起至20xx年1月10日止沈阳工程学院课程设计任务书课程设计题目简单的保密通信系...

密码学课程设计报告

密码学课程设计报告班级:信安10-1班姓名:学号:指导老师:一、Hash算法的实现MD5算法1.1算法概述MD5算法是一种消息摘要算法,此算法以任意长度的信息作为输入进行计算,产生一个128-bit(16-by…

密码学课程设计报告

XX大学密码学课程设计姓名学号学院指导老师完成日期20xx0106一实验任务及要求任务使用IDEA算法实现加解密过程要求1输入至少包括两个分组2核心功能是加解密过程可适当增加附加功能32人组二实现原理IDEA算...

密码学课程设计报告要求及模板

计算机与信息工程学院《密码学课程设计》报告(20××/20学年第二学期)题目:Diffie-Hellman密钥交换协议系别:计算机与信息工程学院专业:信息安全班级:学号:姓名:20年05月30日(一)题目Dif…

中国矿业大学密码学课程设计报告

密码学课程设计中国矿业大学密码学课程设计报告院系计算机学院专业信息安全班级姓名学号指导老师20xx年6月密码学课程设计摘要近些年来由于许多私密信息的泄漏信息安全成为全社会的需求所以也成为了整个社会的关注热点对于...

密码学课程设计实验报告

院系计算机科学与技术学院专业信息安全班级0703学号xxxxxxxxxx姓名指导教师xxxxxxxx月日1密码学课程设计实验报告目录第一部分一实验目的二实验环境及工具三实验内容四实验原理五实验过程651设计思路...

现代密码学课程设计实验报告 -

西安科技大学《现代密码学》课程设计报告题目:密码学计算器学院:计算机科学与技术学院班级:姓名:学号:日期:20XX.1.8一.课程设计题目密码学计算器的研究与实现二.分工对称密码程序实现Des算法组长:古典密码…

密码学课程设计报告 5

密码学课程设计班级姓名学号指导教师20xx6中国矿业大学计算机学院密码学课程设计目录密码学课程设计11实验一实现一个多表古典加密和解密程序111实验目的112实验要求113实验内容114古典加密方法115程序代...

应用密码学课程设计报告

沈阳工程学院课程设计报告摘要摘要随着国家信息化步骤的加快和高等教育规模的扩大社会对计算机专业人才的需求不仅体现在数量的增加上而且体现在质量要求的提高上培养具有研究和实践能力的高层次的计算机专业人才已成为许多重点...

密码学课程设计报告

20xx20xx密码学课程设计报告密码学课程设计报告120xx20xx密码学课程设计报告一古典密码算法311实验内容312实验目的313需求分析314程序流程图415算法实现5151Playfair体制5151...

运筹学课程设计

工程建设与财政平衡决策问题摘要目标规划是由线性规划发展演变而来但比线性规划更加灵活可以解决多个目标并且还可以自带从属目标的规划问题是一较之线性规划更接近于实际决策过程的决策工具本文从市政府三年间为了完成五项基本...

运筹学课程设计报告2

课程设计题目:某城市自来水供水运输最优问题及分配问题课程设计任务书摘要运筹学是一门以人机系统的组织、管理为对象,应用数学和计算机等工具来研究各类有限资源的合理规划使用并提供优化决策方案的科学。随着科学技术和生产…

密码学课程设计报告(28篇)