RSA算法

先说下这个算法,RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。

这个算法的名字也是他们三个人名字首字母,RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

package rsa;
import java.math.BigInteger; 

public class RSA {
 private long p,q,e,d,n;
 public RSA(){
  int pIndex = (int)(Math.random()*10);
  int qIndex;
  int eIndex;
  do{
   qIndex = (int)(Math.random()*10);
  }
  while(qIndex==pIndex);
  do{
   eIndex = (int)(Math.random()*10);
  }
  while(eIndex==pIndex||eIndex==pIndex);
  p = 1033;
  q = 2017;
  e = 29437;
  n = p*q;
  d = calculateD();
 }
 private long calculateD(){
  long t0 = 0,t1 = 1,t2 = -1;
  long r0 = (p-1)*(q-1), m = r0,r1 = e ,r2 = -1;
  do{
   long q = r0/r1;
   r2 = r0-r1*q;
   if(r2==0)break;
   t2 = t0 - t1*q;
   while(t2<0){
    t2+=m;
   }
   if(t2>=m){
    t2 %= m;
   }
   r0 = r1;
   r1 = r2;
   t0 = t1;
   t1 = t2;
  }while(r2!=0);
  if(r1!=1){
   return 0;
  }
  else{
   return t2;
  }
 } 

 public long getE() {
  return e;
 }
 public long getN() {
  return n;
 }
 public long getD() {
  return d;
 }
 public BigInteger encode(BigInteger data){
  return pow(data,d).mod(new BigInteger(n+""));
 }
 public BigInteger decode(BigInteger code){
  return pow(code,e).mod(new BigInteger(n+""));
 }
 public BigInteger pow(BigInteger data,long p){
  data = data.pow((int)p);
  return data;
 }
 public static void main(String args[]){
  RSA rsa = new RSA(); 

  BigInteger data = new BigInteger("222222");
  long oldtime = System.currentTimeMillis();
  BigInteger code = rsa.encode(data);
  long newtime = System.currentTimeMillis();
  double codetime = ((double)(newtime-oldtime))/1000;
  oldtime = System.currentTimeMillis();
  BigInteger decode = rsa.decode(code);
  newtime = System.currentTimeMillis();
  double decodetime = ((double)(newtime-oldtime))/1000;
  System.out.println("privateKey:"+rsa.d);
  System.out.println("publickKey:"+rsa.e);
  System.out.println("N:"+rsa.n);
  System.out.println("data:"+data);
  System.out.println("code:"+code+" time:"+codetime);
  System.out.println("decode:"+decode+" time:"+decodetime); 

 } 

}

 

作者:Orson 
出处:http://www.cnblogs.com/java-class/ 
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】 
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】 
如果,您对我的博客内容感兴趣,请继续关注我的后续博客,我是【Orson】 

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段 声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 

转载:http://www.cnblogs.com/java-class/archive/2013/04/11/3012940.html

时间: 2024-09-17 03:58:41

RSA算法的相关文章

RSA算法原理(二)

上一次,我介绍了一些数论知识. 有了这些知识,我们就可以看懂RSA算法.这是目前地球上最重要的加密算法. 六.密钥生成的步骤 我们通过一个例子,来理解RSA算法.假设爱丽丝要与鲍勃进行加密通信,她该怎么生成公钥和私钥呢? 第一步,随机选择两个不相等的质数p和q. 爱丽丝选择了61和53.(实际应用中,这两个质数越大,就越难破解.) 第二步,计算p和q的乘积n. 爱丽丝就把61和53相乘. n = 61×53 = 3233 n的长度就是密钥长度.3233写成二进制是110010100001,一共有

RSA算法原理(一)

如果你问我,哪一种算法最重要? 我可能会回答"公钥加密算法". 因为它是计算机通信安全的基石,保证了加密数据不会被破解.你可以想象一下,信用卡交易被破解的后果. 进入正题之前,我先简单介绍一下,什么是"公钥加密算法". 一.一点历史 1976年以前,所有的加密方法都是同一种模式: (1)甲方选择某一种加密规则,对信息进行加密: (2)乙方使用同一种规则,对信息进行解密. 由于加密和解密使用同样规则(简称"密钥"),这被称为"对称加密算法

基于私钥加密公钥解密的RSA算法C#实现

RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的 考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一.RSA的安全性依 赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价 . RSA的安全性依赖于大数分解.公钥和私钥都是两个大素数( 大于 100 个十进制位)的函数.据猜测,从一个密钥和密文推断出明文的难度等同于分解 两个大素数的积. 密钥对的产生.选择两个大素数,p 和

C#基于大整数类的RSA算法实现(公钥加密解密,私钥加密解密)

最近因为项目需要通过RSA加密来保证客户端与服务端的通信安全.但是C#自 带的RSA算法类RSACryptoServiceProvider只支持公钥加密私钥解密,即数字证 书的使用. 所以参考了一些网上的资料写了一个RSA的算法实现.算法实 现是基于网上提供的一个大整数类. 一.密钥管理 取得密钥主要 是通过2种方式 一种是通过RSACryptoServiceProvider取得: /// <summary> /// RSA算法对象,此处主要用于获取密钥对 /// </summary&g

RSA算法解析

RSA是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作,也很流行.算法的名字以发明者的名字命名:Ron Rivest, Adi Shamir 和Leonard Adleman.但RSA的安全性一直未能得到理论上的证明.它经历了各种攻击,至今未被完全攻破. 它是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作,也很流行.算法的名字以发明者的名字命名:Ron Rivest, Adi Shamir 和Leonard Adleman.但RSA的安全性一直未能得到理论上的证明

安全-rsa算法中私钥能不能是负数

问题描述 rsa算法中私钥能不能是负数 C语言写的函数计算17x+3120y=1的时候x的乘法逆元算出来是-367,请问能不能用负数作为私钥啊? 解决方案 可以.(必须得加上几个字) 解决方案二: http://www.cnblogs.com/Veegin/archive/2011/08/11/2135411.html while(D<=0) D+=(P-1)*(Q-1);//将负逆元转正 解决方案三: 不行.是质数.需要为正

RSA算法使用介绍

原文地址: http://www.devdiv.com/rsa_-blog-20-11254.html RSA是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥.公钥是可发布的供任何人使用,私钥则为自己所有,供解密之用.         解密者拥有私钥,并且将由私钥计算生成的公钥发布给加密者.加密都使用公钥进行加密,并将密文发送到解密者,解密者用私钥解

非对称加密算法-RSA算法

一.概述  1.RSA是基于大数因子分解难题.目前各种主流计算机语言都支持RSA算法的实现  2.java6支持RSA算法  3.RSA算法可以用于数据加密和数字签名  4.RSA算法相对于DES/AES等对称加密算法,他的速度要慢的多  5.总原则:公钥加密,私钥解密  /   私钥加密,公钥解密   二.模型分析 RSA算法构建密钥对简单的很,这里我们还是以甲乙双方发送数据为模型 1.甲方在本地构建密钥对(公钥+私钥),并将公钥公布给乙方 2.甲方将数据用私钥进行加密,发送给乙方 3.乙方用

vs2010 文件包含问题-VS2010 RSA算法软件加密,文件包含运行异常问题!

问题描述 VS2010 RSA算法软件加密,文件包含运行异常问题! VS2010版本,采用RSA算法给软件加密问题.下载MIRACL大数运算库后,添加miracl大数据库中的miracl.h.mirdef.h和ms32.lib到工程后,编译出现以下异常,网上的解决办法都已尝试过,解决不了,在线等! #include "stdafx.h" extern "C" { #include "miracl.h" #include "mirdef.

c++ 编程问题-1024位rsa算法c++实现

问题描述 1024位rsa算法c++实现 我们会再使用RSA(1024位)算法加密, 要求使用C/C++,封装为DLL文件.加密时,输入string,输入string PASS(1024位),输出byte[];解密时,输入byte[],输入PASS该DLL模块调用格式为: RSA_Encode(string 原文,byte密文,string 密钥) RSA_Decode(byte 密文,string 原文,string 密钥) 解决方案 openssl封装一下