当前位置:首页 » 密码管理 » rsa加密算法的实现

rsa加密算法的实现

发布时间: 2022-02-26 02:12:46

❶ RSA算法的实现

RSA毕业设计论文
http://wenku..com/view/8b1804c42cc58bd63186bd77.html

❷ RSA加密算法原理

RSA加密算法是一种典型的非对称加密算法,它基于大数的因式分解数学难题,它也是应用最广泛的非对称加密算法,于1978年由美国麻省理工学院(MIT)的三位学着:Ron Rivest、Adi Shamir 和 Leonard Adleman 共同提出。

它的原理较为简单,假设有消息发送方A和消息接收方B,通过下面的几个步骤,就可以完成消息的加密传递:
消息发送方A在本地构建密钥对,公钥和私钥;
消息发送方A将产生的公钥发送给消息接收方B;
B向A发送数据时,通过公钥进行加密,A接收到数据后通过私钥进行解密,完成一次通信;
反之,A向B发送数据时,通过私钥对数据进行加密,B接收到数据后通过公钥进行解密。
由于公钥是消息发送方A暴露给消息接收方B的,所以这种方式也存在一定的安全隐患,如果公钥在数据传输过程中泄漏,则A通过私钥加密的数据就可能被解密。
如果要建立更安全的加密消息传递模型,需要消息发送方和消息接收方各构建一套密钥对,并分别将各自的公钥暴露给对方,在进行消息传递时,A通过B的公钥对数据加密,B接收到消息通过B的私钥进行解密,反之,B通过A的公钥进行加密,A接收到消息后通过A的私钥进行解密。
当然,这种方式可能存在数据传递被模拟的隐患,但可以通过数字签名等技术进行安全性的进一步提升。由于存在多次的非对称加解密,这种方式带来的效率问题也更加严重。

❸ rsa的加密算法可以使用什么软件实现密码加密

您可以多尝试一些加密软件,我是用的是隐身侠加密软件,给用户名密码加密都可以,您可以试试,希望可以帮到您。

❹ 计算机网络中公钥加密技术如何实现RSA算法的

证书密钥的默认时间是一年,有的也不是一年,也都是有期限的,并不是一直是这样啊!

❺ RSA算法的实现细节

首先要使用概率算法来验证随机产生的大的整数是否质数,这样的算法比较快而且可以消除掉大多数非质数。假如有一个数通过了这个测试的话,那么要使用一个精确的测试来保证它的确是一个质数。
除此之外这样找到的p和q还要满足一定的要求,首先它们不能太靠近,此外p-1或q-1的因子不能太小,否则的话N也可以被很快地分解。
此外寻找质数的算法不能给攻击者任何信息,这些质数是怎样找到的,尤其产生随机数的软件必须非常好。要求是随机和不可预测。这两个要求并不相同。一个随机过程可能可以产生一个不相关的数的系列,但假如有人能够预测出(或部分地预测出)这个系列的话,那么它就已经不可靠了。比如有一些非常好的随机数算法,但它们都已经被发表,因此它们不能被使用,因为假如一个攻击者可以猜出p和q一半的位的话,那么他们就已经可以轻而易举地推算出另一半。
此外密钥d必须足够大,1990年有人证明假如p大于q而小于2q(这是一个很经常的情况)而,那么从N和e可以很有效地推算出d。此外e = 2永远不应该被使用。 由于进行的都是大数计算,使得RSA最快的情况也比DES慢上好几倍,无论是软件还是硬件实现。速度一直是RSA的缺陷。一般来说只用于少量数据加密。RSA的速度比对应同样安全级别的对称密码算法要慢1000倍左右。
比起DES和其它对称算法来说,RSA要慢得多。实际上Bob一般使用一种对称算法来加密他的信息,然后用RSA来加密他的比较短的对称密码,然后将用RSA加密的对称密码和用对称算法加密的消息送给Alice。
这样一来对随机数的要求就更高了,尤其对产生对称密码的要求非常高,因为否则的话可以越过RSA来直接攻击对称密码。 1995年有人提出了一种非常意想不到的攻击方式:假如Eve对Alice的硬件有充分的了解,而且知道它对一些特定的消息加密时所需要的时间的话,那么她可以很快地推导出d。这种攻击方式之所以会成立,主要是因为在进行加密时所进行的模指数运算是一个位元一个位元进行的而位元为1所花的运算比位元为0的运算要多很多,因此若能得到多组讯息与其加密时间,就会有机会可以反推出私钥的内容。

❻ RSA加密算法怎样用C语言实现 急急急!!!

/*数据只能是大写字母组成的字符串。
加密的时候,输入Y,然后输入要加密的文本(大写字母)
解密的时候,输入N,然后输入一个整数n表示密文的个数,然后n个整数表示加密时候得到的密文。
*/
/*RSA algorithm */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MM 7081
#define KK 1789
#define PHIM 6912
#define PP 85
typedef char strtype[10000];
int len;
long nume[10000];
int change[126];
char antichange[37];

void initialize()
{ int i;
char c;
for (i = 11, c = 'A'; c <= 'Z'; c ++, i ++)
{ change[c] = i;
antichange[i] = c;
}
}
void changetonum(strtype str)
{ int l = strlen(str), i;
len = 0;
memset(nume, 0, sizeof(nume));
for (i = 0; i < l; i ++)
{ nume[len] = nume[len] * 100 + change[str[i]];
if (i % 2 == 1) len ++;
}
if (i % 2 != 0) len ++;
}
long binamod(long numb, long k)
{ if (k == 0) return 1;
long curr = binamod (numb, k / 2);
if (k % 2 == 0)
return curr * curr % MM;
else return (curr * curr) % MM * numb % MM;
}
long encode(long numb)
{ return binamod(numb, KK);
}
long decode(long numb)
{ return binamod(numb, PP);
}
main()
{ strtype str;
int i, a1, a2;
long curr;
initialize();
puts("Input 'Y' if encoding, otherwise input 'N':");
gets(str);
if (str[0] == 'Y')
{ gets(str);
changetonum(str);
printf("encoded: ");
for (i = 0; i < len; i ++)
{ if (i) putchar('-');
printf(" %ld ", encode(nume[i]));
}
putchar('\n');
}
else
{ scanf("%d", &len);
for (i = 0; i < len; i ++)
{ scanf("%ld", &curr);
curr = decode(curr);
a1 = curr / 100;
a2 = curr % 100;
printf("decoded: ");
if (a1 != 0) putchar(antichange[a1]);
if (a2 != 0) putchar(antichange[a2]);
}
putchar('\n');
}
putchar('\n');
system("PAUSE");
return 0;
}

/*
测试:
输入:
Y
FERMAT
输出:
encoded: 5192 - 2604 - 4222
输入
N
3 5192 2604 4222
输出
decoded: FERMAT
*/

❼ rsa算法实现代码

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

package test;

import java.math.BigInteger;

// 生成一个随机大整数,然后找出比这个整数大的下一个素数
public class Primes {
// 下面的 BigInteger.ZERO 和 BigInteger.ONE 在 JDK 1.1 中是无效的
private static final BigInteger ZERO = BigInteger.ZERO;
private static final BigInteger ONE = BigInteger.ONE;
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) Math.floor(Math.random() * 10);
else
index = 1 + (int) Math.floor(Math.random() * 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)
s.append(randomDigit(false));
else
s.append(randomDigit(true));
return (new BigInteger(s.toString()));
}

private static boolean isEven(BigInteger n) {
// 测试一个大整数是否为偶数
return (n.mod(TWO).equals(ZERO));
}

public static BigInteger nextPrime(BigInteger start) {
// 产生一个比给定大整数 start 大的素数,错误率低于 1/2 的 ERR_VAL 次方
if (isEven(start))
start = start.add(ONE);
else
start = start.add(TWO);
if (start.isProbablePrime(ERR_VAL))
return (start);
else
// 采用递归方式(递归的层数会是个天文数字吗?)
return (nextPrime(start));
}

// 一个基于命令行的测试程序,如果位数错误,默认 150 位,输出 20 个素数
public static void main(String[] args) {
int numDigits;
try {
numDigits = Integer.parseInt(args[0]);
} catch (Exception e) {
numDigits = 128;
}
BigInteger start = bigRandom(numDigits);

start = nextPrime(start);
BigInteger end = bigRandom(5);
end = nextPrime(end);
System.out.println("大素数" + start);
System.out.println("大素数" + end);
BigInteger result = start.multiply(end);
System.out.println("结果数" + result);

❽ 如何利用RSA加密算法编程实现对M=1234567的加密过程

<一>基础
RSA算法非常简单,概述如下:
找两素数p和q
取n=p*q
取t=(p-1)*(q-1)
取任何一个数e,要求满足e< p>
取d*e%t==1
这样最终得到三个数: n d e
设消息为数M (M < p>
设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算法加密算法的实现问题

RSA加密是把数据当作数值运算,而且会进行大数运算,加密算法很慢,建议加密小的数据可采用。你把任何的数据流当字节流来读取,那每个字节就是就是一个数了,分组取决你使用的模长,比如rsa1024,那么每次分片可加密数据的大小是,1024/8-11=117个,为什么减11参见RSA理论。解密每片是1024/8=128个。

❿ RSA加密算法简易演示

RSA算法安全性本质是三大数学困难问题之一也就是大数分解问题,因为目前尚没有一种有效的方法可以在短时间内分解两个大素数的乘积。验证步骤如上面所说的,原理书上有,具体程序实现简单讲一下

  1. 判断质数,这是基本水平,可以穷举也可以建表,按自己喜好

  2. 这一步是计算两个大素数乘积没什么好说的

  3. 判断两个数互质,一般采用欧几里得算法,辗转相除直到得到gcd(e1,m)=1。当然你也可以穷举公因数一直到sqrt(min{e1,m})

  4. 计算乘法逆元是依靠广义欧几里得算法,乘法逆元的意思是形如a*a1 ≡ 1(mod m)这样的(因为这里的群的乘法定义就是数学乘法),a和a1互为彼此模m的逆元,记作a1=a^-1 mod m,只有gcd(a,m)=1时才有唯一解否则无解。

    计算方法是广义欧几里得除法,设r0=m,r1=a,s0=1,s1=0,t0=0,t1=1;

    计算ai=[r(i-1)/ri],r(i+1)=r(i-1)-airi,s(i+1)=s(i-1)-aisi,t(i+1)=t(i-1)-aiti,直到ri=0

    举例如a=7,m=13,计算a^-1 mod m:

    a1=[13/7]=1,r2=r0-a1r1=6,s2=s0-a1s1=1,t2=t0-a1t1=-1;

    a2=[7/6]=1,r3=r1-a2r2=1,s3=s1-a2s2=-1,t3=t1-a2t2=2;

    a3=[6/1]=6,r4=r2-a3r3=0.

    取s=s3=-1,t=t3=2,则有7*2-1*13=1,故a^-1mod m=t=2。

    把上面的方法写成C++算法应该很简单

5和6都是计算同余没什么好说的,记得要用到a^e≡b^e(mod m)化简

要毕业了还搞不懂逆元有点拙计啊,回去好好看看离散数学吧

热点内容
查询最大sql 发布:2025-01-18 11:43:14 浏览:266
网易我的世界服务器添加第三方mod 发布:2025-01-18 11:32:10 浏览:212
oracle批量插入存储过程 发布:2025-01-18 10:49:57 浏览:41
分表存储查询 发布:2025-01-18 10:45:18 浏览:469
缺页算法 发布:2025-01-18 10:40:20 浏览:778
撕裂重罪6游戏电脑需要什么配置 发布:2025-01-18 10:37:23 浏览:444
python大小写忽略 发布:2025-01-18 10:36:13 浏览:441
如何给桌面的游戏加密码 发布:2025-01-18 10:09:34 浏览:231
魅族微信多开安卓怎么弄 发布:2025-01-18 10:04:33 浏览:448
网络设置里没有服务器是什么 发布:2025-01-18 09:52:19 浏览:343