BouncyCastle RSA加解密类 C#版 兼容JAVA PHP(RSAHelper)
C# RSAHelper类 实现兼容JAVA,PHP的RSA加解密类
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 }
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 }
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 }