设为首页 收藏本站
查看: 729|回复: 0

[经验分享] BouncyCastle RSA加解密类 C#版 兼容JAVA PHP(RSAHelper)

[复制链接]

尚未签到

发表于 2015-8-25 12:58:39 | 显示全部楼层 |阅读模式
  C# RSAHelper类 实现兼容JAVA,PHP的RSA加解密类

DSC0000.gif DSC0001.gif View Code

  1 /// <summary>
  2     /// 杨鑫
  3     /// 2012年10月29日
  4     /// </summary>
  5     public class RSAHelper
  6     {
  7         /// <summary>
  8         /// 数据加密处理
  9         /// </summary>
10         /// <param name="text"></param>
11         /// <returns></returns>
12         public static string EncryptRSA(string text)
13         {
14             string value = "";
15             // System.out.println("encrypt-start:-----------------------------------------------------");
16             try
17             {
18                 //非空验证
19                 if (!string.IsNullOrEmpty(text))
20                 {
21                     string publicKey = "PublicKey.pem";
22
23                     #region 分段加密 解决加密明文过长问题
24
25                     //将字符串转为UTF8编码
26                     text = Convert.ToBase64String(Encoding.GetEncoding("utf-8").GetBytes(text));
27                     text = text.Replace("\r", "").Replace("\n", "");
28
29                     int len = 117;
30                     int m = text.Length / len;
31                     if (m * len != text.Length)
32                     {
33                         m = m + 1;
34                     }
35
36                     for (int i = 0; i < m; i++)
37                     {
38                         string temp = "";
39
40                         if (i < m - 1)
41                         {
42                             temp = text.Substring(i * len, len);//(i + 1) * len
43                         }
44                         else
45                         {
46                             temp = text.Substring(i * len);
47                         }
48
49                         temp = Convert.ToBase64String(Encrypt(Encoding.GetEncoding("utf-8").GetBytes(temp), publicKey));
50                         temp = temp.Replace("\r", "").Replace("\n", "");
51
52                         value += temp;
53                     }
54
55                     #endregion
56                 }
57             }
58             catch (Exception e)
59             {
60                 MessageBox.Show(e.Message);
61             }
62
63             // System.out.println("encrypt-end:-----------------------------------------------------");
64
65             return value;
66         }
67
68         /// <summary>
69         /// 数据解密处理
70         /// </summary>
71         /// <param name="text"></param>
72         /// <returns></returns>
73         public static string DecryptRSA(string text)
74         {
75             string value = "";
76             // System.out.println("decrypt-start:-----------------------------------------------------");
77             try
78             {
79                 if (!string.IsNullOrEmpty(text))
80                 {
81                     //密码文件名
82                     string password = "Password.pem";
83                     //私钥文件名
84                     string privateKey = "PrivateKey.pem";
85
86                     #region 分段解密 解决加密密文过长问题
87                     int len = 172;
88                     int m = text.Length / len;
89                     if (m * len != text.Length)
90                     {
91                         m = m + 1;
92                     }
93
94                     for (int i = 0; i < m; i++)
95                     {
96                         string temp = "";
97
98                         if (i < m - 1)
99                         {
100                             temp = text.Substring(i * len, len);
101                         }
102                         else
103                         {
104                             temp = text.Substring(i * len);
105                         }
106
107                         //解决PHP中文问题
108                         temp = decode64(temp);
109
110                         temp = Encoding.UTF8.GetString(Decrypt(Convert.FromBase64String(temp), privateKey, password));
111                         value += temp;
112
113                     }
114                     #endregion
115
116                     //解决PHP中文问题
117                     value = decode64(value);
118                     value = Encoding.UTF8.GetString(Convert.FromBase64String(value));
119                 }
120             }
121             catch (Exception e)
122             {
123                 MessageBox.Show(e.Message);
124             }
125             // System.out.println("decrypt-end:-----------------------------------------------------");
126
127             return value;
128         }
129
130         /// <summary>
131         /// RSA加密操作 Encrypt方法
132         /// </summary>
133         /// <param name="DataToEncrypt"></param>
134         /// <param name="publicKey"></param>
135         /// <returns></returns>
136         private static byte[] Encrypt(byte[] DataToEncrypt, string publicKey)
137         {
138             try
139             {
140                 PemReader r = new PemReader(new StreamReader(publicKey));//载入公钥文件
141                 Object readObject = r.ReadObject();
142                 //实例化参数实例
143                 AsymmetricKeyParameter pubKey = (AsymmetricKeyParameter)readObject;
144                 IBufferedCipher c = CipherUtilities.GetCipher("RSA/ECB/PKCS1Padding");// 参数与JAVA中解密的参数一致
145                 c.Init(true, pubKey);
146
147                 //int blockSize = c.GetBlockSize();
148                 //c.ProcessBytes(DataToEncrypt);
149
150                 byte[] outBytes = c.DoFinal(DataToEncrypt);
151                 return outBytes;
152             }
153             catch (Exception e)
154             {
155                 MessageBox.Show(e.Message);
156             }
157
158             return null;
159         }
160
161         /// <summary>
162         /// RSA解密操作 Decrypt方法
163         /// </summary>
164         /// <param name="input"></param>
165         /// <param name="privateKey"></param>
166         /// <param name="password"></param>
167         /// <returns></returns>
168         private static byte[] Decrypt(byte[] input, string privateKey, string password)
169         {
170             try
171             {
172                 PemReader r = new PemReader(new StreamReader(privateKey), new Password(new StreamReader(password).ReadToEnd().ToCharArray()));     //载入私钥
173                 Object readObject = r.ReadObject();
174                 AsymmetricKeyParameter priKey = (AsymmetricKeyParameter)readObject;
175                 IBufferedCipher c = CipherUtilities.GetCipher("RSA/ECB/PKCS1Padding");
176                 c.Init(false, priKey);
177
178                 //int blockSize = c.GetBlockSize();
179                 //c.ProcessBytes(input);
180
181                 byte[] outBytes = c.DoFinal(input);
182                 return outBytes;
183             }
184             catch (Exception e)
185             {
186                 MessageBox.Show(e.Message);
187             }
188             return null;
189         }
190
191         /// <summary>
192         /// 解决PHP Base64编码后回车问题
193         /// </summary>
194         /// <param name="text"></param>
195         /// <returns></returns>
196         public static String decode64(String text)
197         {
198             String value = "";
199
200             try
201             {
202                 text = string.IsNullOrEmpty(text) ? "" : text;
203
204                 int len = 64;
205                 int m = text.Length / len;
206                 if (m * len != text.Length)
207                 {
208                     m = m + 1;
209                 }
210
211                 for (int i = 0; i < m; i++)
212                 {
213                     String temp = "";
214
215                     if (i < m - 1)
216                     {
217                         temp = text.Substring(i * len, len);//(i + 1) * len
218                         value += temp + "\r\n";
219                     }
220                     else
221                     {
222                         temp = text.Substring(i * len);
223                         value += temp;
224                     }
225                 }
226             }
227             catch (Exception e)
228             {
229                 MessageBox.Show(e.Message);
230             }
231
232             return value;
233         }
234     }
235
236     /// <summary>
237     /// BouncyCastle 密钥类
238     /// </summary>
239     public class Password : IPasswordFinder
240     {
241         private char[] password;
242
243         public Password(char[] word)
244         {
245             this.password = (char[])word.Clone();
246         }
247
248         public char[] GetPassword()
249         {
250             return (char[])password.Clone();
251         }
252     }  JAVA下的加解密过程 实例代码:
  

View Code

  1 package com.jjlg.webinf;
  2
  3 import java.io.File;
  4 import java.io.FileReader;
  5 import java.security.Key;
  6 import java.security.SecureRandom;
  7 import java.security.Security;
  8
  9 import javax.crypto.Cipher;
10
11 import org.bouncycastle.jce.provider.BouncyCastleProvider;
12 import org.bouncycastle.openssl.PEMReader;
13 import org.bouncycastle.openssl.PasswordFinder;
14
15 import com.jjlg.MyFile;
16 import com.jjlg.MyString;
17
18 import sun.misc.BASE64Decoder;
19 import sun.misc.BASE64Encoder;
20
21 /**
22  * RSA算法,实现数据的加密解密。
23  *
24  * @author ShaoJiang
25  *
26  */
27 public class PhpRsa
28 {
29
30     public static void main(String[] args)
31     {
32         try
33         {
34
35             // 字符串截取测试
36             // String str = "1234567890";
37             // System.out.println(str.substring(0, 5));
38             // System.out.println(str.substring(5, 10));
39
40             // 加密解密测试
41             String text = "一二三四五六七八九十1234567890一二三四五六七八九十1234567890一二三四五六七八九十1234567890一二三四五六七八九十1234567890一二三四五六七八九十1234567890";
42             String encodeString = PhpRsa.encrypt(text);
43             String decodeString = PhpRsa.decrypt(encodeString);
44
45             System.out.println("text=" + text);
46             System.out.println("encodeString=" + encodeString);
47             System.out.println("decodeString=" + decodeString);
48
49             String p = "gO9NZbjwx7bf+MfWPKYP2WkZI72jUwz/EC031V+WkWLEigo04vbvsRyPxv0wJYYVuJ3xQk7OgonTWYfDa3EGXVN45j64SMhxhOdN5242h+ke3GJpyrBUWi/waVc/conAL46sNe6tCtGW7iU/EOl415XoUTX6ns7LdHDRPsxj3d8=";
50             System.out.println(PhpRsa.decrypt(p));
51
52             // String zi =
53             // "山西省太原市小店区abc山西省太原市小23店区平阳路与平阳路西二efa巷交叉口往北米新康隆456商城好的789你好";
54             // zi = new String(zi.getBytes(), "utf-8");
55             // System.out.println(zi);
56             //
57             // String t = (new BASE64Encoder()).encode(zi.getBytes("utf-8"));
58             // String w = new String((new BASE64Decoder()).decodeBuffer(new
59             // String(t.getBytes())), "utf-8");
60             // String e = t.replace("\r\n", "");//
61             // "5bGx6KW/55yB5aSq5Y6f5biC5bCP5bqX5Yy6YWJj5bGx6KW/55yB5aSq5Y6f5biC5bCPMjPlupfljLrlubPpmLPot6/kuI7lubPpmLPot6/opb/kuoxlZmHlt7fkuqTlj4nlj6PlvoDljJfnsbPmlrDlurfpmoY0NTbllYbln47lpb3nmoQ3ODnkvaDlpb0=";
62             // e = new String((new BASE64Decoder()).decodeBuffer(e));
63             // t = t.replace("\r\n", "");
64             // System.out.println(t);
65             // System.out.println(t.length());
66             // System.out.println(w);
67             // System.out.println(w.length());
68             // System.out.println(new String(e.getBytes(), "utf-8"));
69
70             // 中文编码测试
71             // String str = "王某某";
72             // System.out.println("1:" + new String(str.getBytes("utf-8"),
73             // "gb2312"));
74
75             // System.out.println("1:" + new String(str.getBytes("gb2312"),
76             // "utf-8"));
77
78             // String str2 =
79             // "o0glTLeRAaE1LYj6P/jHPQrzUhKozQWSDHSkyv+HbyluAIE7Ao3KPXGWMG2Rg7SAY+G6yCuOQn4DAmwM4QnbQn+I/CUUVCcz8JTco6S6++3I2luZfTMYee6e+KsC+YHXY2VinJ7ubN6hCtKWLckbC68oXBXtKEHfPQ48vZnmcWk=";
80             // System.out.println(PhpRsa.decrypt(str2));
81
82         }
83         catch (Exception e)
84         {
85             e.printStackTrace();
86         }
87     }
88
89     public static String encrypt(String text)
90     {
91         String value = "";
92
93         // System.out.println("encrypt-start:-----------------------------------------------------");
94
95         try
96         {
97             if (text != null && text.length() > 0 && !text.equals(""))
98             {
99                 Security.addProvider(new BouncyCastleProvider());
100
101                 PhpRsa rsa = new PhpRsa();
102                 String path = rsa.getClass().getResource("").getPath();
103                 // System.out.println(path + "PublicKey.pem");
104                 Key publicKey = translatePublicKey(new File(path + "PublicKey.pem"));
105
106                 text = (new BASE64Encoder()).encode(text.getBytes("utf-8"));
107                 text = text.replace("\r", "");
108                 text = text.replace("\n", "");
109                 // System.out.println(text);
110
111                 int len = 117;
112                 int m = text.length() / len;
113                 if (m * len != text.length())
114                 {
115                     m = m + 1;
116                 }
117
118                 for (int i = 0; i < m; i++)
119                 {
120                     String temp = "";
121
122                     if (i < m - 1)
123                     {
124                         temp = text.substring(i * len, (i + 1) * len);
125                     }
126                     else
127                     {
128                         temp = text.substring(i * len);
129                     }
130
131                     // System.out.println(temp);
132                     // System.out.println(temp.length());
133
134                     temp = (new BASE64Encoder()).encode(PhpRsa.encrypt(temp.getBytes(), publicKey));
135                     temp = temp.replace("\r", "");
136                     temp = temp.replace("\n", "");
137
138                     value += temp;
139                 }
140
141                 // System.out.println("encrypt-text:" + text);
142                 // System.out.println("encrypt-value:" + value);
143             }
144
145         }
146         catch (Exception e)
147         {
148             e.printStackTrace();
149         }
150
151         // System.out.println("encrypt-end:-----------------------------------------------------");
152
153         return value;
154     }
155
156     public static String decrypt(String text)
157     {
158         String value = "";
159
160         // System.out.println("decrypt-start:-----------------------------------------------------");
161
162         try
163         {
164             if (text != null && text.length() > 0 && !text.equals(""))
165             {
166                 Security.addProvider(new BouncyCastleProvider());
167
168                 PhpRsa rsa = new PhpRsa();
169                 String path = rsa.getClass().getResource("").getPath();
170                 String password = MyFile.readTxt(path + "Password.pem", "utf-8").replace("\n", "");
171
172                 Key privateKey = translatePrivateKey(new File(path + "PrivateKey.pem"), password);
173
174                 // 分段解密
175                 int len = 172;
176                 int m = text.length() / len;
177                 if (m * len != text.length())
178                 {
179                     m = m + 1;
180                 }
181
182                 for (int i = 0; i < m; i++)
183                 {
184                     String temp = "";
185
186                     if (i < m - 1)
187                     {
188                         temp = text.substring(i * len, (i + 1) * len);
189                     }
190                     else
191                     {
192                         temp = text.substring(i * len);
193                     }
194
195                     // System.out.println(temp);
196                     // System.out.println(temp.length());
197                     temp = PhpRsa.decode64(temp);
198
199                     // System.out.println(temp);
200                     // System.out.println(temp.length());
201
202                     temp = new String(PhpRsa.decrypt((new BASE64Decoder()).decodeBuffer(temp), privateKey), "utf-8");
203
204                     // System.out.println(temp);
205                     // System.out.println(temp.length());
206
207                     value += temp;
208                 }
209
210                 value = PhpRsa.decode64(value);
211                 value = new String((new BASE64Decoder()).decodeBuffer(value), "utf-8");
212
213                 // System.out.println("dencrypt-text:" + text);
214                 // System.out.println("dencrypt-value:" + value);
215             }
216         }
217         catch (Exception e)
218         {
219             e.printStackTrace();
220         }
221
222         // System.out.println("decrypt-end:-----------------------------------------------------");
223
224         return value;
225     }
226
227     public static String decode64(String text)
228     {
229         String value = "";
230
231         try
232         {
233
234             text = MyString.format(text);
235
236             int len = 64;
237             int m = text.length() / len;
238             if (m * len != text.length())
239             {
240                 m = m + 1;
241             }
242
243             for (int i = 0; i < m; i++)
244             {
245                 String temp = "";
246
247                 if (i < m - 1)
248                 {
249                     temp = text.substring(i * len, (i + 1) * len);
250                     value += temp + "\r\n";
251                 }
252                 else
253                 {
254                     temp = text.substring(i * len);
255                     value += temp;
256                 }
257             }
258
259             // System.out.println(value);
260
261         }
262         catch (Exception e)
263         {
264             e.printStackTrace();
265         }
266
267         return value;
268     }
269
270     static public Key translatePublicKey(File pem)
271     {
272         try
273         {
274             PEMReader reader = new PEMReader(new FileReader(pem));
275             Key key = (Key) reader.readObject();
276             reader.close();
277
278             return key;
279         }
280         catch (Exception e)
281         {
282             e.printStackTrace();
283         }
284
285         return null;
286     }
287
288     static public Key translatePrivateKey(File pem, final String password)
289     {
290         try
291         {
292             PEMReader reader = new PEMReader(new FileReader(pem), new PasswordFinder()
293             {
294                 public char[] getPassword()
295                 {
296                     return password.toCharArray();
297                 }
298             });
299             Key key = (Key) reader.readObject();
300             reader.close();
301             return key;
302         }
303         catch (Exception e)
304         {
305             e.printStackTrace();
306         }
307
308         return null;
309     }
310
311     public static byte[] encrypt(byte[] input, Key publicKey)
312     {
313         try
314         {
315             Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
316             cipher.init(Cipher.ENCRYPT_MODE, publicKey, new SecureRandom());
317             return cipher.doFinal(input);
318         }
319         catch (Exception e)
320         {
321             e.printStackTrace();
322         }
323
324         return null;
325     }
326
327     public static byte[] decrypt(byte[] input, Key privateKey)
328     {
329         try
330         {
331             Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
332             cipher.init(Cipher.DECRYPT_MODE, privateKey);
333             return cipher.doFinal(input);
334         }
335         catch (Exception e)
336         {
337             e.printStackTrace();
338         }
339
340         return null;
341     }
342 }  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-104045-1-1.html 上篇帖子: php语法入门(玉丰整理) 下篇帖子: PHP面向对象
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表