/** ** 加密方法 * * @param source * : 明文 * @param e * 公钥 * @param n * @return 密文 带"," * @ */ public static String encrypt(String source, BigInteger e, BigInteger n, int numBit) { String text = System.Web.HttpUtility.UrlEncode(source, Encoding.UTF8);//URLEncoder.encode(source, "UTF-8");// 为了支持汉字、汉字和英文混排 if (text == null || "".Equals(text)) { throw new Exception("明文转换为UTF-8,导致转换异常!!!"); } byte[] arraySendM = Encoding.UTF8.GetBytes(text);//text.GetBytes("UTF-8"); if (arraySendM == null) { throw new Exception("明文转换为UTF-8,导致转换异常!!!"); } if (numBit <= 1) { throw new Exception("随机数位数不能少于2!!!"); } int numeroByte = (numBit - 1) / 8; byte[][] encodSendM = RSAUtil.byteToEm(arraySendM, numeroByte); BigInteger[] encodingM = RSAUtil.encodeRSA(encodSendM, e, n); StringBuilder encondSm = new StringBuilder(); foreach (BigInteger em in encodingM) { encondSm.Append(em.ToString(16)); encondSm.Append(" "); } return(encondSm.ToString()); }
public static bool validSign(String transdata, String sign, String key) { /* * $trans_data = '{"exorderno":"10004200000001100042","transid":"02113013118562300203","waresid":1,"appid":"20004600000001200046","feetype":0,"money":3000,"count":1,"result":0,"transtype":0,"transtime":"2013-01-31 18:57:27","cpprivate":"123456"}'; * $key = 'MjhERTEwQkFBRDJBRTRERDhDM0FBNkZBMzNFQ0RFMTFCQTBCQzE3QU1UUTRPRFV6TkRjeU16UTVNRFUyTnpnek9ETXJNVE15T1RRME9EZzROVGsyTVRreU1ETXdNRE0zTnpjd01EazNNekV5T1RJek1qUXlNemN4'; * $sign = '28adee792782d2f723e17ee1ef877e7 166bc3119507f43b06977786376c0434 633cabdb9ee80044bc8108d2e9b3c86e'; */ // transdata = "{\"exorderno\":\"10004200000001100042\",\"transid\":\"02113013118562300203\",\"waresid\":1,\"appid\":\"20004600000001200046\",\"feetype\":0,\"money\":3000,\"count\":1,\"result\":0,\"transtype\":0,\"transtime\":\"2013-01-31 18:57:27\",\"cpprivate\":\"123456\"},\"paytype\":401"; // key = "MjhERTEwQkFBRDJBRTRERDhDM0FBNkZBMzNFQ0RFMTFCQTBCQzE3QU1UUTRPRFV6TkRjeU16UTVNRFUyTnpnek9ETXJNVE15T1RRME9EZzROVGsyTVRreU1ETXdNRE0zTnpjd01EazNNekV5T1RJek1qUXlNemN4"; // sign = "28adee792782d2f723e17ee1ef877e7 166bc3119507f43b06977786376c0434 633cabdb9ee80044bc8108d2e9b3c86e"; //jsonStr = transdata ={ "exorderno":"YYHPay20160302194522756","transid":"01416030219452647215","waresid":1,"appid":"5000805433","feetype":0,"money":6,"count":1,"result":0,"transtype":0,"transtime":"2016-03-02 19:45:51","cpprivate":"515游戏-60000游戏币","paytype":401} //&sign = 7a532a31a1834b57499c4724939f1a16 5c5b1e091f08b714ead4ebf1a9915ae3 2cc8204e3d228da1aea4dace9bc5fdab //transdata = "{\"exorderno\":\"YYHPay20160302194522756\",\"transid\":\"01416030219452647215\",\"waresid\":1,\"appid\":\"5000805433\",\"feetype\":0,\"money\":6,\"count\":1,\"result\":0,\"transtype\":0,\"transtime\":\"2016-03-02 19:45:51\",\"cpprivate\":\"515游戏-60000游戏币\",\"paytype\":401}"; // key = "OEQxODM1M0Q2QjMwNDAzOUYwRDJEMkE4OUVEMjIyMjgwMUU3QzY1RE1UYzJORFkyT0RJMU1UWXdNVGd5TXpnNU16TXJNekU1T0RrNE9ETTRPRGcyT0RnMk5EY3pOVEUyTXprd01UYzBOekV4TnpVMU5UUTRNakU1"; // sign = "7a532a31a1834b57499c4724939f1a16 5c5b1e091f08b714ead4ebf1a9915ae3 2cc8204e3d228da1aea4dace9bc5fdab"; try { MD5 md5 = new MD5CryptoServiceProvider(); byte[] output = md5.ComputeHash(Encoding.UTF8.GetBytes(transdata.Trim())); String md5str = BitConverter.ToString(output).Replace("-", ""); String decodeBaseStr = Base64.DecodeBase64(key.Trim()); String[] decodeBaseVec = decodeBaseStr.Replace('+', '#').Split('#'); String privateKey = decodeBaseVec[0]; String modkey = decodeBaseVec[1]; String reqMd5 = RSAUtil.decrypt(sign.Trim(), new BigInteger(privateKey), new BigInteger(modkey)); if ((md5str.ToLower()).Equals(reqMd5.ToLower())) { return(true); } else { return(false); } } catch (Exception e) { } return(false); }
/** * 解密算法 * * @param cryptograph * :密文,带"," * @param d * 私钥 * @param n * @param numBit * 位数 * @return * @ */ public static String decrypt(String cryptograph, BigInteger d, BigInteger n, int numBit) { String[] chs = cryptograph.Split(' '); if (chs == null || chs.GetLength(0) <= 0) { throw new Exception("密文不符合要求!!!"); } int numeroToken = chs.GetLength(0); BigInteger[] StringToByte = new BigInteger[numeroToken]; for (int i = 0; i < numeroToken; i++) { StringToByte[i] = new BigInteger(chs[i], 16); } byte[][] encodeM = RSAUtil.dencodeRSA(StringToByte, d, n); byte[] sendMessage = RSAUtil.StringToByte(encodeM); //String message = new String(sendMessage, "UTF-8"); string message = System.Text.Encoding.Default.GetString(sendMessage); String result = System.Web.HttpUtility.UrlDecode(message, Encoding.UTF8);//.UrlDecode.decode(message, "UTF-8"); return(result); }