精华内容
下载资源
问答
  • 2021-01-17 13:45:01

    之前讲到RSA可以用来加密和数字签名,这里是RSA用作数字签名。

    Python的pycrypto库实现的数字签名有一个限制,必须对哈希(hash)值进行签名,而不能直接对原文进行数字签名。好像大部分实现都有此限制。

    from Crypto.PublicKey import RSA

    from Crypto.Signature import PKCS1_v1_5

    import Crypto.Hash.SHA512

    def rsa_sign(plaintext, key, hash_algorithm=Crypto.Hash.SHA512):

    """RSA 数字签名"""

    signer = PKCS1_v1_5.new(RSA.importKey(key))

    #hash算法必须要pycrypto库里的hash算法,不能直接用系统hashlib库,pycrypto是封装的hashlib

    hash_value = hash_algorithm.new(plaintext)

    return signer.sign(hash_value)

    def rsa_verify(sign, plaintext, key, hash_algorithm=Crypto.Hash.SHA512):

    """校验RSA 数字签名"""

    hash_value = hash_algorithm.new(plaintext)

    verifier = PKCS1_v1_5.new(RSA.importKey(key))

    return verifier.verify(hash_value, sign)

    if __name__ == '__main__':

    private_key = '''-----BEGIN RSA PRIVATE KEY-----

    MIICXQIBAAKBgQD1t3KRf4oS3sH8PbABbXL1KBYCnGq4C/yinpfQ2j2eUmZarHuw

    IMT9y5ns1lpZZTktGnypvnQjF8c0Rr/cYU53DJjglAgVEb3el6iU+WZ7nwLub/BN

    YS83zpzrhDE3Qy6qTM3evsUsekBR8x6f6Usl7KpEI/0b+EfRSpXDdvU64wIDAQAB

    AoGBAJK0odHfPTgBCf8pcaGYkG9xLJsIeutCNOd/GxOWif2yIux2WS8SkasaWd+/

    J5iCSD32t4G9dafSNZyvtTPGYUqll4aGXlFqNW8pm16HPQXWrhv1D5LVEEu3zbj+

    iNG+gHwB4bISQAOJbnvB6GoFUbDf8VYwkGGlSLGw5D5tulhRAkEA/XBLTfj+5j40

    QPfuRIhcBsgxynKJDcmV0sLAIOTBIfSKs5nuYHEVEOcGaxS+nPY3w1ffSUPUdxm0

    7L2s+9c0SQJBAPgzLLFvUjM58J/AtklkGyJ3KK5W+jLi/N1PIw7CGYGM2yfFiQLR

    ibtJVjTFhLKqDz/BK4lZ9ffU/VNHSApOncsCQQCRBzSgnw9GtGv0jaxUnW+EFgWg

    IyDYufW5kOafLCh1BNpmYnztxWhXrsyWdF2Ltr48U8mbxGwN57EIFJar2v+5AkA7

    GkSMRAv48tUf1Y4Sz+m+PU3Mph2SPIcmVA/vFb1pIheV0u4bY7Y+iOokStychu52

    qhMp8+gkie2BBTpcafgdAkBw8bAzLgmCV8SZEN60x8c2M2Y95CoYOoMLjvQdEfen

    IeDmun3DtAPBuStwYNfeQnAHCwvcOJsgDiRLzhys3056

    -----END RSA PRIVATE KEY-----'''

    public_key = '''-----BEGIN PUBLIC KEY-----

    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD1t3KRf4oS3sH8PbABbXL1KBYC

    nGq4C/yinpfQ2j2eUmZarHuwIMT9y5ns1lpZZTktGnypvnQjF8c0Rr/cYU53DJjg

    lAgVEb3el6iU+WZ7nwLub/BNYS83zpzrhDE3Qy6qTM3evsUsekBR8x6f6Usl7KpE

    I/0b+EfRSpXDdvU64wIDAQAB

    -----END PUBLIC KEY-----'''

    message = 'RSA数字签名演示'

    signature = rsa_sign(message.encode(encoding='utf-8'), private_key)

    result = rsa_verify(signature, message.encode('utf-8'), public_key)

    print(result)

    相关文章

    更多相关内容
  • 基于RSA数字签名算法的实现,能够用在VC6.0 平台运行。RSA加密算法中,消息发送方是用公钥对数据进行加密,消息接收方用私钥对密文进行解密获得消息;在RSA签名算法中,消息发布者用私钥对消息进行签名,消息接收...
  • rsa数字签名c++图形化界面的实现方式,帮助密码学方面的同学用
  • RSA数字签名java实现

    2014-05-12 17:32:48
    根据上面的过程,我们可以得到RSA数字签名的框图如图2-1: 图 2-1 RSA数字签名框图 2、 假设Alice想和Bob通信,以本地两个文件夹Alice和Bob模拟两个用户,实现消息M和签名的模拟分发 (1)、Alice通过RSA算法生成...
  • 晚上就简单修改了一下早上完成的工具类然后做了一个实现数字签名的工具。还是很有意思的。RSA的工具类做了一点小改动createKeyPair()创建公私钥对的方法访问权限改为publicencryptWithRSA(String str,String ...

    今天早上发了一文简单说了一下RSA公钥密码的实现。晚上就简单修改了一下早上完成的工具类然后做了一个实现数字签名的工具。还是很有意思的。

    RSA的工具类做了一点小改动

    createKeyPair()创建公私钥对的方法访问权限改为public

    encryptWithRSA(String str,String privateKeyFile)RSA加密的方法加入了另一个参数——私钥地址。

    decryptWithRSA(String secret,String publicKeyFile)RSA解密的方法加入了另一个参数——公钥地址。

    原来的工具类中是用公钥加密,私钥解密的。因为现在要实现数字签名,就改成了私钥加密公钥解密。

    ======================RSA工具类的具体实现和原理请看我的上一文=======================

    接下来介绍下几个类:

    这个工具有四个类组成:

    Md5_Utils——实现MD5摘要运算

    RSASignUtils——实现RSA的密钥对生成,加密和解密操作

    View——视图模块(其实就是几个syso)

    InputUtils——输入工具类,主要是格式化输入,判断输入合法性

    DigitalSignature——主类,完成具体的操作。

    主类中生成公私钥对的方法:

    private static void createKeyPair() throws Exception {

    View.ask("是否将公私钥对存放到默认路径?Y/N");

    if (InputUtils.getYesOrNot()) {

    RSASignUtils.createKeyPair();

    View.showInfo("公私钥对存放的路径是:" + new File("").getPath());

    } else {

    View.ask("请输入目标路径:");

    RSASignUtils.setKeyPath(InputUtils.getPath());

    RSASignUtils.createKeyPair();

    }

    View.showInfo("生成密钥对成功!");

    }

    主类中的私钥签名方法:

    // 签名

    private static void signature() throws Exception {

    View.ask("请输入用于加密的私钥的路径:");

    String file = InputUtils.getFile();

    View.ask("请输入被签名的信息:");

    String text = InputUtils.getString();

    String hashText = Md5_Utils.getMD5Value(text);

    View.ask("是否加密信息?Y/N");

    String secret = "";

    if (InputUtils.getYesOrNot()) {

    secret = RSASignUtils.encryptWithRSA(hashText + text, file);

    } else {

    secret = RSASignUtils.encryptWithRSA(hashText, file) + "||||"+text;

    }

    View.showInfo("签名成功!签名后的信息为:"+secret);

    }

    主类中的公钥验证的方法:

    // 验证

    private static void verification() {

    try{

    View.ask("请输入用于解密的公钥的路径:");

    String file = InputUtils.getFile();

    View.ask("请输入被验证的信息:");

    String text = InputUtils.getString();

    String info = null;

    String hashInfo = null;

    if (text.contains("||||")) {

    String secret =  text.split("||||")[0];

    info =  text.split("||||")[1];

    hashInfo = RSASignUtils.decryptWithRSA(secret, file);

    }else{

    String str = RSASignUtils.decryptWithRSA(text, file);

    hashInfo = str.substring(0, 32);

    info = str.substring(32);

    }

    if (Md5_Utils.getMD5Value(info).equals(hashInfo)) {

    View.showInfo("验证成功!是合法的签名!传输过程中没有被篡改!");

    View.showInfo("明文信息是:"+info);

    }else{

    View.inputError("请注意!消息验证不正确!");

    }

    }catch(Exception e){

    View.inputError("请注意!消息验证不正确!");

    }

    }

    main方法:

    public static void main(String[] args) throws Exception {

    boolean isContinue = true;

    while (isContinue) {

    View.welcome();

    switch (InputUtils.getSelect()) {

    case 1:

    createKeyPair();

    break;

    case 2:

    signature();

    break;

    case 3:

    verification();

    break;

    case 4:

    isContinue = false;

    break;

    default:

    View.inputError();

    break;

    }

    }

    }

    其实也没啥要说的,看看代码应该就明白了。View类和InputUtils类就不贴出来了,里面没啥干货。

    其实我还是有一点疑问,因为在解密时需要输入签名后的信息,签名后的信息复制出来的时候有四五行,必须要将这四五行合为一行才能正确验证,否则Scanner读到一行就不读了,我也没有想到其他办法,希望大家能给我好的建议。

    整个工具代码放到Git上了,大家去看吧.

    展开全文
  • 主要介绍了Java实现数字签名算法RSA,结合完整实例形式详细分析了RSA算法的相关概念、原理、实现方法及操作技巧,需要的朋友可以参考下
  • 摘要:在基于RSA数字签名算法中,直接决定实现效率的是大数模幂运算。对基于二进制的Montgomery算法进行了改进,并将其应用于大数的模幂运算中。改进后的算法在保证算法快速实现的同时,又节省了算法运算空间。关键词:...

    摘要:在基于RSA的数字签名算法中,直接决定实现效率的是大数模幂运算。对基于二进制的Montgomery算法进行了改进,并将其应用于大数的模幂运算中。改进后的算法在保证算法快速实现的同时,又节省了算法运算空间。

    关键词:数字签名;RSA;Montgomery算法;模乘

    中图分类号:TP312文献标识码:A文章编号:1009-3044(2009)31-0000-00

    The Introduction and Fast Implementation of Digital Signature Algorithm Based on RSA

    LIU Xue-qing, LI Mei, SONG Chao, ZHU Yan-qin

    (School of Computer Science & Technology, Soochow University, Suzhou 215006, China)

    Abstract: The efficiency of digital signature algorithm based on RSA depends on the modular exponentiation of large integer. We improved the binary Montgomery algorithm and use it in the modular exponentiation of large integer. On the foundation of fast speed,the improved way can also save operation space.

    Key words: digital signature; RSA; Montgomery algorithm; modular multiplication

    随着网络技术的发展,各种网络通信服务应运而生。在享受便捷网络通信服务的同时,各种安全问题也在困扰着人们。由于不是面对面的接触以及没有书面合同的支持,如何确认对方的身份就显得尤为重要。

    在网络中传输的消息可以通过数字摘要技术来确保其在传输的过程中未被修改。但仅仅做到这一步仍存在危险性。假设用户A向B发送消息M,数字摘要算法采用SHA-1,A对M进行SHA-1运算,将M和摘要值S一起发送给B,但消息在途中被C截取(并且C知道此次会话AB双方摘要算法选择的是SHA-1),C将消息m及其SHA-1摘要值s一起发送给B,这样在B端显然能够通过SHA-1的检验,B 就误以为接受到了来自A的消息。解决上述问题的一个好方法就是使用数字签名技术。数字签名技术类似于纸张上的签名或者印章,是不可伪造的。其标准定义为:“附加在数据单元上的一些数据,或是对数据单元所作的密码交换,这种数据和变换允许数据单元的接受者用以确认数据单元来源和数据单元的完整性,并保护数据,防止被人(例如接收者)进行伪造。”

    1 基于RSA数字签名算法简介

    在各类数字签名算法中,基于RSA的数字签名算法是应用相当普遍的一种。其原理简单,理论基础是数论的欧拉定理,它的安全性依赖于大数的因数分解的困难性。其签名产生和签名认证过程为:

    1) 取两个大素数p,q;

    2) 计算n=pq, φ(n)=(p-1)(q-1);

    3) 随机选择整数e,并且满足e和φ(n)互质;

    4) 计算d,使得d*e1 mod φ(n);

    5) 对消息M进行数字摘要运算,得到摘要值S;

    6) 对摘要值S生成签名:V=Sd mod n;

    7) 接收方验证签名:计算s=Ve mod n,并对消息M用同一数字摘要算法进行摘要运算,得到摘要值S。若S=s则通过签名认证。

    在上述过程中,计算得到n,d后应将p,q, φ(n)销毁,将(n,e)公布作为RSA的公钥,将d保密作为RSA的私钥。

    2 RSA算法的快速实现

    在上述基于RSA的数字签名算法中,直接决定效率的是大数模幂运算,也就是形如Md mod n的运算。因此,以下将重点讨论大数模幂运算的快速实现算法。我们将大数用数组来表示,数组的类型定义为64位无符号整型,数组的长度可以根据具体的需求去设置相应的值,这里只要能满足1024位大数的运算就可以了。

    2.1 Montgomery算法在RSA算法中的应用

    模幂运算可以转换为一系列的模乘运算,因此高效的实现大数间的模乘对签名算法的效率意义重大。为此,我们考虑采用Montgomery算法。Montgomery算法给出了满足0

    (T+MN)/RTR-1 mod N

    其中,N和R是互素的两个整数,且满足RR-1-NN’=1(N’=-N-1 mod R),M=TN’mod R。

    由于0

    在RSA算法中我们经常要处理的是形如AB mod N(A,BN保证T

    如果我们直接去求M和(A B +MN)/R,那么我们就需要存储大数的乘积,这在那些对空间有严格限制的场合是行不通的。文献4对此作了适当的改进,改进的算法是基于二进制的。

    2.2 基于任意进制的Montgomery改进算法

    2.2.1 算法设计

    基于二进制的算法虽然避免了保存大数的乘积,但由于参加运算的大数位数多,所以必然存在大量的循环,直接影响到最终算法的效率。我们在原来二进制算法的基础上,对算法加以了改进,改进后的算法是基于任意进制的。具体算法如下:

    输入:N=(Nn-1Nn-2…N0)b, A=(An-1An-2…A0)b, B=(Bn-1Bn-2…B0)b, N’=-N-1 mod b,R=bn,b;

    输出:D=A BR-1 mod N,设D= (dn-1dn-2…d0)b.

    S1. D=0,i=0;

    S2.预计算2B,3B,…,15B和2N,3N, …,15N;

    S3. 若i

    S4. Mi=(d0+AiB0)N’mod b;

    D=(D+Ai +MiN)/b;

    i=i+1,转S3;

    S5. 若D≥N,则D=D-N;

    S6. 返回D为最终结果.

    2.2.2 实现技巧

    当采用16进制即b=16实现上述算法时, R= bn显然大于N。在步骤S4中 AiB 和MiN都是大数的乘法运算,分析发现Ai和Mi取值范围为0~15,可以将步骤S2中预计算的结果2B,3B,…,15B和2N,3N, …,15N保存在两个大数数组中,即BigB[16]={0,B,2B,…,15B},BigN[16]={0,N,2N, …,15N}。这样在计算AiB和MiN时就将大数的乘法运算转换为对数组BigB[Ai]和BigN[Mi]的取值运算。

    此外,在步骤S4中,存在模16和除以16的运算,模运算和除法运算在计算机上实现时开销大,这里我们可以用与操作和移位操作来代替模运算和除法运算,用一个数和0x0F相与来代替模16运算,而一个数除以16可以通过将这个数右移4位来实现。

    2.2.3 性能分析

    上述算法没有像传统的Montgomery算法那样直接去求出M和(A B +MN)/R,这样就避免了保存大数的乘积,节省了运算的空间,同时它又避免了基于二进制的Montgomery算法过多的循环。当遇到大数乘法AiB和MiN时,通过预计算2B,3B,…,15B和2N,3N, …,15N的值,避免了大数间的直接相乘,并且用与和移位这两个易于实现且开销小的操作取代了模操作和除法操作。这样,在很大程度上提高了运算效率。改进后的算法虽然还是存在一定数量的循环,但由于没有大数除法运算和直接的模运算,所以在保证速度的基础上又节省了运算空间。

    3 结束语

    本文介绍了基于RSA的数字签名算法及其相关实现。在实现基于RSA的数字签名算法时,对原有的Montgomery算法进行了改进,改进的算法可以基于任意进制,避免了基于二进制Montgomery算法的过多循环次数以及存储两个大数间乘积的空间需求,在节省运算空间的同时也保证了速度上的高效。

    参考文献:

    [1] St Denis T,Johnson S.程序员密码学[M].沈晓斌,译.北京:机械工业出版社,2007.

    [2] 卢开澄.计算机密码学[M].3版.北京:清华大学出版社,2004.

    [3] Stallin W.Cryptography and Network Security,Fourth Edition[M].北京:电子工业出版社,2006.

    [4] Walter C D.Montgomery exponentiation needs no final subtractions[J].E-lectronic Letters,1999,35(21):1831-1832.

    展开全文
  • ASP基于RSA数字签名的设计与实现(源代码+论文).rar
  • 基于RSA数字签名身份认证技术及其JAVA实现
  • 用python实现RSA算法,包括加密与解密,数字签名。操作的对象是二维码,只是对二维码的信息进行加密解密
  • RSA签名及关于数据串的不经意传输的基础上提出了一种增强的不经意传输协议,解决了一种不经意传输的接入控制问题。除了具备一般不经意传输协议的特征外,具有如下特点:只有持有权威机构发放的签字的接收者才能...
  • ASP基于RSA数字签名的设计与实现(源代码+论文).zip源码C#项目源码+资料打包下载ASP基于RSA数字签名的设计与实现(源代码+论文).zip源码C#项目源码+资料打包下载 1.适合学生做毕业设计参考模板。 2.适合程序员学习...
  • 利用Python实现RSA数字签名的产生和验证过程。 任务1:准备一个私钥文件,一个公钥文件,一个数据文件;   任务2:定义一个函数,能够使用指定的私钥对数据文件进行签 名,并将签名结果输出到文件返回;   任务3...

    利用Python实现RSA数字签名的产生和验证过程。

    任务1:准备一个私钥文件,一个公钥文件,一个数据文件;
      任务2:定义一个函数,能够使用指定的私钥对数据文件进行签 名,并将签名结果输出到文件返回;
      任务3:定义一个函数,能够使用指定的公钥对任务2中的签名    文件进行验证,返回验证结果;
      任务4:利用任务1中的文件对任务2和3中的函数进行测试。

    标准库Hashlib

    实现了SHA1,SHA224以及MD5等多个安全哈希算法,

    pycryptodome的使用

    • Python扩展库pycryptodome和cryptography,提供了SHA系列算法和其他哈希算法,以及DES,AES,RSA等多个加密算法和签名算法的实现
    • pycryptodome是加密库
    • pycryptodome模块不是Python的内置模块,pycryptodome模块实现了各种算法和协议的加密模块的结合,结合了各种加密方式对应的多种加密算法的实现,包括单向加密、对称加密以及公钥加密和随机数操作。
      区别:
      crypto是GPG加解密库,该库已于2016年停更,且pythongnupg库才是最主流的GPG加解密库。
      PyCrypto是Python前主流加解密库,但已停更。
      PyCryptodome是当前最主流的Python加解密库,如果遇到代码中import Crypto等字样,就需要安装这个库。
      安装pycryptodome: pip install pycryptodome

    1、公钥加密

    Crypto.PubicKey.RSA生成私公密钥对

    • 在该模块下的RSA.py源代码中提供了直接生成原始密钥的函数,所以要使用Crypto.Random模块生成
    from Crypto.PublicKey import RSA
    
    key = RSA.generate(2048)
    private_key = key.export_key()
    public_key = key.publickey().export_key()
    
    print(key)
    # print(private_key)
    # print(public_key)
    

    输出:

    Private RSA key at 0x1A81094DF70
    

    用generate函数生成的密钥是一个私钥对象,通过export_key()函数返回这个密钥:

    2、RSA.import_key获得公私密钥

    • 上文已经可以输出一对公私密钥,还要用import_key函数
    • 因为publicKey是一个公钥的实例化对象,即public_key的实例化对象,在使用PKCS1_OAEP实例化加密套件时传入的参数必须是这个对象,查阅PKCS1_OAEP.py的源代码也发现传入的参数key应该是一个对象

    3、RSA加密

    from Crypto.PublicKey import RSA
    
    key = RSA.generate(2048)
    private_key = key.export_key()
    public_key = key.publickey().export_key()
    
    # print(key)
    # print(private_key)
    # print(public_key)
    
    from Crypto.Cipher import PKCS1_OAEP
    
    data = b"123456"
    
    publicKey = RSA.import_key(public_key)
    # print(publicKey)
    # 加密
    cipher = PKCS1_OAEP.new(publicKey)
    encrypted_data = cipher.encrypt(data)
    print(encrypted_data)
    
    

    输出

    b'"9\x8fW+b\x83\xbf\xc7y\xfc3\xb5R@`\xf4\xad}\x9a\x11\x81\xf2\x0f\xf1\xc6_\xf0K\xb7\xf7t\xcb\xaevK\x08\x8cg\xa1\x8ai\x94\xdf8\xc6\\\xb5\xb8\x98\xfd}A\xb3\\\xf7\x91J\x88\x84/\xdc\xd8\xe7<\xe4\xfa[\n`X\xf5\xf6K\xd9`s\x17\x11F\x80~\xcdt$>$R\x86b\x11*m\xeb\xe0\x87,):&g\x98\'\x90\xbf\x8cK\xef\xbb-\xfc\xecF\x93G!\xf7\xff&\x91\xdc\xdcY\xff\xf76\x91\xcb\n\x1a\xb4\xf3\xcep6\xde5\xf0^\xe1\'\xf7\t\xc5\xdbU6\x83\xc7\xf5\xe2\xeb\xf7\xe3;J\xd1\x9b\xd0\x925!\x98s\x189\xdd\xa8=\xbfw^\xe8R\xdc\xce\xb8\xdb`\x96 f\x85\xd7\x10>\xea\x97\x05p\x8c\x00\xd5\xf0\xae\xea\x0c\xf9\x03\xd98N\xbc\xd8RD]\x97Y\x8a/\n\xec\xb5\xe5\xe9\x8ea\x87\xaeE\x9fM\xc7\\\x0c\xefE*}\xea\xcd*\x1f\xacR\xd7X\x85\xea\xbfl\xcc\xa5\xed\x91\x90\x07\x13\xdd\x97\x8c\xfcl\xf2y'
    
    

    加密完成

    4、RSA解密

    # 解密
    privateKey = RSA.import_key(private_key)
    cipher = PKCS1_OAEP.new(privateKey)
    data = cipher.decrypt(encrypted_data)
    print(data)
    
    

    输出

    b'123456'
    

    三、数字签名与验签

    • 数字签名与验签,简单来说步骤为:A使用自己的私钥对消息进行签名,将签名后的信息和公钥发送给B,B使用公钥验证签名是否属于A。
    • 使用Crypto.Publickey,Crypto.Hash,Crypto.Signature三个库,即公钥加密、摘要算法、数字签名三个库
    • 1、Crypto.Hash获取消息的HASH值

    • 这里会用到摘要算法,常用的摘要算法有:MD2,MD4,MD5,SHA-1,SHA-256,RIPEMD128,RIPEMD160等等,用什么摘要算法不重要,只要在验证时有相同的摘要算法即可。这里选择MD5.
    • 2、Crypho.Signature对HASH值使用私钥进行签名

    • 本质上是使用私钥对HASH值进行加密,将公钥私钥以及消息分别放在public_key.pem、private_key.pem、data.txt三个文件中,
    • 有两个注意:获得公私钥要用import_key函数;从data.txt中读取信息后要使用相应的编码格式,digest=MD5.new(data.encode(‘utf-8’))
    • 在Crypto.Signature中随便选择一个模式,选择pkcs1_15模式对消息进行签名
    • 3、签名验证

    • 签名验证部分需要传入三个信息:消息原文(data)、摘要算法(MD5)、HASH值签名结果(signature)

    实验总代码

    from Crypto.PublicKey import RSA
    
    key = RSA.generate(2048)
    
    # 任务1:准备一个私钥文件,一个公钥文件,一个数据文件
    private_key = key.export_key()
    public_key = key.publickey().export_key()
    data = "I love you"
    with open("private_key.pem", "wb") as prifile,\
        open("public_key.pem", "wb") as pubfile,\
        open("data.txt","a") as datafile:
        prifile.write(private_key)
        pubfile.write(public_key)
        datafile.write(data)
    
    from Crypto.Signature import pkcs1_15
    from Crypto.Hash import MD5
    from Crypto.PublicKey import RSA
    
    # 签名
    with open("data.txt", "r") as datafile:
        data = datafile.read()
    
    
    # print(data)
    
    # 任务2:定义签名函数,能够使用指定的私钥对数据文件进行签名,并将签名结果输出到文件返回
    def signaturer(private_key, data):
        # 获取消息的HASH值,摘要算法MD5,验证时也必须用MD5
        digest = MD5.new(data.encode('utf-8'))
        # 使用私钥对HASH值进行签名
        signature = pkcs1_15.new(private_key).sign(digest)
        # 将签名结果写入文件
        sig_results = open("sig_results.txt", "wb")
        sig_results.write(signature)
        sig_results.close()
        return sig_results
    
    
    # 任务3:定义签名验证函数,能够使用指定的公钥对任务2中的签名文件进行验证,返回验证结果
    def verifier(public_key, data, signature):
        digest = MD5.new(data.encode('utf-8'))
        try:
            pkcs1_15.new(public_key).verify(digest, signature)
            print("验证成功!!!")
        except:
            print("签名无效!!!")
    
    
    # 任务4:利用任务1中的文件对任务2和3中的函数进行测试。
    with open('private_key.pem') as prifile, \
            open('data.txt') as datafile:
        private_key = RSA.import_key(prifile.read())
        data = datafile.read()
    
        signaturer(private_key, data)
    
    with open('public_key.pem') as pubfile, \
            open('data.txt') as datafile, \
            open('sig_results.txt', 'rb') as sigfile:
        public_key = RSA.import_key(pubfile.read())
        data = datafile.read()
        signature = sigfile.read()
    
        verifier(public_key, data, signature)
    
    
    
    展开全文
  • 毕业设计完整版ASP基于RSA数字签名的设计与实现(源代码+论文).zip
  • 一、数字签名 数字签名可以识别消息是否被篡改,并验证消息的可靠性,也可以防止否认。 数字签名类似于现实世界中的盖章和签字,它具有以下四大特征: 可验证性:接收者可以验证发送者签名的真实性和有效性; 不可...
  • RSA数字签名

    2020-08-05 19:43:05
    在日常工作中,有很多文件需要领导审阅、签名和盖章,由于...数字签名基于哈希算法和公钥加密算法,对明文报文先用哈希算法计算摘要,然后用私钥对摘要进行加密,得到的值就是原文的数字签名数字签名(又称公钥数字
  • 程序要求清单: 基本流程: 运行结果: INPUT: ...
  • 基于RSA数字签名的设计与实现.doc
  • 基于RSA数字签名的设计与实现毕业论文.doc
  • ASP基于RSA数字签名的设计与实现(源代码论文).rar
  •  1 RSA算法及数字证书  1.1 RSA 算法简介  (1)密钥的生成  密钥的生成过程:  ①选择两个大素数p,q,(p,q 为互异素数,需要保密);  ②计算n = p×q,φ(n) = (p-1)×(q-1);  ③选择整数 ...
  • 毕业论文设计-IT计算机-ASP基于RSA数字签名实现(源码+论文).zip
  • 数字签名算法,c++实现RSA的算法

    热门讨论 2010-12-23 10:10:56
    包涵三个RSA算法,c++是实现数字签名的合集,三个独自的程序,可以独自编译运行,VC6.0下编译
  • 基于RSA数字签名方案

    千次阅读 2019-01-11 20:21:32
    算法分析 RSA签名方案是目前使用较多的一个签名方案,它的安全性是基于大整数因式分解的困难性。 主要包括算法: 秘钥生成算法: 签名算法: 验证算法:
  • ASP基于RSA数字签名的设计与实现(源代码+论文).zip
  • 验证者要知道一个证实数字签名的有效性,必须得到一个称为证实者的第三方的帮助与合作,签名者的安全性和证实...提出了一种完全基于RSA的证实数字签名方案,分析表明,该方案是一种安全而高效的证实数字签名实现方案。
  • RSA数字签名和验证

    2011-06-07 13:00:29
    用java写的RSA签名及其验证代码,密钥等传递可以使用编码格式,大家可以看看! 用java写的RSA签名及其验证代码,密钥等传递可以使用编码格式,大家可以看看! 用java写的RSA签名及其验证代码,密钥等传递可以使用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,116
精华内容 7,646
关键字:

基于rsa的数字签名实现