/// <summary> /// 创建授权文件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnSave_Click(object sender, EventArgs e) { DateTime time = Convert.ToDateTime(EndTime.Text); ILicenseData data = new ILicenseData { CompanyName = CompanyName.Text, DomainName = DomainName.Text, Guid = Guid.Parse(guid.Text), Count = Convert.ToInt32(Count.Text), UnixEndTime = DateHelper.DateTimeToUnix(time) }; LicenseHelper.CreateLicense(data); }
/// <summary> /// 查看授权文件信息 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnView_Click(object sender, EventArgs e) { Alert(Label3, "", ""); if (FileUpload1.HasFile && FileUpload1.PostedFile.ContentLength > 0) { try { ILicenseData data = LicenseHelper.DecryptLicense(FileUpload1.PostedFile.InputStream); this.SetFormValue(data); } catch { Alert(Label3, "文件无效!", "line1px_2"); } } else { Alert(Label3, "未选择文件!", "line1px_2"); } }
/// <summary> /// 生成授权文件 /// </summary> /// <param name="data"></param> public static void CreateLicense(ILicenseData data) { Int32 count = data.Count; String json = JsonConvert.SerializeObject(data); Byte[] buffer = Encoding.UTF8.GetBytes(json); #region 7z压缩加密 Byte[] zipBuffer = Encoding.UTF8.GetBytes(Math.Pow(3, count / 2).ToString("0")); String zipPassword = MD5Upper32(String.Join("&", zipBuffer)); SevenZipCompressor zip = new SevenZipCompressor() { DefaultItemName = "license", EncryptHeaders = true, FastCompression = true, ScanOnlyWritable = true, CompressionLevel = CompressionLevel.High, CompressionMethod = CompressionMethod.Lzma2 }; using (MemoryStream stream = new MemoryStream(buffer)) { using (MemoryStream ms = new MemoryStream()) { zip.CompressStream(stream, ms); //zip.CompressStream(stream, ms, zipPassword); ms.Position = 6;//去掉7z头文件信息 buffer = new Byte[ms.Length - ms.Position]; ms.Read(buffer, 0, buffer.Length); } } #endregion Array.Reverse(buffer, 0, buffer.Length);//反转流 #region DES在次加密 for (int i = 1; i <= count; i++) { String[] arr = new String[5]; for (int j = 2; j < 7; j++) { String v1 = Math.Pow(j, i).ToString("0"); arr[j - 2] = v1; } String key = MD5Upper32(String.Join("#", arr)); buffer = EncryptDES(buffer, key); } #endregion #region 文件尾写入加密次数 Byte[] byt = new Byte[] { (Byte)count }; buffer = buffer.Concat(byt).ToArray(); #endregion #region 输出文件 String base64 = Convert.ToBase64String(buffer, Base64FormattingOptions.InsertLineBreaks); Byte[] head = new Byte[256]; StringBuilder sb = new StringBuilder(256); sb.AppendLine("Warning: Please don't delete or modify this file."); sb.AppendLine("Have any questions, please contact the author."); sb.AppendLine(); sb.AppendLine("author:Jin Jia You Email:[email protected]"); Encoding.UTF8.GetBytes(sb.ToString()).CopyTo(head, 0); HttpResponse Response = HttpContext.Current.Response; Response.Clear(); Response.ContentType = "text/plain"; Response.ContentEncoding = Encoding.GetEncoding("UTF-8"); Response.AddHeader("Content-Disposition", "attachment; filename=license.txt"); using (StreamWriter sw = new StreamWriter(Response.OutputStream, Encoding.UTF8)) { sw.Write(Encoding.UTF8.GetString(head)); sw.WriteLine(); sw.Write(base64); } Response.Flush(); Response.End(); #endregion }
/// <summary> /// 解密授权文件 /// </summary> /// <param name="file"></param> /// <returns></returns> public static ILicenseData DecryptLicense(Stream file) { Int32 count = 0; Byte[] buffer = new Byte[] { }; file.Position = 256 + 4; using (BinaryReader br = new BinaryReader(file, Encoding.UTF8)) { Byte[] byt = br.ReadBytes((int)(file.Length - file.Position)); String base64 = Encoding.UTF8.GetString(byt); byt = Convert.FromBase64String(base64); count = byt[byt.Length - 1]; //读取加密次数 buffer = new Byte[byt.Length - 1]; //读取加密正文 Array.Copy(byt, buffer, buffer.Length); } #region DES解密 for (int i = count; i >= 1; i--) { String[] arr = new String[5]; for (int j = 2; j < 7; j++) { String v1 = Math.Pow(j, i).ToString("0"); arr[j - 2] = v1; } String key = MD5Upper32(String.Join("#", arr)); buffer = DecryptDES(buffer, key); } #endregion Array.Reverse(buffer, 0, buffer.Length); #region 7z解密 Byte[] zipBuffer = Encoding.UTF8.GetBytes(Math.Pow(3, count / 2).ToString("0")); String zipPassword = MD5Upper32(String.Join("&", zipBuffer)); using (MemoryStream stream = new MemoryStream()) { stream.Write(new Byte[] { 0x37, 0x7A, 0xBC, 0xAF, 0x27, 0x1C }, 0, 6); stream.Write(buffer, 0, buffer.Length); using (SevenZipExtractor zip = new SevenZipExtractor(stream, zipPassword)) { using (MemoryStream ms = new MemoryStream()) { zip.ExtractFile(0, ms); buffer = ms.ToArray(); } } } #endregion String json = Encoding.UTF8.GetString(buffer); ILicenseData data = JsonConvert.DeserializeObject <ILicenseData>(json); return(data); }