1  RSA算法的原理如下:
1.1原理
     假设我们需要将信息从机器A传到机器B,首先由机器B随机确定一个Key,我们称之为密匙private_key,将这个可KEY始终保存在机器B中而不发出来;然后,由这个private_key计算出另一个Key,我们称之为公匙Public_key。这个Public_key的特性是几乎不可能通过该Key计算生成它的private_key。接下来通过网络把这个Public_key传给机器A,
机器A受到Public_key后,利用该key,将信息加密,并把加密后的信息通过网络发送到机器B,最后机器B利用已知的private_key,就可以解开加密信息。
1.2步骤
RSA算法的安全性依赖于大数因数分解的困难性。公匙和私匙都是两个大素数的函数。
1.2.1
     首先选择两个大素数p、q,计算n=p*q; m=(p-1)*(q-1);
1.2.2
     而后随机选择加密密匙Public_key,要求和m互质,比如Public_key=m-1;
1.2.3
利用欧几里德算法计算解密密匙private_key,使private_key满足
Public_key*private_key三1(mod m)
其中Public_key,n是公匙,private_key是密匙
1.2.4
加密信息text时,利用公式secretword=text^Public_key (mod n)得到密文secretword
1.2.5
解密时利用公式word=text^private_key(mod n)得到原文word=text.。

2程序
本算法用JAVA编程语言实现,开发环境为Eclipse
//BJTU 软件0404  
import java.io.*;

public class Rsa 
{
    private int p=0;
    private int q=0;
    private long n=0;
    private long m=0;
    
    private long public_key=0;//公匙
    private long private_key=0;//密匙
    
    private long text=0;//明文
    private long secretword=0;//密文
    private long word=0;//解密后明文
    
    //判断是否为素数
    public boolean primenumber(long t)
    {
        long k=0;
        k=(long)Math.sqrt((double)t);
        boolean flag=true;
        outer:for(int i=2;i<=k;i++)
        {
            if((t%i)==0)
            {
                flag = false;
                break outer;
            }
        }
        return flag;
    }
    //输入PQ
    public void inputPQ()throws Exception
    {
        do{
                System.out.println("请输入素数p: ");
                BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
                String br=stdin.readLine();
                this.p=Integer.parseInt(br);
         }
        while(!primenumber(this.p));
        do{
            System.out.println("请输入素数q: ");
            BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
            String br=stdin.readLine();
            this.q=Integer.parseInt(br);
        }
        while(!primenumber(this.q));
        this.n=this.p*this.q;
        this.m=(p-1)*(q-1);
        System.out.println("这两个素数的乘积为p*q:"+this.n);
        System.out.println("所得的小于N并且与N互素的整数的个数为m=(p-1)(q-1):"+this.m);
    }
    //求最大公约数
    public long gcd(long a,long b)
    {
        long gcd;
        if(b==0)
            gcd=a;
        else
            gcd=gcd(b,a%b);
        System.out.println("gcd:"+gcd);
        return gcd;
        
    }
    //输入公匙
    public void getPublic_key()throws Exception
    {
        do{
            System.out.println("请输入一个公钥的值,这个值要求小于m并且和m互质: ");
            BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
            String br=stdin.readLine();
            this.public_key=Long.parseLong(br);
        }while((this.public_key >= this.m) || (this.gcd(this.m,this.public_key)!=1));
        System.out.println("公钥为:"+this.public_key);
    }
    //计算得到密匙
    public void getPrivate_key()
    {
        long value=1;
        outer:for(long i=1;;i++)
        {
            value=i*this.m+1;
            System.out.println("value:  "+value);
            if((value%this.public_key==0)&& (value/this.public_key < this.m))
            {
                this.private_key=value/this.public_key;
                break outer;
            }
        }
        System.out.println("产生的一个私钥为:"+this.private_key);
    }
    //输入明文
    public void getText()throws Exception
    {
        System.out.println("请输入明文:");
        BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
        String br=stdin.readLine();
        this.text=Long.parseLong(br);
    }
    //加密、解密计算
    public long colum(long y,long n,long key)
    {
        long mul;
        if(key==1)
            mul=y%n;
        else 
            mul=y*this.colum(y,n,key-1)%n;
        return mul;
    }
    
    //加密后解密
    public void pascolum()throws Exception
    {
        this.getText();
        System.out.println("输入明文为: "+this.text);
        //加密
        this.secretword=this.colum(this.text,this.n,this.public_key);
        System.out.println("所得的密文为:"+this.secretword);
        //解密
        this.word=this.colum(this.secretword,this.n,this.private_key);
        System.out.println("解密后所得的明文为:"+this.word);
        
    }
    public static void main(String []args)throws Exception
    {
        Rsa t = new Rsa();
        t.inputPQ();
        t.getPublic_key();
        t.getPrivate_key();
        t.pascolum();
    }

}
3试验介绍
2.1输入PQ,计算m、n
 
3.2输入公匙,产生密匙
 
3.3输入明文,产生密文,并解密
此处时间限制,明文暂时用个数字代替,有兴趣的可以改变程序,变成一段数字

请输入素数p: 
23
请输入素数q: 
29
这两个素数的乘积为p*q:667
所得的小于N并且与N互素的整数的个数为m=(p-1)(q-1):616
请输入一个公钥的值,这个值要求小于m并且和m互质: 
611
gcd:1
gcd:1
gcd:1
gcd:1
公钥为:611
产生的一个私钥为:123
请输入明文:
311
输入明文为: 311
所得的密文为:653
解密后所得的明文为:311

转载于:https://www.cnblogs.com/javaTest/archive/2012/06/20/2589092.html

java处理加密文件---实现RSA算法相关推荐

  1. 第十九篇:JAVA加密解密之RSA算法

    RSA算法简介 RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年首 ...

  2. java pdf加密文件,java使用itext为pdf文件设置密码保护

    我们可以使用itext的PdfWriter类的setEncryption方法来为pdf文件设置密码 package com.open.pdf; import java.io.File; import ...

  3. java exchange 数字证书认证_java处理加密文件---数字证书文件格式(cer和pfx)的区别 - 数安时代(GDCA)SSL证书官网...

    java处理加密文件中常见的两种数字证书文件格式(cer和pfx) 数字证书文件格式(cer和pfx)的区别 1.带有私钥的证书 由Public Key Cryptography Standards ...

  4. RSA算法以及所涉及的数论定理的简单证明

    理解RSA算法需要了解的数论定理全家桶 前言 "≡\equiv≡"符号的使用和模运算的规律简述 RSA算法 RSA算法的加密解密过程 RSA算法的加密解密实例 RSA算法的证明 欧 ...

  5. Java代码实现非对称加密RSA算法示例

    非对称加密:有两把密钥:使用公钥加密,必须使用私钥解密:或者使用私钥加密,必须使用公钥解密 加解密核心类:Cipher 下面代码是使用RSA算法加解密的一个示例,实现过程包括:生成密钥对,把公钥和私钥 ...

  6. Java DES、AES、RSA、DM5读取文件加密解密

    //下面代码是直接读取文件来进行加密解密,算法文件 package Test; import javax.crypto.KeyGenerator; import javax.crypto.Cipher ...

  7. golang通过RSA算法生成token,go从配置文件中注入密钥文件,go从文件中读取密钥文件,go RSA算法下token生成与解析;go java token共用

    RSA算法 token生成与解析 本文演示两种方式,一种是把密钥文件放在配置文件中,一种是把密钥文件本身放入项目或者容器中. 下面两种的区别在于私钥公钥的初始化, init方法,需要哪种取哪种. 通过 ...

  8. 数据传输加密——非对称加密算法RSA+对称算法AES(适用于java,android和Web)

    本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 转载请注明出处:http://blog.csdn.net/chay_chan/article/details/58605605 数据 ...

  9. JAVA RSA算法加密实现 eclipse

    RSA算法加密实现 一.实验目的 学习经典的RSA公钥加密算法的基本原理和特点,能够编写简单的代码实现RSA公钥加密和私钥解密的过程. 二.实验要求 1. 熟悉RSA公私钥加密算法. 2. 掌握如何使 ...

最新文章

  1. Visual Studio中的《C# 语言规范》
  2. 2017年云栖大会-云HBase专场会后资料-欢迎扩散
  3. 乌兰浩特市大数据平台助力就业脱贫
  4. 小程序首页获取数据给数组赋值,实现加载更多,以及遇到的坑
  5. dart参数传方法_为 JavaScript 开发人员准备的 Dart 参考教程
  6. 开始写博客,毕业一年的收获
  7. koa --- 监听路由,并使用模板引擎渲染显示
  8. mysql进阶3_MySQL进阶
  9. 给你安利一款国产良心软件uTools
  10. mysql简单增删改查(CRUD)
  11. centos 如何测udp端口是否开放_如何测试端口通不通(四种方法)
  12. 网页版数据库管理工具
  13. php里面像素怎么表示,php检索图片像素最接近的色值位置
  14. 构建一个 CLI 工具
  15. 思科PC远程控制交换机和路由器
  16. 找工作需要有工作经验,而没工作就没工作经验。如何理解这种死循环?
  17. Element ui 组件中用键盘事件
  18. 第七期 | 网约车司机的“捞偏门”手段:作弊抢单、空跑刷单
  19. kotlin(java) 文件压缩
  20. revit建模中复合墙与叠层墙区别?Revit中怎么创建叠层墙?

热门文章

  1. android怎么看错误日志,android运行错误日志帮看下 不懂啊
  2. easymock接口模拟_EasyMock部分模拟
  3. android mvvm_Android MVVM设计模式
  4. 三元运算符和if else_PHP If-Else,Switch Case和速记三元运算符示例
  5. scala面试问题_Scala高级面试问答
  6. Java软件开发中,常用的工具有哪些?
  7. 学好C++能够从事哪些岗位?
  8. C++基础教程之数据结构
  9. 想做C++软件开发工程师,我该如何去学习?
  10. Java基础篇:构造函数