• 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     }

    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 }
  • 相关阅读:
    WeakReference体验
    扩展Jquery自定义的一个错误警告控件ErrorProvider
    提高WCF的吞吐效率
    (三)资源
    替换WCF默认序列化方式
    (二)画刷
    JS字符串函数扩展
    索引
    Jquery ajax传递复杂参数给WebService
    有意义的整数正则表达式
  • 原文地址:https://www.cnblogs.com/yasin/p/2746213.html
Copyright © 2020-2023  润新知