JAVA实现RSA加密解密

标签: java rsa 加密 | 发表时间:2015-03-20 19:51 | 作者:u013400939
出处:http://blog.csdn.net

RSA 工具类。提供加密,解密,生成密钥对等方法。 

RSA加密原理概述   :
RSA的安全性依赖于大数的分解,公钥和私钥都是两个大素数(大于100的十进制位)的函数。
据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积   
密钥的产生:   
 1.选择两个大素数 p,q ,计算 n=p*q;   
 2.随机选择加密密钥 e ,要求 e 和 (p-1)*(q-1)互质   
 3.利用 Euclid 算法计算解密密钥 d , 使其满足 e*d = 1(mod(p-1)*(q-1)) (其中 n,d 也要互质)   
 4:至此得出公钥为 (n,e) 私钥为 (n,d)   
 RSA速度   
 由于进行的都是大数计算,使得RSA最快的情况也比DES慢上100倍,无论 是软件还是硬件实现。   
 速度一直是RSA的缺陷。一般来说只用于少量数据 加密。

package com.security.rsa;

import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

import javax.crypto.Cipher;
public class RSAsecurity {

public static String src="RSA 加密字符串";        
public void priENpubDE() {

    try {
      //1.初始化秘钥
     KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
     //秘钥长度
     keyPairGenerator.initialize(512);
     //初始化秘钥对
     KeyPair keyPair = keyPairGenerator.generateKeyPair();
     //公钥
     RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
     //私钥
     RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();

    //2.私钥加密,公钥解密----加密
     //生成私钥
     PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
     KeyFactory keyFactory =KeyFactory.getInstance("RSA");
     PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
     //Cipher类为加密和解密提供密码功能,通过getinstance实例化对象
     Cipher cipher =Cipher.getInstance("RSA");
     //初始化加密
     cipher.init(Cipher.ENCRYPT_MODE,privateKey);
     byte[] result = cipher.doFinal(src.getBytes());
     System.out.println("私钥加密,公钥解密----加密:"+Base64.encode(result));
     
     
     //3.私钥加密,公钥解密----解密
     //生成公钥
     X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
     keyFactory=KeyFactory.getInstance("RSA");
     PublicKey publicKey= keyFactory.generatePublic(x509EncodedKeySpec);
     cipher = Cipher.getInstance("RSA");
     //初始化解密
     cipher.init(Cipher.DECRYPT_MODE,publicKey);
     result = cipher.doFinal(result);
     System.out.println("私钥加密,公钥解密----解密:"+new String(result));
    } catch (Exception e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
 }
    
         
}
  
  
    
   public void pubENpriDE() {

       try {
         //1.初始化秘钥
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        //秘钥长度
        keyPairGenerator.initialize(512);
        //初始化秘钥对
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        //公钥
        RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
        //私钥
        RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();

       
        
        
        //2.公钥加密,私钥解密----加密
       X509EncodedKeySpec x509EncodedKeySpec=new X509EncodedKeySpec(rsaPublicKey.getEncoded());
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
     //初始化加密
    //Cipher类为加密和解密提供密码功能,通过getinstance实例化对象
    Cipher cipher =Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE,publicKey);
     //加密字符串
    byte[] result = cipher.doFinal(src.getBytes());
     System.out.println("公钥加密,私钥解密----加密:"+Base64.encode(result));
     
     //3.公钥加密,私钥解密-----解密
   PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());     
     keyFactory=KeyFactory.getInstance("RSA");
   PrivateKey  privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
     //初始化解密
     cipher.init(Cipher.DECRYPT_MODE, privateKey);
     //解密字符串
     result = cipher.doFinal(result);
     System.out.println("公钥加密,私钥解密-----解密:"+new String(result));
     
       } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
       
            
}
}

测试:

package com.secutiry.rsa;

import com.security.rsa.RSAsecurity;

public class RSAtest {
public static void main(String[] args) {
    RSAsecurity rsAsecurity = new RSAsecurity();
    System.out.println("私钥加密公钥解密例:");
    rsAsecurity.priENpubDE();
    System.out.println("公钥加密私钥解密例:");
    rsAsecurity.pubENpriDE();
         
}
}
测试结果:



源代码 下载地址

http://download.csdn.net/download/u013400939/8517989 点击打开链接


作者:u013400939 发表于2015/3/20 13:19:12 原文链接
阅读:40 评论:0 查看评论

相关 [java rsa 加密] 推荐:

JAVA实现RSA加密解密

- - CSDN博客推荐文章
提供加密,解密,生成密钥对等方法. RSA加密原理概述   :. RSA的安全性依赖于大数的分解,公钥和私钥都是两个大素数(大于100的十进制位)的函数. 据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积   .  1.选择两个大素数 p,q ,计算 n=p*q;   .  2.随机选择加密密钥 e ,要求 e 和 (p-1)*(q-1)互质   .

一个基于RSA算法的Java数字签名例子

- - 行业应用 - ITeye博客
  网络数据安全包括数据的本身的安全性、数据的完整性(防止篡改)、数据来源的不可否认性等要素. 对数据采用加密算法加密可以保证数据本身的安全性,利用消息摘要可以保证数据的完整性,但是还有一点就是数据来源的不可否认性(也就是数据来自哪里接收者是清楚的,而且发送数据者不可抵赖).         有些方案曾经使用消息认证码(MAC)来保证数据来源于合法的发送着,但是利用消息认证码会带来一个问题,就是通讯双方必须事先约定两者之间的通讯用共享密码.

iOS、Android、java服务端 DES+RSA安全传输统一实现

- - 移动开发 - ITeye博客
工作中遇到了安全传输问题,需要解决iOS和Android客户端跟java服务端的安全传输问题,结合对HTTPS的了解,便使用DES+RSA方式模拟HTTPS. 在实现过程中,遇到了一些瓶颈,主要是保持平台兼容性的问题,Android和服务的还可以,统一使用java API,但要包含iOS就比较麻烦了,参考了网上很多资料,忙了三四天,终于搞通了.

iOS中使用RSA对数据进行加密解密

- - ITeye博客
RSA算法是一种非对称加密算法,常被用于加密数据传输.如果配合上数字摘要算法, 也可以用于文件签名.. 本文将讨论如何在iOS中使用RSA传输加密数据.. openssl-1.0.1j, openssl需要使用1.x版本, 推荐使用[homebrew](http://brew.sh/)安装.. RSA使用"秘匙对"对数据进行加密解密.在加密解密数据前,需要先生成公钥(public key)和私钥(private key)..

使用RSA非对称加密JWT | 燃情岁月

- -
JWT几乎是当前分布式开发中无状态token的最佳选择,被越来越多的开发者接受和使用, JWT是基于加密算法的认证方式,省去了到认证服务器的校验过程,认证效率大大提高. 更详细的关于JWT的介绍可以点击 这里查看. 通常大家在使用JWT的时候都是使用 HmacSHA256加密钥的加密方式,这种方式严格依赖密钥,在分布式开发的过程中,通常是由认证服务器生成 JWT,然后再由资源校验 JWT的有效性,那么这时候资源服务器就也需要密钥了,认证服务和资源服务很可能是不同的团队开发和维护,密钥在这个过程中传递,很有可能泄漏.

你真的了解 RSA 加密算法吗?

- - 掘金 后端
博客: https://bugstack.cn. 源码: https://github.com/fuzhengwei/java-algorithms. 沉淀、分享、成长,让自己和他人都能有所收获. 记得那是我毕业后的第一个秋天,申请了域名,搭建了论坛. 可惜好景不长,没多久进入论坛后就出现各种乱七八糟的广告,而这些广告压根都不是我加的.

Java 进行 RSA 加解密时不得不考虑到的那些事儿

- - zzm
加密的系统不要具备解密的功能,否则 RSA 可能不太合适. 加密的系统和解密的系统分开部署,加密的系统不应该同时具备解密的功能,这样即使黑客攻破了加密系统,他拿到的也只是一堆无法破解的密文数据. 否则的话,你就要考虑你的场景是否有必要用 RSA 了. 可以通过修改生成密钥的长度来调整密文长度. 生成密文的长度等于密钥长度.

对文件压缩加密/解密解压缩的例子,DES/RSA [转]

- - 行业应用 - ITeye博客
RSA压缩加密/解压缩解密. * 对文件压缩加密/解密解压缩 对象类.   // 如果传入的是目录.    // 创建压缩的子目录.    // 把压缩文件加入rar中.   * 对directory目录下的文件压缩,保存为指定的文件zipFile.   * 解压缩文件zipFile保存在directory目录下.

RSA加密、解密、签名、验签的原理及方法 - PC君 - 博客园

- -
  RSA加密是一种非对称加密. 可以在不直接传递密钥的情况下,完成解密. 这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险. 是由一对密钥来进行加解密的过程,分别称为公钥和私钥. 两者之间有数学相关,该加密算法的原理就是对一极大整数做因数分解的困难性来保证安全性. 通常个人保存私钥,公钥是公开的(可能同时多人持有).

RSA非对称加密算法详解_u013073067的博客-CSDN博客_rsa算法

- -
RSA加密算法是最常用的非对称加密算法,由 罗纳德·李维斯特(Ron Rivest)、 阿迪·萨莫尔(Adi Shamir)和 伦纳德·阿德曼(Leonard Adleman)于1977年一起提出,RSA就是他们三人姓氏开头字母拼在一起组成的. 非对称加密算法的特点就是加密秘钥和解密秘钥不同,秘钥分为公钥和私钥,用私钥加密的明文,只能用公钥解密;用公钥加密的明文,只能用私钥解密.