https://www.cnblogs.com/liemng/p/6699257.html

写这篇博客其实是有点意外的,来源最初也算是入职当前这家公司算吧,由于项目要求数据几乎都进行了加密(政府项目么!!!),当时看到这块就想好好看看这块的东西,苦于时间一直寻找不开,慢慢的都忘记了,忽然有天在网上看到一些关于加密的博客,讨论到说支付宝这样的商业软件加密是如何进行操作,后来了解了下,由于我是做android开发的所以我想当然的就下载了一个支付宝的android版本,进阶着就是迫不及待的改后缀,然后看看内部构造,发现支付宝的.so文件是超级多,那么问题来了,对于支付宝这样当量的用户,放到android 的java层去加密肯定是不合适的,这里来源于java语言的不安全性的考虑。多的不说apk的反编译,一旦反编译了看到了你java加密算法,卧槽,那问题就大了去了,估计马云爸爸想杀人的新都有,那么很显然对于支付宝而言肯定不能这么干,那么多的.so就很能说明问题了(加密是通过jni使用C代码实现的加密)。

  那么到了这里加密基本算是确认了,要是想保证你的数据的安全放到.so里会更加的安全(android上才有的东西哈).

  说道加密那么就进入到本篇博客的主题,加密算法之RSA非对称的加密算法。直译为私钥加密,公钥解密。其实也是很简单了,私钥只要你自己知道就好了,这样就能保证加密的数据只能你自己才能解密。公钥可以公开,公钥仅仅是用于加密的,是无法用于去解密数据的。

  RSA非对称的算法,也是不可逆的,不可逆就是无法根据公钥得到其算法,然后根据公钥去获去私钥!!!

  好了 ,基本的讲解就这些吧,紧接着一起来看下关于Java中的一些RSA的使用吧!!!

  Java使用分为三步走战略!!!

    1,生成私钥和秘钥

    2,公钥加密

    3,私钥解密

  看到这里是不是很so easy.

  java代码生成私钥和秘钥如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
     *生成私钥  公钥
     */
    public static void geration(){
        KeyPairGenerator keyPairGenerator;
        try {
            keyPairGenerator = KeyPairGenerator.getInstance("RSA");
            SecureRandom secureRandom = new SecureRandom(new Date().toString().getBytes()); 
            keyPairGenerator.initialize(1024, secureRandom); 
            KeyPair keyPair = keyPairGenerator.genKeyPair(); 
            byte[] publicKeyBytes = keyPair.getPublic().getEncoded(); 
            FileOutputStream fos = new FileOutputStream(PUBLIC_KEY_PATH);  
            fos.write(publicKeyBytes);  
            fos.close(); 
            byte[] privateKeyBytes = keyPair.getPrivate().getEncoded(); 
            fos = new FileOutputStream(PRIVATE_KEY_PATH);  
            fos.write(privateKeyBytes);  
            fos.close(); 
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }  
    }

  

  获去公钥代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
 * 获取公钥
 * @param filename
 * @return
 * @throws Exception
 */
public static PublicKey getPublicKey(String filename) throws Exception { 
    File f = new File(filename); 
    FileInputStream fis = new FileInputStream(f);  
    DataInputStream dis = new DataInputStream(fis); 
    byte[] keyBytes = new byte[(int)f.length()];
    dis.readFully(keyBytes);  
    dis.close();
    X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes); 
    KeyFactory kf = KeyFactory.getInstance("RSA");  
    return kf.generatePublic(spec); 
} 

  获去私钥的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
  * 获取私钥
  * @param filename
  * @return
  * @throws Exception
  */
 public static PrivateKey getPrivateKey(String filename)throws Exception { 
     File f = new File(filename); 
     FileInputStream fis = new FileInputStream(f); 
     DataInputStream dis = new DataInputStream(fis); 
     byte[] keyBytes = new byte[(int)f.length()]; 
     dis.readFully(keyBytes); 
     dis.close(); 
     PKCS8EncodedKeySpec spec =new PKCS8EncodedKeySpec(keyBytes); 
     KeyFactory kf = KeyFactory.getInstance("RSA"); 
     return kf.generatePrivate(spec); 
   } 

  测试如上代码的可用性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public static void main(String[] args) {
     
    geration();
      
    String input = "!!!hello world!!!"; 
    RSAPublicKey pubKey;
    RSAPrivateKey privKey;
    byte[] cipherText;
    Cipher cipher;
    try {
        cipher = Cipher.getInstance("RSA");         
        pubKey = (RSAPublicKey) getPublicKey(PUBLIC_KEY_PATH);
        privKey = (RSAPrivateKey) getPrivateKey(PRIVATE_KEY_PATH);
         
        cipher.init(Cipher.ENCRYPT_MODE, pubKey); 
        cipherText = cipher.doFinal(input.getBytes()); 
        //加密后的东西 
        System.out.println("cipher: " + new String(cipherText));         
        //开始解密 
        cipher.init(Cipher.DECRYPT_MODE, privKey);  
        byte[] plainText = cipher.doFinal(cipherText); 
        System.out.println("publickey: " + Base64.getEncoder().encode(cipherText));
        System.out.println("plain : " + new String(plainText));
    } catch (Exception e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } 
} 

  测试结果如下:

1
2
3
cipher: D?:?=羖O縜?,^辀?$偞/致?2懁B鏣靴臧??2e嗀|?,w馋i纂W俞:&圼?G6?弑橰H桞℉鬜?=)^呸b???;皒Ddm`苣+.+?
?:& ??#f-?扴8eE]?(
plain : !!!hello world!!!

  如上是RSA加密的java版本

  

  当然上述最终生成的byte写入到了一个文件中。如果你感觉这样和你不方便你也可以直接用base64编码成一个字符串,保留下来。

  

1
2
3
使用Base64.getEncoder().encodeToString(keyBytes)进行编译
 
使用Base64.getDecoder().decode(PUBLIC_KEY)进行解码

  

你得有足够的实力,你的原则和底线才会被人尊重。

Java RSA公钥加密,私钥解密算法的尝试的更多相关文章

  1. Java RSA 公钥加密私钥解密

    package com.lee.utils; import java.io.DataInputStream; import java.io.File; import java.io.FileInput ...

  2. RSA 公钥加密——私钥解密

    作者:刘巍然-学酥链接:http://www.zhihu.com/question/25912483/answer/31653639来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  3. RSA公钥加密-私钥解密/私钥加密-公钥解密

    package com.tebon.ams.util;import org.apache.commons.codec.binary.Base64;import org.apache.log4j.Log ...

  4. RSA公钥加密私钥解密

    公司的项目需要电科院测评,必须保证数据的完整性和保密性,为这两个特性不得不搞个RSA+SHA1加密. 页面处理过程: 每次登录前,先向后端发送请求,由RSA生成一对公钥和私钥,获取公钥中的模modul ...

  5. RSA 加密算法 Java 公钥加密私钥解密 和 私钥加密公钥解密 的特点

    package com.smt.cipher.unsymmetry; import org.apache.commons.codec.binary.Base64; import org.apache. ...

  6. RSA加解密工具类RSAUtils.java,实现公钥加密私钥解密和私钥解密公钥解密

    package com.geostar.gfstack.cas.util; import org.apache.commons.codec.binary.Base64; import javax.cr ...

  7. C# 基于大整数类的RSA算法实现(公钥加密私钥解密,私钥加密公钥解密)

    但是C#自带的RSA算法类RSACryptoServiceProvider只支持公钥加密私钥解密,即数字证书的使用. 所以参考了一些网上的资料写了一个RSA的算法实现.算法实现是基于网上提供的一个大整 ...

  8. RSA不对称加密,公钥加密私钥解密,私钥加密公钥解密

    RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一 ...

  9. C#中使用OpenSSL的公钥加密/私钥解密

    在C#中进行公钥加密/私钥解密,需要用RSACryptoServiceProvider,但是它不支持由OpenSSL生成的公钥/私钥字符串. 比如这样的公钥/私钥对( 公私钥生成方法见 http:// ...

随机推荐

  1. ios开发之--系统控件显示中文

    虽然一直知道X-code肯定提供有语言本地化的设置地方,但是一直也做个记录,有些时候的汉化,还是需要使用代码去控制,键盘的右下角.navagiton的return使用代码修改,调用系统相机时,也是出现 ...

  2. 第二十一篇:Linux 操作系统中的进程结构

    前言 在 Linux 中,一个正在执行的程序往往由各种各样的进程组成,这些进程除了父子关系,还有其他的关系.依赖于这些关系,所有进程构成一个整体,给用户提供完整的服务( 考虑到了终端,即与用户的交互 ...

  3. C语言字符串的输入输出

    字符串的输出 在C语言中,输出字符串的函数有两个: puts():直接输出字符串,并且只能输出字符串. printf():通过格式控制符 %s 输出字符串.除了字符串,printf() 还能输出其他类 ...

  4. 《C++ Primer Plus》学习笔记0

    Hello,World! 本书版本:<C++ Primer Plus(第6版)中文版>C++是在C语言基础上开发的一种集面向对象编程.泛型编程和过程化编程于一体的编程语言,是C语言的超集. ...

  5. Maven创建一个Web项目

    我们可以通过命令行或者直接使用Eclipse创建一个maven webapp项目:通过命令行创建在命令行中输入如下格式的命令将会创建一个新的maven webapp项目:mvn archetype:g ...

  6. boost::archive::text_oarchive

    Serialization的中文解释是“串行化” .“序列化”或者“持久化” ,就是将内存中的对象保存到磁盘中,等到程序再次运行的时候再读取磁盘中的文件恢复原来的对象.下面来看一个简单的例子: #in ...

  7. jquery如何获取type=hidden的input元素的值?

    function setHiddenFields() { var hiddens = $("input:hidden"); $.each(hiddens, function (in ...

  8. Ibatis的#和$的区别

    来自别人的:https://blog.csdn.net/findmyself_for_world/article/details/49976555 总结:凡是#的,都作为参数,用setobject方式 ...

  9. MyBatis映射示例

    resultMap 返回结果的映射 resultMap的id是这个映射的名字,可在查询语句中引用表示此查询返回该结果: t ype是模型对象的类名,也可以写成别名(简化作用) 简化成别名时,需要先注册 ...

  10. SpringBoot--属性加载顺序

    属性加载顺序: 1.在命令行中传入的参数: 2.SPRING_APPLICATION_JSON中的属性:SPRING_APPLICATION_JSON是以JSON格式配置在系统环境变量中内容: 3.j ...