DSA数字签名算法
证书的签名算法

证书的签名算法
常见的证书签名算法包括:
1. RSA(Rivest-Shamir-Adleman):非对称加密算法,使用私钥进行签名,公钥进行验证。
2. DSA(Digital Signature Algorithm):美国国家标准,非对称加密算法,使用私钥进行签名,公钥进行验证。
3. ECDSA(Elliptic Curve Digital Signature Algorithm):基于椭圆曲线密码学的数字签名算法,具有较高的安全性和效率。
4. HMAC(Hash-based Message Authentication Code):基于散列函数的消息认证码,使用共享密钥和哈希函数对消息进行加密和验证。
以上算法都是通过对证书中的数据进行计算、加密和验证,来确保证书的完整性和真实性。
签名与加密算法设计与实现

签名与加密算法设计与实现随着网络技术的不断进步,网络安全问题也越来越受到人们的关注。
在保障网络安全方面,签名和加密技术扮演了至关重要的角色。
本文旨在探讨签名与加密算法的设计与实现。
一、签名算法设计与实现签名算法通常用于验证数字文件的真实性和完整性。
常见的签名算法包括RSA、DSA等。
RSA算法是一种基于大素数因子分解的算法。
其应用广泛,特别是在TLS、SSL等安全通信协议中。
RSA算法的实现需要进行大数运算,这使得其在效率上存在一定的问题。
可以通过采用多线程等手段进行优化。
DSA算法是一种基于离散对数的算法,通常用于数字签名。
DSA算法的实现比RSA算法更为优化,具有更高的效率。
DSA算法在实现时需要注意实现的正确性和安全性。
二、加密算法设计与实现加密算法的主要作用是对敏感信息进行保护,以避免信息在传输过程中被截获和篡改。
常见的加密算法包括DES、AES等。
DES算法是一种基于对称密钥的加密算法。
其核心原理是将明文分成64位的块,通过密钥进行加密,最终得到密文。
然而,由于DES算法的密钥长度较短,易受到暴力破解的攻击,安全性不足。
AES算法是一种基于高级加密标准的对称密钥加密算法。
其具有比DES算法更高的安全性和效率。
AES算法的实现需要注意密钥长度、填充方式等问题。
三、算法实现中的安全性问题在签名和加密算法的设计和实现过程中,安全性是至关重要的问题。
在实现时需要注意以下几个方面。
首先,密钥的安全性非常重要。
密钥的泄露可能导致加密算法的失效。
因此需要采取严格的密钥管理制度,确保密钥的安全性。
其次,算法的实现需要避免泄露敏感信息,例如明文、密钥等。
在实现时需要加入适当的安全措施,确保敏感信息不会被破解和篡改。
最后,算法的实现需要遵循一定的标准和规范。
目前,国际上广泛采用的标准有ISO和NIST等。
遵守标准和规范可以确保算法的正确性和安全性。
综上所述,签名和加密算法的设计与实现是网络安全的重要组成部分。
证书的签名算法

证书的签名算法【实用版】目录一、证书的签名算法概述二、常见的证书签名算法三、证书签名算法的作用和重要性四、证书签名算法的发展趋势正文一、证书的签名算法概述证书的签名算法,是指用于数字证书签名的算法,其主要目的是为了保证数据的完整性、真实性和不可否认性。
数字证书是网络通信中重要的加密技术之一,用于实现身份验证和信息安全。
在数字证书中,签名算法是核心技术之一,其重要性不言而喻。
二、常见的证书签名算法常见的证书签名算法包括:RSA 签名算法、DSA 签名算法、ECDSA 签名算法等。
1.RSA 签名算法:RSA 是一种非对称加密算法,其签名过程是基于公钥加密的原理,私钥解密。
由于 RSA 算法安全性高、性能稳定,成为目前应用最广泛的签名算法之一。
2.DSA 签名算法:DSA 是一种数字签名算法,其基于离散对数问题,具有较高的安全性。
DSA 算法适用于数字签名、密钥交换等场景,但其应用范围相对较窄。
3.ECDSA 签名算法:ECDSA 是一种基于椭圆曲线密码学的签名算法,其优点是算法简单、安全性高、计算量小。
ECDSA 算法在移动设备、物联网等领域得到广泛应用。
三、证书签名算法的作用和重要性证书签名算法在网络安全中具有重要作用,主要包括以下几点:1.数据完整性:签名算法可以保证数据在传输过程中不被篡改,确保接收方收到的数据与发送方发送的数据一致。
2.数据真实性:签名算法可以证明数据的发送者是真实的,防止伪造和冒充。
3.不可否认性:签名算法可以让数据的发送者不能否认已经发送的数据,防止发送者否认发送过某个数据。
4.密钥管理:签名算法可以帮助实现对私钥的安全管理,防止私钥泄露导致安全风险。
四、证书签名算法的发展趋势随着网络通信技术的发展,证书签名算法也在不断演进。
未来的发展趋势包括:1.高性能:随着大数据、云计算等技术的发展,对签名算法的性能要求越来越高。
因此,研究高性能的签名算法成为未来的一个重要方向。
2.高安全性:随着黑客攻击手段的不断升级,对签名算法的安全性要求也越来越高。
数字签名算法-RSA、DSA、ECDSA、ECDH

数字签名算法-RSA、DSA、ECDSA、ECDH数字签名算法介绍和区别原⽂阅读:数字签名是⼀个带有密钥的消息摘要算法,这个密钥包括了公钥和私钥,⽤于验证数据完整性、认证数据来源和抗否认,遵循OSI参考模型、私钥签名和公钥验证。
也是⾮对称加密算法和消息摘要算法的结合体,常见的数字签名算法主要有RSA、DSA、ECDSA三种,本⽂对数字签名算法进⾏详细介绍。
Hash⼜译散列、摘要等名,本⽂统⼀称Hash。
1. RSA数字签名算法RSA是⽬前计算机密码学中最经典算法,也是⽬前为⽌使⽤最⼴泛的数字签名算法,RSA数字签名算法的密钥实现与RSA的加密算法是⼀样的,算法的名称都叫RSA。
密钥的产⽣和转换都是⼀样的,包括在售的所有SSL数字证书、代码签名证书、⽂档签名以及邮件签名⼤多都采⽤RSA算法进⾏加密。
RSA数字签名算法主要包括MD和SHA两种算法,例如我们熟知的MD5和SHA-256即是这两种算法中的⼀类,具体如下表格分布1.1. MD2、MD4、MD5算法最常见的是我们熟知的MD5加密算法,MD5全称Message-Digest Algorithm 5(信息-摘要算法 5),⽬前⽐较普遍的Hash算法,是散列算法的基础原理,MD5的前⾝有MD2、MD3和MD4。
MD5算法法是输⼊任意长度字符,输出固定长度128位的算法。
经过程序流程,⽣成四个32位数据,最后联合起来成为⼀个128位Hash值,主要⽅式是通过求余、取余、调整长度、与链接变量进⾏循环运算进⽽得出结果。
1.2. SHA-1算法SHA-1是由NIST NSA设计为同DSA⼀起使⽤的,SHA-1设计时基于和MD4相同原理,并且模仿了该算法,SHA-1抗穷举(brute-force)性更好,它产出160位的Hash值,对于⾮线性运算、移位和加法运算也与MD5类似。
SHA-1也应⽤于包括TLS和SSL、PGP、SSH、S/MIME和IPsec等多种协议中,曾被视为是MD5的后继者。
DSA算法

DSA的安全性 :
DSA主要依赖于整数有限域离散对数难题。参数中, 素数 P 必须足够大,且p-1至少包含一个大 素数因子以抵 抗Pohlig & Hellman算法的攻击。M 一般都应采用信息的 HASH值。DSA的安全性主要依赖于p和g,若选取不当则 签名容易伪造,应保证g对于p-1的大素数因子不可约。 DSA的一个重要特点是两个素数公开,这样,当使用别人 的p和q时,即使不知道私钥,你也能确认它们是否是随机 产生。
签名产生过程如下:
• 1)、产生一个随机数k,其值满足0< k < q 。2)、计算 r = powm(g, k, p) mod q ,其值满足 r >0 。 • 3)、计算 s = ( k^(-1) ( SHA(M) + x*r) ) mod q ,其值满足 s >0 。 注: • 1)、k^(-1) 表示整数k关于某个模数的逆元,并非指 k 的倒 数。k在每次签名时都要重新生成,永远不要将同样的K用 于进行其他的签名运算! • 逆元:满足 (a*b) mod m =1 的a和b互为关于模数 m 的逆 元,表示为 a=b^(-1) 或 b=a^(-1) 。
DSA算法
通D男生 男生
组长石毅
• Digital Signature Algorithm (DSA)是Schnorr和 ElGamal签名算法的变种,被美国NIST作为 DSS(DigitalSignature Standard)。它是一种公开 密钥算法,它不能用作加密,只用作数字签名。 DSA使用公开密钥,为接受者验证数据的完整性 和数据发送者的身份。同时,它也可用于由第三 方去确定签名和所签数据的真实性。
• 信息交流中,如果接收方希望收到的信息未被窜 改(信息完整性),还希望接收到的信息确由自己 认定的发送方所发(信息来源有效性),那么接收 方和发送方就可以约定,共同使用DSA(Digital Signature Algorithm)来实现。
DSA算法

ElGamal签名的安全性依赖于乘法群上 的离散对数计算。素数p必须足够大,且p1至少包含一个大素数。 M一般都应采用信息的HASH值(如SHA算 法)。ElGamal的安全性主要依赖于p和g, 若选取不当则签名容易伪造,应保证g对于 p-1的大素数因子不可约。 ElGamal的一个不足之处是它的密文成倍扩 张。
6. DSA的安全性 DSA主要依赖于整数有限域离散对数难 题。素数 P 必须足够大,且p-1至少包含一 个大 素数因子以抵抗Pohlig & Hellman算法 的攻击。M 一般都应采用信息的HASH值。 DSA的安全性主要依赖于p和g,若选取不 当则签名容易伪造,应保证g对于p-1的大 素数因子不可约。DSA的一个重要特点是 两个素数公开,这样,当使用别人的p和q 时,即使不知道私钥,你也能确认它们是 否是随机产生。
首先选择一个素数p,两个随机数, a和x,a, x < p, 计算 y = a^x ( mod p ),则其公钥为 y, a 和p。 私钥是x。a和p可由一组用户共享。
ElGamal用于数字签名。被签信息为M,首 先选择一个随机数k, k与 p - 1互质,计算 r= g^k ( mod p ) 再用扩展 Euclidean 算法对下面方程求解s: M = x*r + k*s ( mod p - 1 ) 签名就是( r, s)。随机数k须丢弃。 验证时要验证下式: y^r* r^s ( mod p ) = g^M ( mod p ) 同时一定要检验是否满足1<= a < p。否则 签名容易伪造。
2 扩展Euclidean算法 给定两个整数a和b,我们还经常需要求得 另外两个整数s和t,使得 s*a + b*t =gcd(a,b) 扩展Euclidean算法可以计算gcd(a,b),也可 以同时计算s和t的值。这种算法的过程如下 图所示。
openssl dsa 证书内容

DSA(数字签名算法)是一种非对称加密算法,它被广泛应用于数字证书的生成和验证过程中。
OpenSSL作为一个开源的加密库,不仅提供了DSA算法的实现,同时也支持了DSA证书的生成和管理。
本文将围绕着OpenSSL DSA证书的内容展开讨论,包括DSA证书的结构、各个字段的含义以及DSA证书的生成和使用方法。
一、DSA证书的结构DSA证书是X.509证书的一种,它的结构遵循了X.509证书的标准。
一个典型的DSA证书包括了以下几个部分:1. 证书版本(Version):用于标识证书的版本号,通常为0x02表示X.509v3版本。
2. 序列号(Serial Number):用于唯一标识证书的序列号,通常是一个正整数。
3. 签发者信息(Issuer):包括了签发者的名称、组织单位、组织等信息,用于标识证书的签发者。
4. 有效期(Validity):包括了证书的起始日期和截止日期,用于指定证书的有效期限。
5. 主体信息(Subject):包括了证书持有者的名称、组织单位、组织等信息,用于标识证书的持有者。
6. 公钥信息(Public Key):包括了DSA公钥的参数,如p(大素数)、q(子素数)、g(生成元)等。
7. 签名算法(Signature Algorithm):用于指定证书的签名算法,通常是DSA。
8. 签名值(Signature Value):包括了使用签发者的私钥对证书内容的哈希值进行签名后的结果。
以上这些部分构成了一个完整的DSA证书,它们共同描述了证书的各项信息,并通过签名值来保证了证书内容的完整性和真实性。
二、DSA证书的各个字段含义1. 证书版本:标识了证书的版本号,包括了0x01、0x02等不同版本号,通常为0x02表示X.509v3版本。
2. 序列号:唯一标识了证书的序列号,可以用于区分不同的证书实例。
3. 签发者信息:包括了签发者的名称、组织单位、组织等信息,用于标识证书的签发者。
常用非对称加密算法

常用非对称加密算法
非对称加密算法是一种加密方法,使用了两个密钥,一个用于加密,另一个用于解密。
下面列出了一些常用的非对称加密算法:
1.RSA(Rivest-Shamir-Adleman):RSA 是最早也是最广泛使用的非对称加密算法之一。
它基于大整数分解的困难性,即将一个大整数分解成其素数因子的难题。
RSA在数字签名、加密通信等领域广泛应用。
2.DSA(Digital Signature Algorithm):DSA 是用于数字签名的非对称加密算法,主要用于验证数据的完整性和认证身份。
3.Diffie-Hellman 密钥交换:Diffie-Hellman 密钥交换协议不直接用于加密或签名,而是用于在不安全的通信渠道上安全地交换密钥,以便进行对称加密。
它基于一个数学难题,即离散对数问题。
4.Elliptic Curve Cryptography(ECC):ECC 是一种基于椭圆曲线的加密方法,与传统的 RSA 和 DSA 相比,它在提供相同安全性的情况下需要更短的密钥长度,从而节省了计算资源。
5.ElGamal 加密:ElGamal 加密算法是一种基于离散对数问题的非对称加密方法,可以用于加密通信和数字签名。
这些非对称加密算法在保护信息安全和实现加密通信方面都发挥了重要作用。
在选择算法时,需要考虑其安全性、性能和应用场景。
同时,由于计算机安全技术不断发展,也要注意选择算法时的时效性。
1/ 1。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DSA数字签名算法1 引言为了确保数据传输的安全性,不得不采取一系列的安全技术,如加密技术、数字签名、身份认证、密钥管理、防火墙、安全协议等。
其中数字签名就是实现网上交易安全的核心技术之一,它可以保证信息传输的保密性、数据交换的完整性、发送信息的不可否认性、交易者身份的确定性等。
DSA(Digital Signature Algorithm,数字签名算法,用作数字签名标准的一部分),它是另一种公开密钥算法,它不能用作加密,只用作数字签名。
DSA使用公开密钥,为接受者验证数据的完整性和数据发送者的身份。
它也可用于由第三方去确定签名和所签数据的真实性。
DSA算法的安全性基于解离散对数的困难性,这类签字标准具有较大的兼容性和适用性,成为网络安全体系的基本构件之一。
2. 数字签名2.1 数字签名的概念数字签名在ISO7498—2标准中定义为:“附加在数据单元上的一些数据,或是对数据单元所作的密码变换,这种数据和变换允许数据单元的接收者用以确认数据单元来源和数据单元的完整性,并保护数据,防止被人(例如接收者)进行伪造”。
数字签名是通过一个单向函数对要传送的信息进行处理得到的用以认证信息来源并核实信息在传送过程中是否发生变化的一个字母数字串。
数字签名提供了对信息来源的确定并能检测信息是否被篡改。
数字签名要实现的功能是我们平常的手写签名要实现功能的扩展。
平常在书面文件上签名的主要作用有两点,一是因为对自己的签名本人难以否认,从而确定了文件已被自己签署这一事实;二是因为自己的签名不易被别人模仿,从而确定了文件是真的这一事实。
采用数字签名,也能完成这些功能:(1)确认信息是由签名者发送的;(2)确认信息自签名后到收到为止,未被修改过;签名者无法否认信息是由自己发送的。
数字签名和手签的区别是:手签是模拟的,易伪造,而数字签名是基于数学原理的,更难伪造。
数字签名的技术基础是公钥密码技术。
密钥必须以某种安全的方式告诉解密方。
大家熟悉的DES加密标准就是一种对称加密技术。
1976年,Diffie和Hellman在一篇名叫“New Direction in Cryptog raphy(密码学的新方向)”一文中提出了一个新的思想,即:不仅加密算法本身可以公开,就是加密用的密钥本身也可以公开。
这就是公钥密码体制。
其中使用的密钥被分解为一对:一把公钥和一把私钥。
只要私钥保密就可以了,公钥可以发到因特网(如网站的黄页)等公开地方供别人查询和下载。
2.2 数字签名的原理图1. 数字签名的原理图处理过程:(采用双重加密)(1)使用SHA编码将发送文件加密产生128bit的数字摘要;(2)发送方用自己的专用密钥对摘要再加密,形成数字签名;(3)将原文和加密的摘要同时传给对方;(4)接受方用发送方的公共密钥对摘要解密,同时对收到的文件用SHA编码加密产生同一摘要;(5)将解密后的摘要和收到的文件在接受方重新加密产生的摘要相互对比,如果两者一致,则说明在传送过程中信息没有破坏和篡改。
否则,则说明信息已经失去安全性和保密性。
3数字签名的方案3.1 RSA数字签名系统RSA算法中数字签名技术实际上是通过一个哈希函数来实现的。
数字签名的特点是它代表了文件的特征,文件如果发生改变,数字签名的值也将发生变化。
不同的文件将得到不同的数字签名。
用RSA或其它公开密钥密码算法的最大方便是没有密钥分配问题。
因为公开密钥加密使用两个不同的密钥,其中有一个是公开的,另一个是保密的。
公开密钥可以保存在系统目录内、未加密的电子邮件信息中、电话黄页(商业电话)上或公告牌里,网上的任何用户都可获得公开密钥。
3.2 Hash签名Hash签名是最主要的数字签名方法,也称之为数字摘要法(Digital Digest)或数字指纹法(Digital Finger Print)。
它与RSA数字签名是单独的签名不同,该数字签名方法是将数字签名与要发送的信息紧密联系在一起,它更适合于电子商务活动。
将一个商务合同的个体内容与签名结合在一起,比合同和签名分开传递,更增加了可信度和安全性。
一个Hash函数满足:①H可以作用于一个任意长度的数据块;②H产生一个固定长度的输出;③H(x)对任意给定的x计算相对容易,无论是软件还是硬件实现;④对任意给定码h,找到x满足H(x)=h具有计算不可行性;⑤对任意给定的数据块x,找到满足H(y)=H(x)的y x具有计算不可行性;⑥找到任意数据对(x,y),满足H(x) = H(y)是计算不可行的。
用Hash函数实验签名的方案如下:发送方X:准备消息M,计算其散列码H(M),用X的私钥对散列值构成签名Kx-1[H(M)],并将消息M及签名Kx-1 [H(M)]发送给Y接收方Y:对收到的消息M′计算用H(M′),利用公钥解密Kx-1[H(M)],然后比较Kx [Kx-1 [H(M)]]和H(M′),如果Kx [Kx-1 [H(M)]] =H(M′),则签名得到验证。
3.3 椭圆曲线数字签名算法(ECDSA)椭圆曲线的数字签名具有与RSA数字签名和DSA数字签名基本上相同的功能,但实施起来更有效,因为椭圆曲线数字签名在生成签名和进行验证时要必RSA和DSA来得快。
椭圆曲线数字签名的速度要比RSA、DSA快,还可以用在一些较小、对资源有一定限制得设备如智能卡(含有微处理器芯片得塑料片)中。
3.4 美国数字签名标准(DSA)数字签名算法(Digital Signature Algorithm,DSA)是Schnorr和ElGamal签名算法的变种,由美国国家标准化技术研究院(NIST)和国家安全局共同开发。
DSA是基于离散对数的难度。
4 基于DSA数字签名的实现方法建立在公钥密码技术上的数字签名方法有很多,有RSA签名、DSA签名和椭圆曲线数字签名算法(ECDSA)等等。
下面对DSA签名进行详细分析。
(1)DSA算法参数说明DSA算法中应用了下述参数:p:L bits长的素数。
L是64的倍数,范围是512到1024;q:p - 1的160bits的素因子;g:g = hp-1 mod p,h满足h < p - 1, h(p-1)/q mod p > 1;x:1<x< q,x为私钥;y:y = gx mod p ,( p, q, g, y )为公钥;H( x ):单向Hash函数。
在DSS中选用安全散列算法( Secure Hash Algorithm,SHA )[]。
p, q, g:可由一组用户共享,但在实际应用中,使用公共模数可能会带来一定的威胁。
(2)签名及验证协议签名及验证协议如下:①P产生随机数k,k < q;②P计算r = ( gk mod p ) mod q和s = ( k-1 (H(m) + xr)) mod q签名结果是( m, r, s )。
③验证时计算w = s-1mod q计算u1 = ( H( m ) * w ) mod q计算u2 = ( r * w ) mod q计算v = (( gu1 * yu2 ) mod p ) mod q若v = r,则认为签名有效。
5.结果在VC++ 编译环境下,可实现对DSA数字签名。
其中对摘要的加密和签名可以选择不同的算法。
结果如图:6.结论DSA主要依赖于整数有限域离散对数难题。
素数P 必须足够大,且p-1至少包含一个大素数因子以抵抗Pohlig & Hellman算法的攻击。
M 一般都应采用信息的HASH值(官方推荐为SHA算法)。
DSA的安全性主要依赖于p和g,若选取不当则签名容易伪造,应保证g 对于p-1的大素数因子不可约。
DSA的安全性要次于ECC 与RSA不相上下。
但是有一点,就是DSA算法的验证过程R,S 是以明文形式出现的,这点很容易被利用。
但是随着加密技术的发展,椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线对数字签名算法(DSA)的模拟。
与普通的离散对数问题(discrete logarithm problem DLP)和大数分解问题(integer factorization problem IFP)不同,椭圆曲线离散对数问题(elliptic curve discrete logarithm problem ECDLP)没有亚指数时间的解决方法。
因此椭圆曲线密码的单位比特强度要高于其他公钥体制。
7.附录// 数字签名Dlg.cpp : implementation file//#include "stdafx.h"#include "数字签名.h"#include "数字签名Dlg.h"#include "BigInt.h"#include "MD5.h"#include "SHA1.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifCBigInt sha(CBigInt y);CBigInt pow2( const int x, int y); CBigInt makerandnumber( unsigned int len);CBigInt pow3(CBigInt x, CBigInt y, CBigInt m);///////////////////////////////////// ///////////////////////////////////// ///// CAboutDlg dialog used for App About class CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual voidDoDataExchange(CDataExchange* pDX); // DDX/DDV support//}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)virtual void OnOK();//}}AFX_MSGDECLARE_MESSAGE_MAP() };CAboutDlg::CAboutDlg() :CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}voidCAboutDlg::DoDataExchange(CDataExchan ge* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg)//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////// ///////////////////////////////////// ///// DMyDlg dialogDMyDlg::DMyDlg(CWnd* pParent/*=NULL*/): CDialog(DMyDlg::IDD, pParent) {//{{AFX_DATA_INIT(DMyDlg)m_P = _T("");m_Q = _T("");m_G = _T(""); //mpdified in 2007.6.10m_Y = _T("");m_S = _T("");m_V = _T("");m_Len = 0;m_OUT = _T("");m_IN = _T("");ready = 0;m_file = _T("");m_string = _T("");//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon =AfxGetApp()->LoadIcon(IDR_MAINFRAME); }voidDMyDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(DMyDlg)DDX_Text(pDX, IDC_P, m_P);DDX_Text(pDX, IDC_Q, m_Q);DDX_Text(pDX, IDC_G, m_G);// mpdified in 2007.6.10DDX_Text(pDX, IDC_Y, m_Y);DDX_Text(pDX, IDC_S, m_S);DDX_Text(pDX, IDC_V, m_V);DDX_CBIndex(pDX, IDC_COMBO,m_Len);DDX_Text(pDX, IDC_OUTPUT, m_OUT);DDX_Text(pDX, IDC_INPUT, m_IN);DDX_Text(pDX, IDC_EDITFILE,m_file);DDX_Text(pDX, IDC_STRING,m_string);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(DMyDlg, CDialog) //{{AFX_MSG_MAP(DMyDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON_GET, OnButtonGet)ON_BN_CLICKED(IDC_ENCRYPT, OnEncrypt)ON_BN_CLICKED(IDC_DECRYPT, OnDecrypt)ON_BN_CLICKED(IDC_Btnfile, OnBtnfile)ON_EN_CHANGE(IDC_EDITFILE, OnChangeEditfile)ON_EN_CHANGE(IDC_STRING, OnChangeString)ON_BN_CLICKED(IDC_SHA1_RADIO, OnSha1Radio)ON_BN_CLICKED(IDC_MD5_RADIO, OnMd5Radio)ON_CBN_EDITCHANGE(IDC_COMBO, OnEditchangeCombo)ON_BN_CLICKED(IDC_BUTTON1, OnButton1)//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////// ///////////////////////////////////// ///// DMyDlg message handlersBOOL DMyDlg::OnInitDialog() {CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUT BOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR );pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialogSetIcon(m_hIcon, TRUE);// Set big iconSetIcon(m_hIcon, FALSE);// Set small icon// TODO: Add extra initialization hereCheckRadioButton(IDC_MD5_RADIO,ID C_SHA1_RADIO,IDC_MD5_RADIO);UpdateData(FALSE);return TRUE; // return TRUE unless you set the focus to a control }void DMyDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model,// this is automatically done for you by the framework.void DMyDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user drags // the minimized window.HCURSOR DMyDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}void DMyDlg::OnButtonGet(){// TODO: Add your control notification handler code hereready=1;UpdateData(TRUE);CTime t0=CTime::GetCurrentTime(); /*int len=8; //int len=2; modified in 2007 6. 9for(int i=0;i<m_Len;i++){len*=2;}P.Mov(0);Q.Mov(0);N.Mov(0);E.Mov(0);P.GetPrime(len);Q.GetPrime(len);N.Mov(P.Mul(Q));N.Put(m_P);P.m_ulValue[0]--;Q.m_ulValue[0]--;P.Mov(P.Mul(Q));D.Mov(0x10001); //mpdified in 2007.6.10// m_D="10001"; //mpdified in 2007.6.10E.Mov(D.Euc(P));E.Put(m_Q);CTime t1=CTime::GetCurrentTime(); CTimeSpan t=t1-t0;m_OUT.Format("%d",t.GetTotalSecon ds());m_OUT+=" 秒";Q.m_ulValue[0]=0;*/CBigInt r,s,u,v[4],w,p,q,t;//,H,G,X,Y;int n=3,b=31,L=512,g=160,T=1;t.Mov(pow2(2,g));while (T){s.Mov(makerandnumber(g));// r.Mov(s);// r.Mov(r.Add(1));// r.Mov(r.Mod(t));// u.Mov(sha(s));q.Mov(sha(s));q.m_ulValue[0]=q.m_ulValue[0]|0x1 ;q.m_ulValue[4]=q.m_ulValue[4]|0x8 0000000;while (q.Rab()==0)q.Mov(q.Add(2));int C=0,N=2;for (int k=0;k<4;k++){v[k].Mov(s);v[k].Mov(v[k].Add(N+k));v[k].Mov(v[k].Mod(t));v[k].Mov(sha(v[k]));}w.Mov(0);r.Mov(1);for ( k=0;k<3;k++){v[k].Mov(v[k].Mul(r));w.Mov(w.Add(v[k]));r.Mov(r.Mul(t));}s.Mov(pow2(2,b));v[k].Mov(v[k].Mod(s));v[k].Mov(v[k].Mul(r));w.Mov(w.Add(v[k]));r.Mov(w);r.Mov(r.Add(1));w.Mov(w.Mod(q));r.Mov(r.Sub(w));p.Mov(r);while (p.Rab()==0){C=C+1;N=N+n+1;if (C==4096) break;p.Mov(p.Add(q));p.Mov(p.Add(q));}if (C<4096) break;}P.Mov(p);Q.Mov(q);H.Mov(makerandnumber(g));X.Mov(makerandnumber(g));X.Mov(X.Mod(Q));t.Mov(P.Sub(1));t.Mov(t.Div(Q));G.Mov(H.RsaTrans(t, Q));Y.Mov(G.RsaTrans(X, P));P.Put(m_P);Q.Put(m_Q);G.Put(m_G);Y.Put(m_Y);// m_D="10001";CTime t1=CTime::GetCurrentTime(); CTimeSpan t2=t1-t0;m_OUT.Format("%d",t2.GetTotalSeco nds());m_OUT+=" 秒";UpdateData(FALSE);}void DMyDlg::OnEncrypt(){// TODO: Add your control notification handler code hereCBigInt g,t;if(ready==0){m_OUT=_T("请先输入或生成N、D、E");UpdateData(FALSE);return;}UpdateData(TRUE);if(m_IN.GetLength()>256){m_OUT=_T("N不得大于256位");UpdateData(FALSE);return;}K.Mov(makerandnumber(160));R.Mov(G.RsaTrans(K,P));R.Mov(R.Mod(Q));S.Mov(K.Euc(Q));g.Get(m_IN);t.Mov(X.Mul(R));t.Mov(t.Mod(Q));t.Mov(t.Add(g));S.Mov(S.Mul(t));S.Mov(S.Mod(Q));R.Put(m_OUT);S.Put(m_S);/* for(inti=0;i<m_IN.GetLength();i++){if((m_IN[i]<'0')||((m_IN[i]>'9')&&(m_IN[i]<'A'))|| ((m_IN[i]>'F')&&(m_IN[i]<'a'))||(m_IN[i]>'f')){m_OUT=_T("待加密数据必须为0-9或A-F或a-f组成的整数");UpdateData(FALSE);return;}}*/// P.Get(m_IN);// if(P.Cmp(N)>=0)// {// m_OUT=_T("待加密数据必须小于N");// UpdateData(FALSE);// return;// }// Q.Mov(P.RsaTrans(E,N));// Q.Put(m_OUT);UpdateData(FALSE);}void DMyDlg::OnDecrypt(){CBigInt W,U1,U2,t;// TODO: Add your controlnotification handler code hereif((ready==0)||(Q.m_ulValue[0]==0 )){m_OUT=_T("请先进行数字签名"); UpdateData(FALSE);return;}W.Mov(S.Euc(Q));U1.Get(m_IN);U1.Mov(U1.Mul(W));U1.Mov(U1.Mod(Q));U2.Mov(R.Mul(W));U2.Mov(U2.Mod(Q));V.Mov(G.RsaTrans(U1,P));V.Mov(V.Mod(P));t.Mov(Y.RsaTrans(U2,P));t.Mov(t.Mod(P));V.Mov(V.Mul(t));V.Mov(V.Mod(P));V.Mov(V.Mod(Q));if (V.Cmp(R)==0) V.Put(m_V);R.Put(m_V);// Q.Get(m_OUT);// P.Mov(Q.RsaTrans(D,N));// P.Put(m_OUT);UpdateData(FALSE);}void DMyDlg::OnBtnfile(){// TODO: Add your control notification handler code hereCFileDialog m_FileOpen(TRUE);//设置打开窗体的标题m_FileOpen.m_ofn.lpstrTitle = _T("打开文件");m_FileOpen.m_ofn.lpstrFilter =_T("文件 (*.*)\0*.*\0\0");//点击浏览按钮if(IDOK == m_FileOpen.DoModal()){//获取打开的文件路径CString m_FileName =m_FileOpen.GetPathName();CEdit* pEdit =(CEdit*)(GetDlgItem(IDC_EDITFILE));//将选择的文件路径名显示到IDC_EDITFILE表识的EDIT中pEdit->SetWindowText(m_FileName);}}void byte2strhash(unsigned char*hash,int hashlen,unsigned char *out) {int i,x,y;for (i = 0;i < hashlen; i++){y = hash[i] >> 4;y += 0x30;if (y > 0x39) y+= 0x07;x = hash[i] & 0x0F;x += 0x30;if (x > 0x39) x+= 0x07;out[i << 1] = y;out[(i << 1)+1] = x;}out[hashlen << 1] = 0x00;}void DMyDlg::OnChangeEditfile(){// TODO: If this is a RICHEDIT control, the control will not// send this notification unless you override the CDialog::OnInitDialog() // function and callCRichEditCtrl().SetEventMask()// with the ENM_CHANGE flag ORedinto the mask.// TODO: Add your controlnotification handler code hereUpdateData(TRUE);CString open=m_file;MD5_CTX md5_ctx;SHA1_CTX sha1_ctx;int hashradio;hashradio=GetCheckedRadioButton(IDC_MD5_RADIO,IDC_SHA1_RADIO);if(hashradio==IDC_MD5_RADIO) //MD5{int i;unsigned chardigest[16],output[16];FILE* file;unsigned char buffer[16384];MD5Init(&md5_ctx);file = fopen(open, "rb");i = fread(buffer, 1, 16384, file);MD5Update(&md5_ctx, buffer,i);MD5Final(digest, &md5_ctx);fclose(file);byte2strhash(digest,16,output);CString str(output);SetDlgItemText(IDC_INPUT,str);}else //SHA-1{int i;unsigned chardigest[20],output[20];FILE* file;unsigned char buffer[16384];SHA1Init(&sha1_ctx);file = fopen(open, "rb");i = fread(buffer, 1, 16384, file);SHA1Update(&sha1_ctx, buffer, i);SHA1Final(digest, &sha1_ctx);fclose(file);byte2strhash(digest,20,output);CString str(output);SetDlgItemText(IDC_INPUT,str);}}void DMyDlg::OnChangeString(){// TODO: If this is a RICHEDIT control, the control will not// send this notification unless you override the CDialog::OnInitDialog() // function and callCRichEditCtrl().SetEventMask()// with the ENM_CHANGE flag ORedinto the mask.// TODO: Add your controlnotification handler code hereUpdateData(TRUE);MD5_CTX md5_ctx;SHA1_CTX sha1_ctx;int hashradio;hashradio=GetCheckedRadioButton(IDC_MD5_RADIO,IDC_SHA1_RADIO);if(hashradio==IDC_MD5_RADIO) //MD5{unsigned chardigest[16],output[16];UpdateData(TRUE);CString context=m_string;MD5Init(&md5_ctx);unsigned char *buf = (unsigned char*)context.GetBuffer(context.GetLe ngth());MD5Update(&md5_ctx,buf,strlen(context));MD5Final(digest, &md5_ctx);context.ReleaseBuffer();byte2strhash(digest,16,output);CString str(output);SetDlgItemText(IDC_INPUT,str);}else //SHA1{unsigned chardigest[20],output[20];UpdateData(TRUE);CString context=m_string;SHA1Init(&sha1_ctx);unsigned char *buf = (unsigned char*)context.GetBuffer(context.GetLe ngth());SHA1Update(&sha1_ctx,buf, strlen(context));SHA1Final(digest, &sha1_ctx);context.ReleaseBuffer();byte2strhash(digest,20,output);CString str(output);SetDlgItemText(IDC_INPUT,str);}}void DMyDlg::OnSha1Radio(){// TODO: Add your control notification handler code here}void DMyDlg::OnMd5Radio(){// TODO: Add your controlnotification handler code here}void DMyDlg::OnEditchangeCombo() {// TODO: Add your control notification handler code here}void DMyDlg::OnButton1(){// TODO: Add your control notification handler code hereCDialog::OnOK();}void CAboutDlg::OnOK(){// TODO: Add extra validation hereCDialog::OnOK();}。