编写程序实现RSA算法对数据进行加密和解密

编写程序实现RSA算法对数据进行加密和解密,第1张

RSA算法是非对称算法,要配合公钥和私钥机制实现加密和解密,如果常规大数据量的加密和解密,还是用对称加密算法效率高。

你的问题涉及内容很多,建议找《精通PKI网络安全认证技术与编程实现》来看,里面对具体的应用介绍的很清楚

你看看这个行不行,位数可以自己改,今天在网上找到了,我也想用C生成512、1024位的大素数进行RSA加密。。如果谁有好方法麻烦共享下:76287324@qqcom,跪谢

package test;

import javamathBigInteger;

// 生成一个随机大整数,然后找出比这个整数大的下一个素数

public class Primes {

// 下面的 BigIntegerZERO 和 BigIntegerONE 在 JDK 11 中是无效的

private static final BigInteger ZERO = BigIntegerZERO;

private static final BigInteger ONE = BigIntegerONE;

private static final BigInteger TWO = new BigInteger("2");

// 产生一个错误素数的概率小于 1/2 的 ERR_VAL 次方,可以将 ERR_VAL 定义为 200,降低其错误率

// Java 应该使用的是 Miller-Rabin 测试法,这种错误概率基本上可以认为是无错误。

private static final int ERR_VAL = 100;

private static StringBuffer[] digits = { new StringBuffer("0"), new StringBuffer("1"), new StringBuffer("2"), new StringBuffer("3"), new StringBuffer("4"), new StringBuffer("5"),

new StringBuffer("6"), new StringBuffer("7"), new StringBuffer("8"), new StringBuffer("9") };

private static StringBuffer randomDigit(boolean isZeroOK) {

// 产生一个随机的数字(字符串形式的),isZeroOK 决定这个数字是否可以为 0

int index;

if (isZeroOK)

index = (int) Mathfloor(Mathrandom() 10);

else

index = 1 + (int) Mathfloor(Mathrandom() 9);

return (digits[index]);

}

public static BigInteger bigRandom(int numDigits) {

// 产生一个随机大整数,各位上的数字都是随机产生的,首位不为 0

StringBuffer s = new StringBuffer("");

for (int i = 0; i < numDigits; i++)

if (i == 0)

sappend(randomDigit(false));

else

sappend(randomDigit(true));

return (new BigInteger(stoString()));

}

private static boolean isEven(BigInteger n) {

// 测试一个大整数是否为偶数

return (nmod(TWO)equals(ZERO));

}

public static BigInteger nextPrime(BigInteger start) {

// 产生一个比给定大整数 start 大的素数,错误率低于 1/2 的 ERR_VAL 次方

if (isEven(start))

start = startadd(ONE);

else

start = startadd(TWO);

if (startisProbablePrime(ERR_VAL))

return (start);

else

// 采用递归方式(递归的层数会是个天文数字吗?)

return (nextPrime(start));

}

// 一个基于命令行的测试程序,如果位数错误,默认 150 位,输出 20 个素数

public static void main(String[] args) {

int numDigits;

try {

numDigits = IntegerparseInt(args[0]);

} catch (Exception e) {

numDigits = 128;

}

BigInteger start = bigRandom(numDigits);

start = nextPrime(start);

BigInteger end = bigRandom(5);

end = nextPrime(end);

Systemoutprintln("大素数" + start);

Systemoutprintln("大素数" + end);

BigInteger result = startmultiply(end);

Systemoutprintln("结果数" + result);

RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。

一、详细介绍

在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。

加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。

正是基于这种理论,1978年出现了著名的RSA算法,它通常是先生成一对RSA密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。

为提高保密强度,RSA密钥至少为500位长。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式。

即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要。

RSA是被研究得最广泛的公钥算法,从提出到现在已近三十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。1983年麻省理工学院在美国为RSA算法申请了专利。

RSA允许你选择公钥的大小。512位的密钥被视为不安全的;768位的密钥不用担心受到除了国家安全管理(NSA)外的其他事物的危害;

RSA在一些主要产品内部都有嵌入,像 Windows、网景 Navigator、 Quicken和 Lotus Notes。

由于RSA算法1024位密钥面临严重的安全威胁,为保障电子认证服务安全应用,2016年12月5日,上海市密码管理局在其官方网站上发布公告,称从2017年1月1日起停止提供RSA算法1024位密钥对服务。

加密时用公钥d,解密时用私钥e

公式都一样

要加密或解密的数字做e次方或d次方,得到的数字再和n进行模运算,模运算就是求余数

拿你给的数据来算的话就是

3的7次方等于2187,2187除以20等于109,余数是7

所以得到的密文就是7

解密就是算7的3次方343,343除以20等于340余数3,于是我们又得回原来的明文3了

前几天看到一句话,“我们中的很多人把一生中最灿烂的笑容大部分都献给了手机和电脑屏幕”。心中一惊,这说明了什么?手机和电脑已经成为了我们生活中的一部分,所以才会有最懂你的不是你,也不是你男朋友,而是大数据。

如此重要的个人数据,怎样才能保证其在互联网上的安全传输呢?当然要靠各种加密算法。说起加密算法,大家都知道有哈希、对称加密和非对称加密了。哈希是一个散列函数,具有不可逆 *** 作;对称加密即加密和解密使用同一个密钥,而非对称加密加密和解密自然就是两个密钥了。稍微深入一些的,还要说出非对称加密算法有DES、3DES、RC4等,非对称加密算法自然就是RSA了。那么当我们聊起RSA时,我们又在聊些什么呢?今天笔者和大家一起探讨一下,有不足的地方,还望各位朋友多多提意见,共同进步。

RSA简介:1976年由麻省理工学院三位数学家共同提出的,为了纪念这一里程碑式的成就,就用他们三个人的名字首字母作为算法的命名。即 罗纳德·李维斯特 (Ron Rivest)、 阿迪·萨莫尔 (Adi Shamir)和 伦纳德·阿德曼 (Leonard Adleman)。

公钥:用于加密,验签。

私钥:解密,加签。

通常知道了公钥和私钥的用途以后,即可满足基本的聊天需求了。但是我们今天的主要任务是来探究一下RSA加解密的原理。

说起加密算法的原理部分,肯定与数学知识脱不了关系。

我们先来回忆几个数学知识:

φn = φ(AB)=φ(A)φ(B)=(A-1)(B-1)。

这个公式主要是用来计算给定一个任意的正整数n,在小于等于n的正整数中,有多少个与n构成互质的关系。

其中n=AB,A与B互为质数,但A与B本身并不要求为质数,可以继续展开,直至都为质数。

在最终分解完成后,即 φ(N) = φ(p1)φ(p2)φ(p3) 之后,p1,p2,p3都是质数。又用到了欧拉函数的另一个特点,即当p是质数的时候,φp = p - 1。所以有了上面给出的欧拉定理公式。

举例看一下:

计算15的欧拉函数,因为15比较小,我们可以直接看一下,小于15的正整数有 1、2、3、4、5、6、7、8、9、10、11、12、13、14。和15互质的数有1、2、4、7、8、11、13、14一共四个。

对照我们刚才的欧拉定理: 。

其他感兴趣的,大家可以自己验证。

之所以要在这里介绍欧拉函数,我们在计算公钥和私钥时候,会用到。

如果两个正整数m 和 n 互质,那么m 的 φn 次方减1,可以被n整除。

 其中 

其中当n为质数时,那么  上面看到的公式就变成了

 mod n   1

这个公式也就是著名的 费马小定理 了。

如果两个正整数e和x互为质数,那么一定存在一个整数d,不止一个,使得 ed - 1 可以被x整除,即 e d mode x   1。则称 d 是 e 相对于 x的模反元素。

了解了上面所讲的欧拉函数、欧拉定理和模反元素后,就要来一些化学反应了,请看图:

上面这幅图的公式变化有没有没看明白的,没看明白的咱们评论区见哈。

最终我们得到了最重要的第5个公式的变形,即红色箭头后面的:

 mod n   m。

其中有几个关系,需要搞明白,m 与 n 互为质数,φn = x,d 是e相对于x的模反元素。

有没有看到一些加解密的雏形。

从 m 到 m。 这中间涵盖了从加密到解密的整个过程,但是缺少了我们想要的密文整个过程。

OK,下面引入本文的第四个数学公式:

我们来看一下整个交换流程:

1、客户端有一个数字13,服务端有一个数字15;

2、客户端通过计算 3的13次方 对 17 取余,得到数字12; 将12发送给服务端;同时服务端通过计算3的15次方,对17取余,得到数字6,将6发送给客户端。至此,整个交换过程完成。

3、服务端收到数字12以后,继续计算,12的15次方 对 17取余,得到 数字10。

4、客户端收到数字 6以后,继续计算,6的13次方 对 17 取余,得到数字 10。

有没有发现双方,最终得到了相同的内容10。但是这个数字10从来没有在网络过程中出现过。

好,讲到这里,可能有些人已经恍然大悟,这就是加密过程了,但是也有人会产生疑问,为什么要取数字3 和 17 呢,这里还牵涉到另一个数学知识,原根的问题。即3是17的原根。看图

有没有发现规律,3的1~16次方,对17取余,得到的整数是从1~16。这时我们称3为17的原根。也就是说上面的计算过程中有一组原根的关系。这是最早的迪菲赫尔曼秘钥交换算法。

解决了为什么取3和17的问题后,下面继续来看最终的RSA是如何产生的:

还记得我们上面提到的欧拉定理吗,其中 m 与 n 互为质数,n为质数,d 是 e 相对于 φn的模反元素。

当迪菲赫尔曼密钥交换算法碰上欧拉定理会产生什么呢?

我们得到下面的推论:

好,到这里我们是不是已经看到了整个的加密和解密过程了。

其中 m 是明文;c 是密文; n 和 e 为公钥;d 和 n 为私钥 。

其中几组数字的关系一定要明确:

1、d是e 相对于 φn 的模反元素,φn = n-1,即 e d mod n = 1

2、m 小于 n,上面在讲迪菲赫尔曼密钥交换算法时,提到原根的问题,在RSA加密算法中,对m和n并没有原根条件的约束。只要满足m与n互为质数,n为质数,且m < n就可以了。

OK,上面就是RSA加密算法的原理了,经过上面几个数学公式的狂轰乱炸,是不是有点迷乱了,给大家一些时间理一下,后面会和大家一起来验证RSA算法以及RSA为什么安全。

分类: 电脑/网络 >> 程序设计 >> 其他编程语言

问题描述:

用RSA对下列数据实现加密和解密:

a p=3,q=11,e=7;M=5

b p=7,q=11,e=3;M=9

解析:

拜托:老大,你的家庭作业也来问

你自己学吧:下面是课文^

RSA加密算法

该算法于1977年由美国麻省理工学院MIT(Massachusetts Institute of Technology)的Ronal Rivest,Adi Shamir和Len Adleman三位年轻教授提出,并以三人的姓氏Rivest,Shamir和Adlernan命名为RSA算法。该算法利用了数论领域的一个事实,那就是虽然把两个大质数相乘生成一个合数是件十分容易的事情,但要把一个合数分解为两个质数却十分困难。合数分解问题目前仍然是数学领域尚未解决的一大难题,至今没有任何高效的分解方法。与Diffie-Hellman算法相比,RSA算法具有明显的优越性,因为它无须收发双方同时参与加密过程,且非常适合于电子函件系统的加密。

RSA算法可以表述如下:

(1) 密钥配制。假设m是想要传送的报文,现任选两个很大的质数p与q,使得:

(12-1);

选择正整数e,使得e与(p-1)(q-1)互质;这里(p-1)(q-1)表示二者相乘。再利用辗转相除法,求得d,使得:

(12-2);

其中x mod y是整数求余运算,其结果是x整除以y后剩余的余数,如5 mod 3 = 2。

这样得:

(e,n),是用于加密的公共密钥,可以公开出去;以及

(d,n),是用于解密的专用钥匙,必须保密。

(2) 加密过程。使用(e,n)对明文m进行加密,算法为:

(12-3);

这里的c即是m加密后的密文。

(3) 解密过程。使用(d,n)对密文c进行解密,算法为:

(12-4);

求得的m即为对应于密文c的明文。

RSA算法实现起来十分简捷,据说英国的一位程序员只用了3行Perl程序便实现了加密和解密运算。

RSA算法建立在正整数求余运算基础之上,同时还保持了指数运算的性质,这一点我们不难证明。例如:

(12-5);

(12-6)。

RSA公共密钥加密算法的核心是欧拉(Euler)函数ψ。对于正整数n,ψ(n)定义为小于n且与n互质的正整数的个数。例如ψ(6) = 2,这是因为小于6且与6互质的数有1和5共两个数;再如ψ(7) = 6,这是因为互质数有1,2,3,5,6共6个。

欧拉在公元前300多年就发现了ψ函数的一个十分有趣的性质,那就是对于任意小于n且与n互质的正整数m,总有mψ(n) mod n = 1。例如,5ψ(6) mod 6 = 52 mod 6= 25 mod 6 =1。也就是说,在对n求余的运算下,ψ(n)指数具有周期性。

当n很小时,计算ψ(n)并不难,使用穷举法即可求出;但当n很大时,计算ψ(n)就十分困难了,其运算量与判断n是否为质数的情况相当。不过在特殊情况下,利用ψ函数的两个性质,可以极大地减少运算量。

性质1:如果p是质数,则ψ(p) = (p-1)。

性质2:如果p与q均为质数,则ψ(p·q) = ψ(p)·ψ(q) = (p-1)(q-1)。

RSA算法正是注意到这两条性质来设计公共密钥加密系统的,p与q的乘积n可以作为公共密钥公布出来,而n的因子p和q则包含在专用密钥中,可以用来解密。如果解密需要用到ψ(n),收信方由于知道因子p和q,可以方便地算出ψ(n) = (p-1)(q-1)。如果窃听者窃得了n,但由于不知道它的因子p与q,则很难求出ψ(n)。这时,窃听者要么强行算出ψ(n),要么对n进行因数分解求得p与q。然而,我们知道,在大数范围内作合数分解是十分困难的,因此窃密者很难成功。

有了关于ψ函数的认识,我们再来分析RSA算法的工作原理:

(1) 密钥配制。设m是要加密的信息,任选两个大质数p与q,使得 ;选择正整数e,使得e与ψ(n) = (p-1)(q-1)互质。

利用辗转相除法,计算d,使得ed mod ψ(n) = ,即ed = kψ(n) +1,其中k为某一正整数。

公共密钥为(e,n),其中没有包含任何有关n的因子p和q的信息。

专用密钥为(d,n),其中d隐含有因子p和q的信息。

(2) 加密过程。使用公式(12-3)对明文m进行加密,得密文c。

(3) 解密过程。使用(d,n)对密文c进行解密,计算过程为:

cd mod n = (me mod n)d mod n

= med mod n

= m(kψ(n) + 1) mod n

= (mkψ(n) mod n)·(m mod n)

= m

m即为从密文c中恢复出来的明文。

例如,假设我们需要加密的明文代码信息为m = 14,则:

选择e = 3,p = 5,q = 11;

计算出n = p·q = 55,(p-1)(q-1) = 40,d = 27;

可以验证:(e·d) mod (p-1)(q-1) = 81 mod 40 = 1;

加密:c = me mod n = 143 mod 55 = 49;

解密:m = cd mod n = 4927 mod 55 = 14。

关于RSA算法,还有几点需要进一步说明:

(1) 之所以要求e与(p-1)(q-1)互质,是为了保证 ed mod (p-1)(q-1)有解。

(2) 实际 *** 作时,通常先选定e,再找出并确定质数p和q,使得计算出d后它们能满足公式(12-3)。常用的e有3和65537,这两个数都是费马序列中的数。费马序列是以17世纪法国数学家费马命名的序列。

(3) 破密者主要通过将n分解成p·q的办法来解密,不过目前还没有办法证明这是唯一的办法,也可能有更有效的方法,因为因数分解问题毕竟是一个不断发展的领域,自从RSA算法发明以来,人们已经发现了不少有效的因数分解方法,在一定程度上降低了破译RSA算法的难度,但至今还没有出现动摇RSA算法根基的方法。

(4) 在RSA算法中,n的长度是控制该算法可靠性的重要因素。目前129位、甚至155位的RSA加密勉强可解,但目前大多数加密程序均采用231、308甚至616位的RSA算法,因此RSA加密还是相当安全的。

据专家测算,攻破512位密钥RSA算法大约需要8个月时间;而一个768位密钥RSA算法在2004年之前无法攻破。现在,在技术上还无法预测攻破具有2048位密钥的RSA加密算法需要多少时间。美国Lotus公司悬赏1亿美元,奖励能破译其Domino产品中1024位密钥的RSA算法的人。从这个意义上说,遵照SET协议开发的电子商务系统是绝对安全的。

以上就是关于编写程序实现RSA算法对数据进行加密和解密全部的内容,包括:编写程序实现RSA算法对数据进行加密和解密、rsa算法实现代码、在密码学中的rsa算法是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9740564.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存