密码学课程报告
《RSA加密解密算法》
专业:信息工程(信息安全)
班级:1132102
学号:201130210214
姓名:周林
指导老师:阳红星
时间:20##年1月10号
一、课程设计的目的
当前最著名、应用最广泛的公钥系统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算法实现
姓名:
班级:
学号:
教师:
助教:
一. 程序功能函数定义
① 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. 函数功能:能将原明文首先转化成字节数组形式,并且利用加密库Cipher与Security指定PKCS1机制下的RSA加密算法对明文加密并且以字节数组的形式返回加密后得到的密文
《3》 protected byte[] OAEPEcryption(RSAPublicKey publicKey, String Data)
A. 入口参数:RSA公钥类publickey和字符串类data
B. 返回类型:字节数组类——密文形式
C. 函数功能:能将原明文首先转化成字节数组形式,并且利用加密库Cipher与Security指定OAEP机制下的RSA加密算法对明文加密并且以字节数组的形式返回加密后得到的密文
《4》 protected byte[] PKCS1DeEcryption
(RSAPrivateKey privateKey, byte[] raw)
A. 入口参数:RSA私钥类privatekey和字节数组类raw
B. 返回类型:字节数组类——明文形式
C. 函数功能:利用加密库Cipher与Security指定PKCS1机制下的RSA解密算法对密文解密并且以字节数组的形式返回解密后得到的明文
《5》 protected byte[] OAEPDeEcryption
(RSAPrivateKey privateKey, byte[] raw)
A. 入口参数:RSA私钥类privatekey和字节数组类raw
B. 返回类型:字节数组类——明文形式
C. 函数功能:利用加密库Cipher与Security指定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日…
密码学课程设计报告班级:信安10-1班姓名:学号:指导老师:一、Hash算法的实现MD5算法1.1算法概述MD5算法是一种消息摘要…
密码学课程报告《RSA加密解密算法》专业:信息工程(信息安全)班级:1132102学号:****姓名:***时间:20××年1月1…
XX大学密码学课程设计姓名学号学院指导老师完成日期20xx0106一实验任务及要求任务使用IDEA算法实现加解密过程要求1输入至少…
计算机与信息工程学院《密码学课程设计》报告(20××/20学年第二学期)题目:Diffie-Hellman密钥交换协议系别:计算机…
课程设计课程名称密码学题目名称AES的实现与分析学生学院应用数学学院专业班级11信息安全1班学号学生姓名指导教师李锋20xx年12…
西安科技大学《现代密码学》课程设计报告题目:密码学计算器学院:计算机科学与技术学院班级:姓名:学号:日期:20XX.1.8一.课程…
沈阳工程学院课程设计设计题目院系信息学院班级信安本111学生姓名学号指导教师祝世东王素芬职称工程师副教授起止日期20xx年1月6日…
密码学课程设计班级成员姓名指导教师20xx7中国矿业大学计算机学院密码学课程设计目录密码学课程设计11实验一实现一个多表古典加密和…
密码学课程设计报告班级:信安10-1班姓名:学号:指导老师:一、Hash算法的实现MD5算法1.1算法概述MD5算法是一种消息摘要…