RSA&MD5实现电子签章
本人目前在做一个关于“数字签名”的项目,在网上查资料,感觉这方面的都非常的少,一般都是讲RSA的算法,或者“数字签名”的原理,完全是浪费时间。我经过摸索,小有进展,初步实现功能。今天写出来,希望能给以后的做这个的朋友提供个方便。还有一件事,在我查资料的时候也遇见很多朋友在做这个项目,但是我感觉他们都在进入了几个误区。我先把这几个误区说说,以免大家以后走错方向。说得不对的地方希望大家能批评指正,毕竟本人能力有限(但是不要骂我) ^_^
误区一:大家对公钥私钥区分得太.......(我还找不到形容来形容了.... ),就太死板了吧。其实当你把公钥保密不公开的时候,公钥就是私钥了;当你把私钥公开的时候,私钥也是公钥了。没必要记得这么死的(个人意见)。
误区二:对RSA算法的原理理解不够,实际上所谓的公钥和私钥只是RSA算法(说穿了RSA就是个数学方程式)的参数(未知数),比如 X+Y+M=Z,X就可以说是私钥,Y就可以说是公钥,M就是需要加密的内容,Z就是加密后的密文,当然RSA中不可能只有X和Y两个未知数的,所以就经常有朋友问,到底X是私钥还是Y是私钥(嘻嘻... 我也问过)。其实这个就要取决于你用在时候,什么地方了。
误区三:对Security.Cryptography命名空间不熟悉。“数字签名”一般的做法是:A先计算出文件M的HASH码,再对HASH码进行加密(这个步骤就是签名),再把M(文件M不要加密,第三方可以查阅)和加密后的HASH码传送给B,B再用A的公钥来解密刚才得到的加密HASH码,如果能解密,那就说明这个文件是A发的,具有法律效应。再计算出得到的文件M的HASH码,再和刚才解密出来的HASH码比较(这个步骤叫验证签名),如果一致就说明文件M在传输过程中没有被修改。但是在C#中需要解密RSA,就必须提供公钥和私钥,当然这和我们的现实不符,因为A不可能把他的私钥给B。许多人就是在这里难住了。其实在C#的Security.Cryptography命名空间中有RSAPKCS1SignatureFormatter 和RSAPKCS1SignatureDeformatter 两个方法或者说是对象。前者用来对HASH进行加密(签名),后者用来验证签名,用这个验证就只需要A的公钥就行了。在C#中,签名就是这个两个专用的方法,不是用RSA普通的加密解密。
下面我就贴出我的代码,我的公钥和私钥就是从两个文件PublicKey.xml、PrivateKey.xml中读取出来,相当于是现实中的指定公钥和私钥;再验证时我为了方便直接验证的A计算出的HASH码,现实中应该是由B重新计算出文件M的HASH码(这个大家明白就行了^_^)。
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Security.Cryptography;
using System.Xml;
namespace StandSoftRSA
{
/// <summary>
/// Form1 的摘要说明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.RichTextBox richTextBox1;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.RichTextBox richTextBox2;
private System.Windows.Forms.Button button3;
private RSACryptoServiceProvider RSA;
private byte[] Hashbyte;
private byte[] EncryptedData;
private RSAParameters PrivateKey;
private RSAParameters PublicKey;
private XmlDocument objXml;
private XmlNodeList objXmlNode;
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.richTextBox1 = new System.Windows.Forms.RichTextBox();
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.richTextBox2 = new System.Windows.Forms.RichTextBox();
this.button3 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// richTextBox1
//
this.richTextBox1.BackColor = System.Drawing.Color.Black;
this.richTextBox1.ForeColor = System.Drawing.Color.LawnGreen;
this.richTextBox1.Location = new System.Drawing.Point(8, 8);
this.richTextBox1.Name = "richTextBox1";
this.richTextBox1.Size = new System.Drawing.Size(384, 80);
this.richTextBox1.TabIndex = 0;
this.richTextBox1.Text = "";
//
// button1
//
this.button1.Location = new System.Drawing.Point(168, 104);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(56, 24);
this.button1.TabIndex = 1;
this.button1.Text = "哈稀码";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// button2
//
this.button2.Location = new System.Drawing.Point(8, 184);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(384, 24);
this.button2.TabIndex = 3;
this.button2.Text = "加密";
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// richTextBox2
//
this.richTextBox2.BackColor = System.Drawing.Color.Black;
this.richTextBox2.ForeColor = System.Drawing.Color.LawnGreen;
this.richTextBox2.Location = new System.Drawing.Point(8, 216);
this.richTextBox2.Name = "richTextBox2";
this.richTextBox2.Size = new System.Drawing.Size(384, 80);
this.richTextBox2.TabIndex = 4;
this.richTextBox2.Text = "";
//
// button3
//
this.button3.Location = new System.Drawing.Point(8, 304);
this.button3.Name = "button3";
this.button3.Size = new System.Drawing.Size(384, 24);
this.button3.TabIndex = 5;
this.button3.Text = "解密";
this.button3.Click += new System.EventHandler(this.button3_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(400, 421);
this.Controls.Add(this.button3);
this.Controls.Add(this.richTextBox2);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.Controls.Add(this.richTextBox1);
this.Name = "Form1";
this.Text = "RSA&MD5";
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
//获得文件的哈稀码
private void GetFileHash()
{
FileStream objFile = File.OpenRead("Hash.doc");
HashAlgorithm MD5 = HashAlgorithm.Create("MD5");
Hashbyte = MD5.ComputeHash(objFile);
objFile.Close();
foreach(byte b in Hashbyte)
{
richTextBox1.AppendText(b.ToString()+" ");
}
}
private void button1_Click(object sender, System.EventArgs e)
{
GetFileHash();
}
//设置公钥和私钥对(都包含)
public void SetPrivateKey()
{
PrivateKey = new RSAParameters();
objXml = new XmlDocument();
objXml.Load("PublicKey.xml");
//指定RSA参数Exponent的值(公钥)
objXmlNode = objXml.SelectNodes("//Exponent");
PrivateKey.Exponent = Convert.FromBase64String(objXmlNode[0].InnerXml.ToString());
//指定RSA参数Modulus的值(公钥)
objXmlNode = objXml.SelectNodes("//Modulus");
PrivateKey.Modulus = Convert.FromBase64String(objXmlNode[0].InnerXml.ToString());
objXml = new XmlDocument();
objXml.Load("PrivateKey.xml");
//指定RSA参数D的值(私钥)
objXmlNode = objXml.SelectNodes("//D");
PrivateKey.D = Convert.FromBase64String(objXmlNode[0].InnerXml.ToString());
//指定RSA参数DP的值(私钥)
objXmlNode = objXml.SelectNodes("//DP");
PrivateKey.DP = Convert.FromBase64String(objXmlNode[0].InnerXml.ToString());
//指定RSA参数DQ的值(私钥)
objXmlNode = objXml.SelectNodes("//DQ");
PrivateKey.DQ = Convert.FromBase64String(objXmlNode[0].InnerXml.ToString());
//指定RSA参数InverseQ的值(私钥)
objXmlNode = objXml.SelectNodes("//InverseQ");
PrivateKey.InverseQ = Convert.FromBase64String(objXmlNode[0].InnerXml.ToString());
//指定RSA参数P的值(私钥)
objXmlNode = objXml.SelectNodes("//P");
PrivateKey.P = Convert.FromBase64String(objXmlNode[0].InnerXml.ToString());
//指定RSA参数Q的值(私钥)
objXmlNode = objXml.SelectNodes("//Q");
PrivateKey.Q = Convert.FromBase64String(objXmlNode[0].InnerXml.ToString());
}
//执行加密
private void button2_Click(object sender, System.EventArgs e)
{
RSA = new RSACryptoServiceProvider();
//设置私钥
SetPrivateKey();
//导入加密私钥
RSA.ImportParameters(PrivateKey);
RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(RSA);
//设置签名的算法为MD5
RSAFormatter.SetHashAlgorithm("MD5");
//执行签名
EncryptedData = RSAFormatter.CreateSignature(Hashbyte);
string strCode = "";
//现实加密结果
for(int i = 0; i < EncryptedData.Length; i++)
{
strCode += " " + EncryptedData[i].ToString();
}
richTextBox2.AppendText(strCode);
}
//设置公钥
public void SetPublicKey()
{
PublicKey = new RSAParameters();
objXml = new XmlDocument();
objXml.Load("PublicKey.xml");
//指定私钥Exponent的值
objXmlNode = objXml.SelectNodes("//Exponent");
PublicKey.Exponent = Convert.FromBase64String(objXmlNode[0].InnerXml.ToString());
//指定私钥Modulus的值
objXmlNode = objXml.SelectNodes("//Modulus");
PublicKey.Modulus = Convert.FromBase64String(objXmlNode[0].InnerXml.ToString());
}
//用公钥解密
private void button3_Click(object sender, System.EventArgs e)
{
RSA = new RSACryptoServiceProvider();
//设置公钥
SetPublicKey();
RSA.ImportParameters(PublicKey);
RSAPKCS1SignatureDeformatter RSADeformatter = new RSAPKCS1SignatureDeformatter(RSA);
//指定解密的时候HASH算法为MD5
RSADeformatter.SetHashAlgorithm("MD5");
if(RSADeformatter.VerifySignature(Hashbyte,EncryptedData))
{
MessageBox.Show("身份已经确认!","确认身份",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
else
{
MessageBox.Show("确认身份失败","确认身份",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}
}
}
相关推荐
展锐SL8541E平台SecureBoot实战:从密钥生成到产线烧录的完整避坑指南
本文详细解析了展锐SL8541E平台SecureBoot的全流程实现,涵盖密钥生成、签名验证到产线烧录的关键步骤。针对安全启动中的常见问题如密钥管理混乱、签名验证失败等,提供了ARM TrustZone硬件隔离与RSA-2048数字签名等技术的实战解决方案,帮助开发者高效部署安全启动机制。
C++加密编程实战:从CRC32到RSA的Crypto++完整指南
在C++开发中,数据安全与完整性是构建可靠系统的基石。密码学提供了从基础校验到高级加密的完整技术栈,其核心原理在于通过数学算法确保数据的机密性、完整性与真实性。对于开发者而言,掌握这些原理并选择合适的库是实现安全编程的关键技术价值。Crypto++作为一个纯C++编写的密码学库,因其遵循现代C++特性(如RAII和模板)而备受青睐,尤其适合需要深度集成底层安全协议的场景。在实际应用中,数据完整性验证(如CRC32)常与数据加密(如RSA)组合使用,例如在混合加密系统中,RSA用于安全交换对称密钥(如AES密
16、《Xbox破解:逆向工程与相关项目解析》
本文深入探讨了Xbox破解相关的技术、法律及社区发展,包括Xbox-Linux项目的安装与进展、“Project B”的破解策略与潜在影响、OpenXDK开发工具包的探索,以及逆向工程与知识产权法的关系。文章还介绍了关键人物如Milosch Meriac和Lee Tien的贡献,并分析了黑客活动背后的技术创新与法律责任,强调了社区合作与社会责任的重要性,最后展望了未来技术突破、法律完善及开源社区的发展方向。
C#中RSA加密解密和签名与验证的实现
RSA加密算法是一种非对称加密算法。在公钥加密标准和电子商业中RSA被广泛使用。RSA是1977年由罗纳德•李维斯特(Ron Rivest)、阿迪•萨莫尔(Adi Shamir)和伦纳德•阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。.Net的推出,我们能够利用.Net Framework中的类提供的加密服务...
SAP GUI 7.70 Windows版离线安装包(含SAPSprint、BI预计算支持及完整签名验证文件)
这个安装包是SAP官方发布的GUI 7.70 Windows客户端全量分发版本,开箱即用,无需联网激活。里面包含图形界面主程序、SAPSprint打印服务组件,用于本地报表输出;SAPCONSOLE控制台工具,方便管理员执行命令行操作;BI_PreCalServer模块,支持BI系统预计算功能;NT平台运行环境确保兼容Windows Server与主流桌面系统;PRES1目录提供标准UI资源,适配经典SAP界面风格。所有文件均带SAP数字签名(SIGNATURE.SMF),附带SHA256校验值(SHAFI
手把手教你用Python实现双三次插值(附OpenCV对比测试)
本文深入解析了双三次插值算法的数学原理,并提供了从零开始的Python实现教程。通过与OpenCV官方实现的对比测试,详细评估了不同插值算法(包括最邻近差值、双线性插值)在图像质量与计算性能上的差异,帮助开发者掌握高质量图像缩放的核心技术。
C#实现RSA签名及认证
C#实现RSA签名及认证 /// <summary> /// 签名 /// </summary> /// <param name="str">需签名的数据</param> /// <returns>签名后的值</returns> public string Sign(string str, string str_...
在国产麒麟V10(arm64)上离线部署Docker 24.0.6和Compose 2.30.1,保姆级避坑实录
本文详细介绍了在国产麒麟V10(arm64)操作系统上离线部署Docker 24.0.6和Compose 2.30.1的完整流程,包括环境准备、架构认知、安装步骤、系统服务优化及生产环境加固。特别针对ARM64架构的兼容性问题提供了解决方案,帮助用户在信创环境中高效部署容器化技术。
RSA加密解密及RSA签名和验证
RSA加密解密及RSA签名和验证 此Demo包含两个文件,建立一个解决方案,然后建立两个文件,一个为Form,一个为Class,把代码分别复制进去即可RSA正确的执行过程:加密解密:1、获取密钥,这里是产生密钥,实际应用中可以从各种存储介质上读取密钥2、加密3、解密签名和验证:签名:1、获取密钥,这里是产生密钥,实际应用中可以从各种存储介质上读取密钥2、获取待签名的Hash码3、签名其中,1
告别混乱!用Cadence Capture CIS高效管理你的原理图库:以单逻辑器件K9F2G08U0M为例
本文以单逻辑器件K9F2G08U0M为例,详细介绍了如何使用Cadence Capture CIS高效管理原理图库。通过三级分类体系、工程化命名规范和智能检索技术,帮助工程师实现从混乱到有序的转变,提升团队协作效率和设计准确性。
将AAL图谱对应到Yeo7大网络中【原理,代码分析】
本文介绍了将AAL2图谱映射到Yeo7大功能网络的方法。通过整合皮层(Yeo2011)、小脑(Buckner2011)和纹状体(Choi2012)三个区域的功能网络图谱,采用投票机制确定每个AAL区域的网络归属。具体步骤包括:1)统计每个AAL区域体素在各网络图谱中的分布;2)选择体素数量最多的网络作为该区域的最终标签。该方法实现了从解剖结构到功能网络的映射,可获得120个AAL区域对应的7大功能网络标签。
RSA不对称加密,公钥加密私钥解密,私钥加密公钥解密
RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。 RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。 .NET提供常用的加密算法类,支持RSA的类是RSACryptoServiceProvider
手把手教你使用Segformer训练自己的数据
SegFormer 基于Swin transformer 修改
RSA签名验证
【代码】RSA签名验证。
ENVI5.6 自动化流程:GF系列卫星影像批处理与质量优化
本文详细介绍了如何利用ENVI5.6构建针对GF-2、GF-6、GF-7系列卫星影像的自动化批处理流水线。通过配置Batch Processing工具,实现从正射校正到图像融合的全流程批量处理,并分享参数设置、质量监控与故障排查的实战经验,旨在显著提升海量遥感影像的处理效率与成果质量。
C++和OpenGL实现3D游戏编程【连载6】——不规则图形的纹理贴图(附源码)
上一节我们讨论了纹理贴图的相关基础操作,但上一节的纹理贴图操作基本上都是规则图形,包括圆形和球形虽然复杂一点,但是它也是规则的。这一节课我们要讨论一下,怎么在不规则图形上纹理贴图,就比如文章下图的心形纹理贴图,以及纹理的平移、旋转、放大缩小功能。
Python数字签名系统:从RSA原理到Flask部署的AI辅助开发实战
数字签名技术是网络安全与数据可信传输的基石,其核心原理基于公钥密码体系,通过私钥签名、公钥验证来确保数据的真实性、完整性与不可否认性。在工程实践中,Python凭借其简洁语法与丰富生态,结合成熟的cryptography库,成为实现RSA、ECDSA等算法的首选。AI辅助开发工具(如Copilot、ChatGPT)能显著提升开发效率,从生成样板代码、解释椭圆曲线密码学原理到撰写测试用例,覆盖全流程。本文以构建一个可部署的数字签名系统为例,详解如何利用现代开发工具链,从环境配置、核心模块实现、单元测试到Doc
【K8S系列】Kubernetes 中 Service 的流量不均匀问题【已解决】
在 Kubernetes 中,Service 是一种抽象,用于定义一组 Pod 的访问策略。当某些 Pod 接收的流量过多,而其他 Pod 的流量较少时,可能会导致负载不均衡。这种情况不仅影响性能,还可能导致某些 Pod 过载,影响应用的可用性。本文将详细分析此问题的原因及其解决方案。
Python实现数字签名系统:从RSA原理到毕业设计实战
数字签名是网络安全领域的核心技术,它基于非对称加密和哈希算法,确保数据的完整性与身份认证。其核心原理是利用公钥和私钥的数学特性,发送方用私钥对信息的哈希值进行签名运算,接收方则用公钥验证签名,从而确认信息来源和内容未被篡改。这项技术在软件分发、电子合同、区块链交易等场景中具有重要价值。本文以Python的cryptography库为基础,详细讲解如何从零构建一个完整的数字签名系统,涵盖RSA密钥生成、SHA-256哈希计算、签名与验签流程实现,并提供了清晰的模块划分和命令行工具示例,帮助读者将密码学理论转化
华为的C语言编程规范.pdf
华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。
文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况
主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。
对称与非对称加密:从AES到RSA,构建安全通信的基石
加密技术是信息安全的核心基础,旨在解决在不安全信道上安全传输信息的问题。其基本原理是通过特定算法和密钥,将可读的明文转换为不可读的密文,确保数据的机密性、完整性和身份验证。从技术价值看,它不仅是网络通信安全的保障,更是实现HTTPS、区块链、数字签名等现代应用的底层支撑。在实际工程中,加密主要应用于数据传输、存储加密、身份认证等场景。本文聚焦于两种最根本的加密范式:对称加密(如AES)和非对称加密(如RSA),深入解析其核心区别、典型工作流程以及关键的算法选型与安全实践,帮助开发者构建坚实的安全防线。
Devexpress16.2.6破解工具
Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具
Public Key RSA Encryption in C# .NET
转自:http://www.codeproject.com/Articles/10877/Public-Key-RSA-Encryption-in-C-NET General Information RSACryptoPad is a very basic display of the RSA encryption abilities in the .NET framework
Crypto++实战指南:从CRC32到RSA的C++加密库集成与应用
在C++开发中,数据安全与完整性是核心需求,涉及网络通信、文件校验与数据保护等多个场景。加密算法通过数学原理确保数据的机密性、完整性与身份验证,其技术价值在于为软件系统提供可靠的安全基石。常见的应用场景包括安全传输、数字签名与身份认证等。本文聚焦于Crypto++这一功能全面、稳定可靠的C++加密库,它覆盖了从基础的CRC32校验、SHA家族哈希算法,到AES对称加密及RSA非对称加密等完整体系,并支持国密算法SM2/SM3/SM4。通过实际工程实践,详细解析了库的编译集成、AES-CBC加密解密流程、RS
多模态数据加密系统:集成AES/RSA等6种算法的毕设实战指南
数据加密是信息安全领域的核心技术,其原理是通过特定算法和密钥将明文转换为不可读的密文,确保数据在存储和传输过程中的机密性与完整性。从古典密码到现代密码学,加密技术不断演进,形成了对称加密(如AES、DES)和非对称加密(如RSA、ECC)两大体系,在金融、通信、物联网等场景中发挥着不可替代的价值。本文聚焦于**多模态数据处理**与**加密算法集成**的工程实践,详细解析如何构建一个支持文本、图像、音频等多种格式,并融合AES、RSA、国密SM4等至少六种主流算法的加解密系统。该系统采用模块化设计,通过策略模
Bouncy Castle完整资源包:Java加密开发实战指南
在Java应用开发中,加密技术是保障数据安全的核心环节。Java Cryptography Architecture(JCA)提供了标准化的加密服务框架,但标准库的算法覆盖范围有限。Bouncy Castle作为JCA提供者,通过模块化架构实现了对国密算法、PGP、S/MIME等扩展标准的支持,解决了Java原生加密功能的不足。其核心价值在于提供了完整、可移植的加密解决方案,包含bcprov、bcpkix、bcpg等模块,分别对应基础算法、PKIX证书处理和OpenPGP协议。在工程实践中,该资源包广泛应用
LLM Agent许可完整性:构建从用户批准到可信执行的关键路径
在人工智能与软件工程交叉领域,确保系统行为符合用户意图是构建可信交互的基石。其核心原理在于建立用户授权与系统执行间的确定性映射,防止语义偏差或恶意篡改。这一机制的技术价值在于为AI智能体(Agent)融入关键工作流提供了必需的信任基础,尤其在涉及数据修改、外部资源操作等高权限场景中。从应用场景看,无论是自动化办公助手执行文件管理,还是金融、医疗领域的合规操作,都需要确保“所批即所执”。本文深入探讨了实现这一目标的三层架构设计,并特别关注了在工具调用中如何防范类似GTFOBins所揭示的合法工具被滥用的风险,
510



被折叠的 条评论
为什么被折叠?



