RSA加密算法实现 Java

简介:

  Java为我们实现了MD5、RSA两种常用的加密算法,这在我们的开发中也大量使用。


        一般是第三方采用公钥加密,服务器采用私钥解密。私钥一般不做加密处理。但是为了数据间的相互通信,服务器怎么发送数据呢,一般采用的是两对公私钥匙。服务器发送数据,也采用第三方的公钥,第三方接收数据后用自己的私钥解密。

        总结一句话,服务器保存自己的私钥,第三方的公钥。第三方亦然。

         签名:一般采用服务器私钥加密,生成签名,然后客户端公钥解密,验证签名。

数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。

    签名的好处:保证信息传输的完整性、发送者的身份认证、防止交易中的抵赖发生。

    总结:既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出公钥负责加密,私钥负责解密;同理,

既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以可得出私钥负责签名,公钥负责验证。

   

RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要壹对密钥,使用其中壹個加密,则需要用另壹個才能解密。
RSA的算法涉及三个参数,ne1e2
其中,n 是两个大质数 p的积,参数 n 用二进制表示时所占用的位数,就是所谓的密钥长度,目前市场上常用的密钥长度多是1024位。
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 为明文,为密文,则:A = B^e2 mod n;B = A^e1 mod n;(公钥加密体制中,一般用公钥加密,私钥解密)
e1 和 e2 可以互换使用,即:A = B^e1 mod n;B = A^e2 mod n;

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package  com.lijianbo.util;
 
import  java.io.FileInputStream;
import  java.io.FileOutputStream;
import  java.io.ObjectInputStream;
import  java.io.ObjectOutputStream;
import  java.security.Key;
import  java.security.KeyPair;
import  java.security.KeyPairGenerator;
import  java.security.SecureRandom;
import  javax.crypto.Cipher;
/**
  * RSA加密算法,加密解密过程
  * 生成秘钥对            公钥、私钥
  * @author bbo
  *
  */
public  class  RSAUtil {
     
     //指定加密算法为RSA
     private  static  String ALGORITHM =  "RSA" ;
     //指定key的大小
     private  static  int  KEYSIZE =  1024 ;
     //指定公钥存放文件和私钥存放文件
     private  static  String PUBLIC_KEY_FILE =  "src/public.key" ;
     private  static  String PRIVATE_KEY_FILE =  "src/private.key" ;
     
     //生成公钥和私钥并分别存放在文件中
     private  static  void  generateKeyPair()  throws  Exception{
        //生成密钥对
        KeyPairGenerator kpg = KeyPairGenerator.getInstance(ALGORITHM);
        kpg.initialize(KEYSIZE,  new  SecureRandom());
        KeyPair kp = kpg.generateKeyPair();
        //通过密钥对分别得到公钥和私钥
        Key publicKey = kp.getPublic();
        Key privateKey = kp.getPrivate();
        //将生成的密钥写入文件
        ObjectOutputStream output1 =  new  ObjectOutputStream( new  FileOutputStream(PUBLIC_KEY_FILE));
        ObjectOutputStream output2 =  new  ObjectOutputStream( new  FileOutputStream(PRIVATE_KEY_FILE));
        output1.writeObject(publicKey);
        output2.writeObject(privateKey);
        output1.close();
        output2.close();
     }
     
     //RSA  公钥加密方法
     public  static  String encrypt(String source, String publicKeyFile)  throws  Exception {
         //读出文件中的公钥对象
         ObjectInputStream ois =  new  ObjectInputStream( new  FileInputStream(publicKeyFile));
         Key key = (Key) ois.readObject();
         ois.close();
         //得到Cipher对象来实现对源数据的RSA加密
         Cipher cipher = Cipher.getInstance(ALGORITHM);
         cipher.init(Cipher.ENCRYPT_MODE, key);
         byte [] b = source.getBytes();
         String cryptograph = Base64Utils.encode(cipher.doFinal(b));
         return  cryptograph;
     }
     
     //RSA  私钥解密方法
     public  static  String decrypt(String cryptograph, String privateKeyFile)  throws  Exception {
        //读出文件中的私钥对象
        ObjectInputStream input =  new  ObjectInputStream( new  FileInputStream(privateKeyFile));
        Key key = (Key) input.readObject();
      //  System.out.println("私钥为:"+key.toString());
        input.close();
        //对已经加密的数据进行RSA解密
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte [] b1 = Base64Utils.decode(cryptograph);
        //执行解密操作
        byte [] b = cipher.doFinal(b1);
        String source =  new  String(b);
        return  source;
     }
 
     //调用方法举例
     public  static  void  main(String[] args) {
         String source =  "RSA加密解密过程--成都欢迎你" ;
         System.out.println( "明文字符串:["  + source +  "]" );
         try {
             //生成可用的密钥对并分别保存在文件中
             generateKeyPair();
             System.out.println( "生成的公钥文件为:"  + PUBLIC_KEY_FILE +  ", 生成的私钥文件为:"  + PRIVATE_KEY_FILE);
             String cryptograph = encrypt(source, PUBLIC_KEY_FILE); //公钥生成的密文
             System.out.println( "加密之后的字符串为:["  + cryptograph +  "]" );
             String text = decrypt(cryptograph, PRIVATE_KEY_FILE); //私钥解密密文
             System.out.println( "解密之后的字符串为:["  + text +  "]" );
         } catch (Exception e){
             System.out.println( "加解密过程中发生错误:"  + e.getMessage());
             return ;
         }
     }
}

编码工具类:

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
package  com.lijianbo.util;
 
import  org.apache.commons.codec.binary.Base64;
 
 
/**
  * @author bbo
  * BASE64编码
  */
public  class  Base64Utils {
     //编码
     public  static  String encode( final  byte [] Encp) {
         if  (ObjectUtils.isEmpty(Encp)) {
             return  null ;
         }
         return  Base64.encodeBase64String(Encp); //编码
     }
     //解码
     public  static  byte [] decode( final  String Decp) {
         if  (ObjectUtils.isEmpty(Decp)) {
             return  null ;
         }
         return  Base64.decodeBase64(Decp); //解码
     }
}


运行结果为:

1
2
3
4
明文字符串:[RSA加密解密过程--成都欢迎你]
生成的公钥文件为:src/public.key, 生成的私钥文件为:src/private.key
加密之后的字符串为:[bNckGX9OWwXmaDfoSKnw8sL2PwQJaYCflWipXpKs6RPhz7TIFCy9+yoBl1u94t7oeRWosx6hIXFUwXZBjkpx31Myq9rH+I5acSabWvowf2BKrpxs18X7vw26rkohI4E1ldoWfmWIM8iLC9WFek3FIx5V01GTHTQXjtSAsqFGa/M=]
解密之后的字符串为:[RSA加密解密过程--成都欢迎你]



      本文转自建波李 51CTO博客,原文链接:http://blog.51cto.com/jianboli/1886901,如需转载请自行联系原作者








相关文章
|
4天前
|
算法 数据安全/隐私保护
对称密钥加密算法和公开密钥加密算法有什么区别
【4月更文挑战第19天】对称密钥和公开密钥加密算法各有特点:对称密钥加密速度快,适用于大量数据,但密钥管理困难;公开密钥加密安全性高,密钥管理方便,但速度慢,常用于数字签名和身份验证。两者在不同场景下有不同优势。
21 6
|
Java 数据安全/隐私保护
Java实现最电话号码的简单加密源码
Java实现最电话号码的简单加密源码
18 0
|
Java 数据安全/隐私保护
java实现加密电话号码,有具体的加密流程注释
java实现加密电话号码,有具体的加密流程注释
21 0
|
1天前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
|
17天前
|
算法 安全 Java
java代码 实现AES_CMAC 算法测试
该代码实现了一个AES-CMAC算法的简单测试,使用Bouncy Castle作为安全提供者。静态变量K定义了固定密钥。`Aes_Cmac`函数接受密钥和消息,返回AES-CMAC生成的MAC值。在`main`方法中,程序对给定的消息进行AES-CMAC加密,然后模拟接收ECU的加密结果并进行比较。如果两者匹配,输出"验证成功",否则输出"验证失败"。辅助方法包括将字节转为16进制字符串和将16进制字符串转为字节。
|
17天前
|
Java 数据安全/隐私保护
java base64 加密 解密
java base64 加密 解密
|
26天前
|
存储 算法 JavaScript
Java入门高频考查算法逻辑基础知识3-编程篇(超详细18题1.8万字参考编程实现)
解决这类问题时,建议采取下面的步骤: 理解数学原理:确保你懂得基本的数学公式和法则,这对于制定解决方案至关重要。 优化算法:了解时间复杂度和空间复杂度,并寻找优化的机会。特别注意避免不必要的重复计算。 代码实践:多编写实践代码,并确保你的代码是高效、清晰且稳健的。 错误检查和测试:要为你的代码编写测试案例,测试标准的、边缘情况以及异常输入。 进行复杂问题简化:面对复杂的问题时,先尝试简化问题,然后逐步分析和解决。 沟通和解释:在编写代码的时候清晰地沟通你的思路,不仅要写出正确的代码,还要能向面试官解释你的
33 0
|
27天前
|
编解码 算法 安全
【Java技术专题】「入门到精通系列」深入探索Java技术中常用到的六种加密技术和实现
【Java技术专题】「入门到精通系列」深入探索Java技术中常用到的六种加密技术和实现
45 0
|
1月前
|
安全 Java 数据安全/隐私保护
提升 Java 编程安全性 - 代码加密混淆工具的重要性和应用
提升 Java 编程安全性 - 代码加密混淆工具的重要性和应用
|
1月前
|
安全 小程序 Java
java实现微信服务(公众)号用户关注时,获取openid,安全模式下的加密解密实现
java实现微信服务(公众)号用户关注时,获取openid,安全模式下的加密解密实现
19 0