Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- UICommon.Base64StringToFile(UICommon.tbFileInfo.Str招标人加密公钥, str证书文件); // 保存加密公钥到本地
- SplashScreen.SetTitleString("正在对投标文件进行加密(招标人公钥)......");
- String str加密后PBTB文件 = UICommon.tbFileInfo.StrPBTB文件 + ".enc";
- if (File.Exists(str加密后PBTB文件))
- {
- File.Delete(str加密后PBTB文件);
- }
- String str解密后投标文件 = UICommon.tbFileInfo.StrPBTB文件 + ".dec";
- if (File.Exists(str解密后投标文件))
- {
- File.Delete(str解密后投标文件);
- }
- String str招标人公钥加密后的对称密钥 = String.Empty;
- String str加密前原文Hash值 = CommonFunction.ComputeSHA1(UICommon.tbFileInfo.StrPBTB文件);
- try
- {
- TrueLore.CA.南京.EncryptCommon.GetEnCryptData64(UICommon.tbFileInfo.StrPBTB文件
- , str加密前原文Hash值
- , str证书文件
- , str解密后投标文件
- , out str招标人公钥加密后的对称密钥); // 密钥对的密文
- }
- catch
- {
- TrueLoreMessageBox.ShowMessage("招标人公钥加密后失败!" + Environment.NewLine + TrueLore.CA.南京.EncryptCommon.GetErrorInfo());
- return false;
- }
- String str加密后原文Hash值 = CommonFunction.ComputeSHA1(UICommon.tbFileInfo.StrPBTB文件);
- if (!str加密后原文Hash值.Equals(str加密前原文Hash值))
- {
- File.Delete(str解密后投标文件);
- TrueLoreMessageBox.ShowMessage("一次加密后原文的Hash与加密前原文的Hash值不一致!");
- return false;
- }
- if (!CommonFunction.ComputeSHA1(str解密后投标文件).Equals(str加密前原文Hash值))
- {
- File.Delete(str解密后投标文件);
- TrueLoreMessageBox.ShowMessage("一次加密后解密出来的投标文件的Hash与原文Hash值不一致!");
- return false;
- }
- UICommon.tbFileInfo.Str一次加密后的原文Hash值 = str招标人公钥加密后的对称密钥.Split('|')[1].ToUpper();
- if (!UICommon.tbFileInfo.Str一次加密后的原文Hash值.Equals(str加密前原文Hash值))
- {
- File.Delete(str解密后投标文件);
- TrueLoreMessageBox.ShowMessage("一次加密后返回的Hash与原文Hash值不一致!");
- return false;
- }
- if (String.IsNullOrEmpty(str招标人公钥加密后的对称密钥))
- {
- TrueLoreMessageBox.ShowMessage("招标人公钥加密后的对称密钥为空!");
- return false;
- }
- if (!File.Exists(str加密后PBTB文件))
- {
- TrueLoreMessageBox.ShowMessage("招标人公钥加密后的PBTB文件不存在!");
- return false;
- }
- SplashScreen.SetTitleString("正在对投标文件进行二次加密(RSA算法)......");
- TrueLore.CA.南京.EncryptCommon.GetEnCryptSK(str招标人公钥加密后的对称密钥, out str二次加密的对称密钥密文); // 用投标人的公钥对密钥对密文再次加密
- if (String.IsNullOrEmpty(str二次加密的对称密钥密文))
- {
- TrueLoreMessageBox.ShowMessage("投标人公钥二次加密后的对称密钥密文为空!");
- return false;
- }
- #endregion
- String secEncryptCert = String.Empty; // 再次取得加密证书对加密过程进行验证
- TrueLore.CA.南京.DigitalSignCommon.SelectCert(CA.南京.Enum证书用途.加密);
- TrueLore.CA.南京.DigitalSignCommon.GetCertEncrypt(out secEncryptCert);// 取得加密证书
- if (str加密证书 != secEncryptCert)
- TrueLoreMessageBox.ShowMessage("二次取得加密证书不一致!");
- return false;
- }
- #region 合并文件生成电子标书
- SplashScreen.SetTitleString("正在合并电子标书文件......");
- SplashScreen.BeginDisplay();
- String saveNTFFileName = "【" + UICommon.tbFileInfo.Str标段编号.Trim() + "】投标文件" + DateTime.Now.ToString("yyyyMMddHHmmss") + SettingClass.Entity地区系统设置.TBJ后缀;
- String str投标文件NTF = CommonFunction.FilePathCombine(str刻录文件夹, saveNTFFileName);
- if (File.Exists(str投标文件NTF))
- {
- File.Delete(str投标文件NTF);
- }
- XmlTextWriter xmlwriter = new XmlTextWriter(str投标文件NTF, System.Text.Encoding.UTF8);// 生成一个XML文档书写器
- xmlwriter.WriteStartDocument();// 开始输出XML文档
- xmlwriter.WriteStartElement("TBFile");// 开始创建根节点"TBFile"
- TrueLore.CA.南京.DigitalSignCommon.SelectCert(CA.南京.Enum证书用途.签名);
- str单位名称 = TrueLore.CA.南京.DigitalSignCommon.GetCertUnitName(); // 制作单位名称
- str创建投标文件的时间 = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); // 创建投标文件
- // 使用的招标文件或者答疑文件的唯一标示
- xmlwriter.WriteStartElement("UseZBFileGuid");
- xmlwriter.WriteString(UICommon.tbFileInfo.Is是否上传了答疑文件 ? UICommon.tbFileInfo.Str答疑文件的唯一标示 : UICommon.tbFileInfo.Str招标文件的唯一标示);
- xmlwriter.WriteEndElement();
- xmlwriter.WriteStartElement("TBFileGuid");
- xmlwriter.WriteString(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(UICommon.tbFileInfo.Str标段编号.Trim()
- + str单位名称.Trim() + str创建投标文件的时间 + Convert.ToDecimal(UICommon.tbFileInfo.Str投标总价).ToString("0.##"), "MD5"));
- xmlwriter.WriteEndElement();
- // 生成投标文件的投标人的加密锁号
- xmlwriter.WriteStartElement("UserIdentifier");
- if (!String.IsNullOrEmpty(UICommon.tbFileInfo.Str加密锁的ID))
- {
- xmlwriter.WriteString(UICommon.tbFileInfo.Str加密锁的ID);
- }
- else
- {
- xmlwriter.WriteString(TrueLore.CA.南京.HDGetIDCommon.获取加密锁的锁号());
- }
- xmlwriter.WriteEndElement();
- xmlwriter.WriteStartElement("IsRecordDisk");
- xmlwriter.WriteString("1");
- xmlwriter.WriteEndElement();
- // 加密信息E
- xmlwriter.WriteStartElement("Cryptograph");
- FileStream fileStream = new FileStream(str加密后PBTB文件, FileMode.Open);
- Int32 count = 1;
- Byte[] bytes = new Byte[1024];
- while (count != 0)
- {
- count = fileStream.Read(bytes, 0, 1024);
- if (count < 1024)
- {
- String value = System.Text.Encoding.UTF8.GetString(bytes, 0, count);
- value = value.TrimEnd('\0');
- xmlwriter.WriteString(value);
- break;
- }
- else
- {
- xmlwriter.WriteString(System.Text.Encoding.UTF8.GetString(bytes, 0, 1024));
- }
- }
- fileStream.Close();
- xmlwriter.WriteEndElement();
- // 投标文件的数字签名(DS)
- xmlwriter.WriteStartElement("TBFileDigitalSignal");
- xmlwriter.WriteString(str签名信息DS);
- xmlwriter.WriteEndElement();
- // 招标文件中招标人(招标代理)的公钥
- xmlwriter.WriteStartElement("ZBREncryptPublicKey");
- xmlwriter.WriteString(UICommon.tbFileInfo.Str招标人加密公钥);
- xmlwriter.WriteEndElement();
- // 投标人的公钥PBA注:此证书为签名证书,主要用来校验投标文件的正确性
- xmlwriter.WriteStartElement("TBRPublicKey");
- xmlwriter.WriteString(str签名证书);
- xmlwriter.WriteEndElement();
- // 投标人的公钥PBA 注:此证书为加密证书
- xmlwriter.WriteStartElement("TBREncryptPublicKey");
- xmlwriter.WriteString(str加密证书);
- xmlwriter.WriteEndElement();
- // 数字信封DE2
- xmlwriter.WriteStartElement("DigitalEnvelope");
- xmlwriter.WriteString(str二次加密的对称密钥密文.Split('|')[0]);
- xmlwriter.WriteEndElement();
- // 标段编号
- xmlwriter.WriteStartElement("BiaoDuanNo");
- xmlwriter.WriteString(UICommon.tbFileInfo.Str标段编号.Trim());
- xmlwriter.WriteEndElement();
- // 标段名称
- xmlwriter.WriteStartElement("BiaoDuanName");
- xmlwriter.WriteString(UICommon.tbFileInfo.Str标段名称.Trim());
- xmlwriter.WriteEndElement();
- xmlwriter.WriteStartElement("UnitName");
- xmlwriter.WriteString(str单位名称);
- xmlwriter.WriteEndElement();
- xmlwriter.WriteStartElement("SoftName");
- xmlwriter.WriteString("筑龙");
- xmlwriter.WriteEndElement();
- // 创建投标文件的时间
- xmlwriter.WriteStartElement("CreateData");
- xmlwriter.WriteString(str创建投标文件的时间);
- xmlwriter.WriteEndElement();
- // 生成电脑上的网卡Mac地址
- xmlwriter.WriteStartElement("MachineKey");
- xmlwriter.WriteString(TrueLore.Common.CommonFunction.GetMacSN("-").Trim() + "@"
- + TrueLore.Common.CommonFunction.GetIDESN().Trim() + "@"
- + UICommon.获取CPU的序列号().Trim());
- xmlwriter.WriteEndElement();
- // 总的投标文件的版本号
- xmlwriter.WriteStartElement("Version");
- xmlwriter.WriteString(String.IsNullOrEmpty(UICommon.tbFileInfo.Str计税方法) ? "3.0" : "3.1");
- xmlwriter.WriteEndElement();
- xmlwriter.WriteStartElement("Ehash");
- xmlwriter.WriteString(CommonFunction.ComputeSHA1(str加密后PBTB文件));
- xmlwriter.WriteEndElement();
- xmlwriter.WriteStartElement("Yhash");
- xmlwriter.WriteString(UICommon.tbFileInfo.Str一次加密后的原文Hash值);
- xmlwriter.WriteEndElement();
- xmlwriter.WriteEndElement();
- xmlwriter.WriteEndDocument();
- xmlwriter.Flush();
- xmlwriter.Close();
- SplashScreen.SetTitleString("正在验证投标文件的加密信息......");
- if (!UICommon.验证加密文件是否一致(str投标文件NTF, str加密后PBTB文件))
- {
- TrueLoreMessageBox.ShowMessage("投标文件的加密信息E不一致,请重新生成!");
- return false;
- }
- #endregion
- XmlDocument xmlDocTemp = new XmlDocument();
- xmlDocTemp.Load(UICommon.tbFileInfo.Str投标文件的临时文件);
- XmlNode xnTBFileHash = xmlDocTemp.DocumentElement.SelectSingleNode("TBFileHash");
- XmlAttribute xaPBTBENCHash = xnTBFileHash.OwnerDocument.CreateAttribute("PBTBENCHash");
- xnTBFileHash.Attributes.Append(xaPBTBENCHash);
- xaPBTBENCHash.Value = CommonFunction.ComputeSHA1(str加密后PBTB文件);
- xmlDocTemp.Save(UICommon.tbFileInfo.Str投标文件的临时文件);
- xmlDocTemp = null;
Add Comment
Please, Sign In to add comment