Java RSA公钥加密,私钥解密算法的尝试

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)进行解码

原文地址:https://www.cnblogs.com/yaowen/p/9120908.html

时间: 2024-08-28 05:04:08

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

RSA公钥加密—私钥解密&私钥加密—公钥解密&私钥签名—公钥验证签名

关于RSA算法,前面有介绍,点击打开链接. 这里直接有实现. 代码太多就不直接贴了,免积分下载. http://download.csdn.net/detail/acmjk/7310847 RSA公钥加密-私钥解密&私钥加密-公钥解密&私钥签名-公钥验证签名,布布扣,bubuko.com

RSA 公钥加密——私钥解密

作者:刘巍然-学酥链接:http://www.zhihu.com/question/25912483/answer/31653639来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 我们来回顾一下RSA的加密算法.我们从公钥加密算法和签名算法的定义出发,用比较规范的语言来描述这一算法. RSA公钥加密体制包含如下3个算法:KeyGen(密钥生成算法),Encrypt(加密算法)以及Decrypt(解密算法). .密钥生成算法以安全常数作为输入,输出一个公钥PK,和一

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

RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一.RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价. .NET提供常用的加密算法类,支持RSA的类是RSACryptoServiceProvider(命名空间:System.Security.Cryptography),但只支持公钥加密,私钥解密.RSACr

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

在C#中进行公钥加密/私钥解密,需要用RSACryptoServiceProvider,但是它不支持由OpenSSL生成的公钥/私钥字符串. 比如这样的公钥/私钥对: 公钥 -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7PyjMEuniN6BPn8oqzIZ6AO1N jSTO9R3adCCIwKfKIEoWXXM+tHDpktdPKSaAsWJPTNAGvEvtxOfzXib/EMXKqD0e Uy5Mat

php与java通用AES加密解密算法

php与java通用AES加密解密算法 AES指高级加密标准(Advanced Encryption Standard),是当前最流行的一种密码算法,在web应用开发,特别是对外提供接口时经常会用到,下面是我整理的一套php与java通用的AES加密解密算法. php版代码如下: <?php class CryptAES { protected $cipher = MCRYPT_RIJNDAEL_128; protected $mode = MCRYPT_MODE_ECB; protected

java RSA公钥加密,私钥解密算法例子

"非对称加密算法". (1)乙方生成两把密钥(公钥和私钥).公钥是公开的,任何人都可以获得,私钥则是保密的. (2)甲方获取乙方的公钥,然后用它对信息加密. (3)乙方得到加密后的信息,用私钥解密. 如果公钥加密的信息只有私钥解得开,那么只要私钥不泄漏,通信就是安全的.公钥用于加密, 私钥用于解密. RSA 是一种非对称加密算法,一般很难破解,因此一些要求比较高的系统通常会采用rsa加密算法,一般来说用RSA加密有如下几个步骤. 1. 生成公钥与私钥 2. 用公钥对需要加密的字符串等进

私钥加密公钥解密或者公钥加密私钥解密有意义吗?

"1.如果是私钥加密,公钥解密的话,因为公钥是公开出来的,所以拿到公钥的人 ,是可以解密报文的,我认为这种加密方式没意义." 你理解有误. 这种场景是用作签名的, 就是校验信息发送者身份. 只有通过特定私钥的的信息才能被公开出来的公钥解密. 这就唯一确定了信息发送者, 达到签名(不可抵赖)的目的. "2.如果是公钥加密,私钥解密的话,因为公钥是公开出来的,所以系统是无法识别请求就是指定系统发送的,也就是别人是可以模拟你的报文,请求你的系统." 这种场景是做信息加密用

java 实现 DES加密 解密算法

DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种:加密或解密.  DES算法是这样工作的:如Mode为加密,则用Key 去把数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果:如 Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果.在通信网络的两端,双方约定一致

java之--加密、解密算法

0.概述 在项目开发中,我们常需要用到加解密算法,加解密算法主要分为三大类: 1.对称加密算法,如:AES.DES.3DES 2.非对称加密算法,如:RSA.DSA.ECC 3.散列算法,如:MD5.SHA1.HMAC 1.各算法对比 不废话,直接开表格对比: 对称加密算法(加解密密钥相同) 名称 密钥长度 运算速度 安全性 资源消耗 DES 56位 较快 低 中 3DES 112位或168位 慢 中 高 AES 128.192.256位 快 高 低 非对称算法(加密密钥和解密密钥不同) 名称