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的有效性,那么这时候资源服务器就也需要密钥了,认证服务和资源服务很可能是不同的团队开发和维护,密钥在这个过程中传递,很有可能泄漏.

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

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

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

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

RSA算法原理(二)

- - 阮一峰的网络日志
上一次,我介绍了一些 数论知识. 有了这些知识,我们就可以看懂 RSA算法. 这是目前地球上最重要的加密算法. 我们通过一个例子,来理解RSA算法. 假设 爱丽丝要与鲍勃进行加密通信,她该怎么生成公钥和私钥呢. 第一步,随机选择两个不相等的质数p和q. (实际应用中,这两个质数越大,就越难破解.

RSA算法原理(一)

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

RSA的SecureID token数据被偷了?

- ripwu - 张志强的网络日志
博客 » 记事本 » 密码学 ». WSJ报道:RSA承认其数据被偷,4000万SecureID token需要被更新. 中国银行银行密钥用的就是RSA生产,就是下图这玩意儿,手里有这玩意儿的同学们要小心了(当然,如果你的账户里的钱没有6位数以上,也不用太担心,毕竟网银的安全性不全依赖于这个设备):.