BouncyCastle RSA加解密类 C#版 兼容JAVA PHP(RSAHelper)

C# RSAHelper类 实现兼容JAVA,PHP的RSA加解密类

ExpandedBlockStart.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下的加解密过程 实例代码:

 

ExpandedBlockStart.gif 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 }

 

 

转载于:https://www.cnblogs.com/yasin/archive/2012/10/30/2746213.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值