条理清晰的入门:使用Java实现RSA加密解密

  • 什么是RSA
  • 使用Java
    • 需要导入的头文件
    • 生成公钥、私钥
    • 进行加密解密
    • 密钥的存储
    • 密文的存储、读取

什么是RSA

翻一下以前的密码学笔记,找到了!

虽然字很潦草,但还是依稀可辨。简单的说就是基于大数分解的困难性,造就了RSA的难破解性。不想打字,latexlatexlatex 太麻烦了。

使用Java

Java Doc里面有很多有用的东西,想详细了解可以直接看文档。可以直接在线看,也可以下载到本地看。

需要导入的头文件

如果你要直接复制粘贴,那么会有很多错误,懒得一个个点击导入就直接复制导入吧。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.UUID;
import javax.crypto.Cipher;

生成公钥、私钥

/* 生成公私钥 */
KeyPairGenerator keyPairGenerator = null;
try {keyPairGenerator = KeyPairGenerator.getInstance("RSA"); //NoSuchAlgorithmException
} catch (Exception e) {e.printStackTrace();
}
keyPairGenerator.initialize(2048); // 此处可以添加参数new SecureRandom(UUID.randomUUID().toString().getBytes())
KeyPair keyPair = keyPairGenerator.generateKeyPair();
RSAPublicKey rsaPublicKey = (RSAPublicKey)keyPair.getPublic();
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)keyPair.getPrivate();

上面几行代码已经产生了可以直接使用的公钥、私钥了。

进行加密解密

好了,有了密钥之后怎么进行加密、解密呢?以下为:

  1. 私钥加密 公钥解密
  2. 公钥加密 私钥解密
        /* 私钥加密 公钥解密 */try {Cipher cipher = Cipher.getInstance("RSA"); //NoSuchPaddingExceptioncipher.init(Cipher.ENCRYPT_MODE,rsaPrivateKey); //InvalidKeyExceptionbyte[] b = cipher.doFinal("12345678".getBytes()); //BadPaddingExceptionSystem.out.println(new String(b));cipher.init(Cipher.DECRYPT_MODE,rsaPublicKey);b = cipher.doFinal(b);System.out.println(new String(b));}catch (Exception e) {e.printStackTrace();}/* 公钥加密 私钥解密 */try {Cipher cipher = Cipher.getInstance("RSA"); //NoSuchPaddingExceptioncipher.init(Cipher.ENCRYPT_MODE,rsaPublicKey); //InvalidKeyExceptionbyte[] b = cipher.doFinal("12345678".getBytes()); //BadPaddingExceptionSystem.out.println(new String(b));cipher.init(Cipher.DECRYPT_MODE,rsaPrivateKey);b = cipher.doFinal(b);System.out.println(new String(b));}catch (Exception e) {e.printStackTrace();}

这里需要注意的是,根据密钥位数不同,一次可被加密的长度也是不同的,在上面使用了2048的加密位数,那么一次加密只能256字节。
可能会看到有的加密长度是 “2048/8 - 11 ”,那么这个“ - 11 ”是什么意思呢?我们知道明文过长需要进行分组( padding ),既然要分组,就必然有分组标准:RSA_PKCS1_PADDING、RSA_PKCS1_OAEP_PADDING、RSA_NO_PADDING。而“ - 11 ”就是第一个标准的填充方式,详细了解就网上搜索吧。

        /* 根据长度判断是否需要分组 */System.out.println(rsaPrivateKey.getModulus().bitLength() / 8);System.out.println(rsaPublicKey.getModulus().bitLength() / 8);

密钥的存储

存储必然是使用文件来存储的,查询文档,发现密钥可以转化为字节,同时字节也能转化回密钥。到这里发现问题很简单了。
但是这里要注意的是,转化为字节存储到文件是简单的,但是从文件读取到字节( byte []),一次读取可能不能读取完整整个文件,需要多次读取,那么多次读取的字节放到哪里呢,在这里我使用了将读取的字节转换为字符串( String ),进行拼接之后再还原回字节。
那么问题就出现了,字节转到到字符串再转化回来,这个过程其实是会出现问题的,如图可以看到byte []原长度和转化后的长度是不一样的。这里的解决方式是,将字节进行Base64编码再转为字符串,转回的时候则进行相应的Base64解码操作。

        /* 公私钥与字符串的转换 */
try {Base64.Decoder decoder = Base64.getDecoder();Base64.Encoder encoder = Base64.getEncoder();String publicKeyString = encoder.encodeToString(rsaPublicKey.getEncoded());String privateKeyString = encoder.encodeToString(rsaPrivateKey.getEncoded());System.out.println(publicKeyString);System.out.println(privateKeyString);KeyFactory keyFactory = KeyFactory.getInstance("RSA"); //NoSuchAlgorithmExceptionbyte[] keyBytes = decoder.decode(publicKeyString);X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes);keyFactory.generatePublic(x509EncodedKeySpec); //InvalidKeySepcExceptionkeyBytes = decoder.decode(privateKeyString);PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(keyBytes);keyFactory.generatePrivate(pkcs8EncodedKeySpec); //InvalidKeySepcException
} catch (Exception e) {e.printStackTrace();
}

以上代码只进行了到字符串的转换,如果需要存储到文件中,那么只需要

FileOutputStream fos = new FileOutputStream("C:\\Users\\XXX\\Desktop\\private");
fos.write(encoder.encodeToString(rsaPrivateKey.getEncoded()).getBytes());

密文的存储、读取

看到密钥的存储需要进行Base64的编码解码,那么不禁想,密文是不是也同样需要呢?
答案是可以需要,也可以不需要。
既然要对密文进行解密,那么私钥或者公钥是一定已经有的,在获取密钥之后,我们可以计算出每段加密完成之后密文的字节数,每次按照这个字节数进行文件的读取,读取后直接解密成字符串即可。

/* 写入 */
FileOutputStream fospass = new FileOutputStream("C:\\Users\\XXX\\Desktop\\password");
byte [] buffer = new byte[256];
b = cipher.doFinal( (“XXX" + "\r\n\r\n").getBytes());
fospass.write(b);
fospass.close();/* 读取 */
FileInputStream fis = new FileInputStream("..\\password");
byte [] buffer = new byte[256];
fis.read(buffer);
fis.close();
s = new String(cipher.doFinal(buffer));

OK,到这里使用Java进行RSA加密、解密的整个流程就很清楚了。

条理清晰的入门:使用Java实现RSA加密解密相关推荐

  1. Java使用RSA加密解密签名及校验

    RSA加密解密类: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; i ...

  2. Java使用RSA加密解密及签名校验

    该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1.jar 注意: RSA加密明文最大长度117字节,解密要求密文最大长度为128字节,所以在加密和解密的过程中需要分块 ...

  3. java android rsa加密解密_Android RSA加密解密

    转载 http://blog.csdn.net/bbld_/article/details/38777491 RSA是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十 ...

  4. Java实现RSA加密解密、数字签名及验签

    RSA公钥加密算法是1977年由罗纳德-李维斯特(Ron Rivest).阿迪-萨莫尔(Adi Shamir)和伦纳德-阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院 ...

  5. java android rsa加密解密_Android RSA数据加密与Java服务端RSA私钥解密出错问题

    1. 出错描述:服务RSA解密抛出javax.crypto.BadPaddingException: Decryption error 2.出错原因:Android系统使用的虚拟机(dalvik)跟S ...

  6. java php rsa加密解密算法_PHP rsa加密解密算法原理解析

    php服务端与客户端交互.提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一个例子来说明如何用php来实现数据的加密解密 1.加密解密的 ...

  7. java rsa 解密_Java中RSA加密解密的实现方法分析

    本文实例讲述了Java中RSA加密解密的实现方法.分享给大家供大家参考,具体如下: public static void main(String[] args) throws Exception { ...

  8. python rsa加密解密_RSA加密解密(python版)

    RSA的算法涉及三个参数,n.e.d. 其中,n是两个大质数p.q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度. e1和d是一对相关的值,e可以任意取,但要求e与(p-1)*(q-1)互质: ...

  9. springboot RSA加密解密

    spring boot 使用RSA非对称加密,前后端传递参数加解密 java实现RSA 加密解密

最新文章

  1. Vue 中定义方法页面上使用
  2. Linux监控服务命令
  3. ADO.NET知识汇总
  4. STM32F4_USART配置及细节描述
  5. rxjs为什么用的人少_工伤为什么公司不怕打官司
  6. linux高级的脚本,【2018.07.23学习笔记】【linux高级知识 Shell脚本编程练习】
  7. 什么样的人不适合当程序员呢?
  8. npm构建vue项目
  9. Vue项目部署到服务器上路由无法访问的问题
  10. 极速办公(word)字体如何设置为斜体
  11. 软件测试典型缺陷分析,软件测试缺陷分析方法简介
  12. vcf文件格式详细解释
  13. pythonarray去除inf_python 中numpy快速去除nan, inf的方法
  14. zzuli OJ 1011:圆柱体表面积
  15. 20181214-python-tips
  16. 计算机ppt基础操作心得体会,word计算机实训心得体会.doc
  17. shell清除cach
  18. [译] 现代浏览器内部揭秘(第一部分)
  19. php处理大数据量数据的思路
  20. VMware的 Mount虚拟光驱问题

热门文章

  1. 腾讯会议多开一个账号同时登陆手机和电脑
  2. java学习第十八天
  3. 低配版点燃我温暖你爱心代码
  4. 好用的JSON格式化工具
  5. 15个热门Java面试项目整合,吃透它,大厂offer拿到手软
  6. [Activeden] slick full website template with cms and 2 skins 中文版
  7. python泡泡_Python实现Windows上气泡提醒效果的方法
  8. Jenkins自动构建(CI/DI)项目(一)
  9. OSG for Android实现VPB地形,倾斜影像与三维模型加载
  10. 炒股如何办理开户手续