欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java实现的RSA加密算法详解

程序员文章站 2023-12-09 17:57:39
本文实例讲述了java实现的rsa加密算法。分享给大家供大家参考,具体如下: 一、什么是非对称加密 1、加密的密钥与加密的密钥不相同,这样的加密算法称之为非对称加密...

本文实例讲述了java实现的rsa加密算法。分享给大家供大家参考,具体如下:

一、什么是非对称加密

1、加密的密钥与加密的密钥不相同,这样的加密算法称之为非对称加密

2、密钥分为:公钥,私钥

公钥:可以对外给任何人的加密和解密的密码,是公开的
私钥:通过私钥可以生成公钥,但从公钥被认为无法生成公钥(被推导出的概率小到不考虑)

3、当将要加密的内容用公钥加密的时候,只能用私钥来解密

当将要加密的内容用私钥加密的时候,只能用公钥来解密

4、公钥与私钥的关系,利用一个简单的公式来生成公钥和私钥,即非对称加密的公钥和私钥之间存在某一个公式关系

5、常见的非对称加密算法

rsa,dsa

二、什么是rsa算法

rsa算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。

rsa的算法涉及三个参数,n、e1、e2。

其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。

e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。

(n,e1),(n,e2)就是密钥对。其中(n,e1)为公钥,(n,e2)为私钥。

rsa加解密的算法完全相同,设a为明文,b为密文,则:a=b^e2 mod n;b=a^e1 mod n;(公钥加密*中,一般用公钥加密,私钥解密)

e1和e2可以互换使用,即:

a=b^e1 mod n;b=a^e2 mod n;

三、rsa加密算法的使用

1、rsa密钥的生成,返回一个keypair对象

keypair 用于非对称加密,keypair中包含了一个公钥和一个私钥

/**
* 通过指定的密钥长度生成非对称的密钥对
* @param keysize 推荐使用1024,2048 ,不允许低于1024
* @return
*/
public static keypair generatersakeypair(int keysize){
    keypair ret = null;
    try {
      //1、准备生成
      keypairgenerator generator = keypairgenerator.getinstance("rsa");
      //2、初始化,设置秘钥长度
      generator.initialize(keysize);
      //3、生成,并且返回
      ret = generator.generatekeypair();
    } catch (nosuchalgorithmexception e) {
      e.printstacktrace();
    }
    return ret;
}

2、获取私钥和公钥

publickey 和 privatekey 都是key类型的

keypair keypair = encryptutil.generatersakeypair(1024);
//获取公钥,可以给任何人
publickey publickey = keypair.getpublic();
 //获取私钥
privatekey privatekey = keypair.getprivate();

3、rsa加密

/**
* rsa 加密
* @param data 需要加密的数据
* @param key 可以是 publickey,也可以是privatekey
* @return
*/
public static byte[] rsaencrypt(byte[] data ,key key){
    byte[] ret = null;
    if (data != null
        && data.length>0
        && key!=null) {
      // 1、创建cipher 使用rsa
      try {
        cipher cipher = cipher.getinstance("rsa");
        //设置key
        cipher.init(cipher.encrypt_mode,key);
        ret = cipher.dofinal(data);
      } catch (nosuchalgorithmexception e) {
        e.printstacktrace();
      } catch (nosuchpaddingexception e) {
        e.printstacktrace();
      } catch (invalidkeyexception e) {
        e.printstacktrace();
      } catch (badpaddingexception e) {
        e.printstacktrace();
      } catch (illegalblocksizeexception e) {
        e.printstacktrace();
      }
    }
    return ret;
}

4、rsa解密

/**
* rsa 解密
* @param data 要解密的数据
* @param key 可以是 publickey,也可以是privatekey
* @return
*/
public static byte[] rsadecrypt(byte[] data ,key key){
    byte[] ret = null;
    if (data != null
        && data.length>0
        && key!=null) {
      // 1、创建cipher 使用rsa
      try {
        cipher cipher = cipher.getinstance("rsa");
        //设置key
        cipher.init(cipher.decrypt_mode,key);
        ret = cipher.dofinal(data);
      } catch (nosuchalgorithmexception e) {
        e.printstacktrace();
      } catch (nosuchpaddingexception e) {
        e.printstacktrace();
      } catch (invalidkeyexception e) {
        e.printstacktrace();
      } catch (badpaddingexception e) {
        e.printstacktrace();
      } catch (illegalblocksizeexception e) {
        e.printstacktrace();
      }
    }
    return ret;
}

5、公钥与私钥的存储

一对公钥和私钥创建好之后,我们需要存储起来以后使用

//获得公钥 私钥
privatekey privatekey = keypair.getprivate();
publickey publickey = keypair.getpublic();
//编码将publickey和privatekey对象转换为字节数组,该字节数组为公钥、私钥的实际数据
byte[] publickeyencoded = publickey.getencoded();
byte[] privatekeyencoded = privatekey.getencoded();
//将字节数组通过base64编码算法 编码成可见的字符形式
string publickey = base64.encodetostring(publickeyencoded, base64.no_wrap);
string privatekey = base64.encodetostring(privatekeyencoded, base64.no_wrap);
//进行存储操作
 。。。。

6、公钥与私钥的加载

通常 1、获取密钥对 2、获取公钥、私钥 3、保存公钥、私钥,保存形式基本为字符串形式

那么在以后的使用中就需要获取公钥和私钥来使用

需要知道:

6.1、keyfactory可以来加载相应的公钥和私钥
6.2、公钥加载 使用 x509encodedkeyspec(byte[])
6.3、私钥加载 使用 pcks8encodedkeyspec(byte[])

//获取公钥
//str_publickey 为公钥字符串形式数据(公钥先编码成byte[] 在 形成字符串)
//解码
byte[] publicdecode = base64.decode(new string(str_publickey), base64.no_wrap);
//构造x509encodedkeyspec对象
x509encodedkeyspec publickeyspec = new x509encodedkeyspec(publicdecode);
//指定加密算法
keyfactory keyfactory = keyfactory.getinstance("rsa");
//取得公钥
publickey publickey = keyfactory.generatepublic(publickeyspec);
//解码
//获取私钥
//str_private 为私钥字符串形式的数据
byte[] privatedecode = base64.decode(new string(str_private), base64.no_wrap);
//构造x509encodedkeyspec对象
pkcs8encodedkeyspec privatekeyspec = new pkcs8encodedkeyspec(privatedecode);
//指定加密算法
keyfactory = keyfactory.getinstance("rsa");
//取得私钥
privatekey privatekey = keyfactory.generateprivate(privatekeyspec);

ps:关于加密解密感兴趣的朋友还可以参考本站在线工具:

md5在线加密工具:
http://tools.jb51.net/password/createmd5password

迅雷、快车、旋风url加密/解密工具:

在线散列/哈希算法加密工具:

在线md5/hash/sha-1/sha-2/sha-256/sha-512/sha-3/ripemd-160加密工具:

在线sha1/sha224/sha256/sha384/sha512加密工具:

更多关于java相关内容感兴趣的读者可查看本站专题:《java数学运算技巧总结》、《java数据结构与算法教程》、《java字符与字符串操作技巧总结》、《java日期与时间操作技巧汇总》、《java操作dom节点技巧总结》和《java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。