【问题标题】:Sign and Verify data in a text file using DSA(Digital Signature algorithm)使用 DSA(数字签名算法)对文本文件中的数据进行签名和验证
【发布时间】:2018-03-03 12:18:28
【问题描述】:

我想使用 Python 中的数字签名算法对文本文档 (.txt) 中的数据进行签名。我已经使用 RSA 算法生成了公钥和私钥。然后我使用下面给出的代码对数据进行签名和验证。

from __future__ import print_function
import cv2
import numpy as np
import rsa
from base64 import b64encode, b64decode
import base64
f=open("2.txt",'r') 
msg1=f.read()
keysize = 2048
(public,private) = rsa.newkeys(keysize)

#encrypted = b64encode(rsa.encrypt(msg1, public))

signature = b64encode(rsa.sign(msg1, private, "SHA-512"))

print("Signature: " + signature)

用于在接收端进行验证

from __future__ import print_function
import os
from PIL import Image
import cv2
import numpy as np
import rsa
import base64
from base64 import b64encode, b64decode
from digsig import public
from digsig import signature
f1=open("2.txt",'r') 
msg1=f1.read()
f=open("3.txt",'r') 
msg2=f.read()


#decrypted = rsa.decrypt(b64decode(msg2), private)
#print("Decrypted: '%s'" % decrypted)

verify = rsa.verify(msg1, b64decode(signature), public)
print("Verify: %s" % verify)
rsa.verify(msg2, b64decode(signature), public)

这个 Rsa.py 已经定义了函数

rsa.py

    from Crypto.PublicKey import RSA
    from Crypto.Cipher import PKCS1_OAEP
    from Crypto.Signature import PKCS1_v1_5
    from Crypto.Hash import SHA512, SHA384, SHA256, SHA, MD5
    from Crypto import Random

from base64 import b64encode, b64decode

hash = "SHA-256"

def newkeys(keysize):
    random_generator = Random.new().read
    key = RSA.generate(keysize, random_generator)
    private, public = key, key.publickey()
    return public, private

def importKey(externKey):
    return RSA.importKey(externKey)

def getpublickey(priv_key):
    return priv_key.publickey()

def encrypt(message, pub_key):
    #RSA encryption protocol according to PKCS#1 OAEP
    cipher = PKCS1_OAEP.new(pub_key)
    return cipher.encrypt(message)

def decrypt(ciphertext, priv_key):
    #RSA encryption protocol according to PKCS#1 OAEP
    cipher = PKCS1_OAEP.new(priv_key)
    return cipher.decrypt(ciphertext)



def sign(message, priv_key, hashAlg="SHA-256"):
    global hash
    hash = hashAlg
    signer = PKCS1_v1_5.new(priv_key)
    if (hash == "SHA-512"):
        digest = SHA512.new()
    elif (hash == "SHA-384"):
        digest = SHA384.new()
    elif (hash == "SHA-256"):
        digest = SHA256.new()
    elif (hash == "SHA-1"):
        digest = SHA.new()
    else:
        digest = MD5.new()
    digest.update(message)
    return signer.sign(digest)

def verify(message, signature, pub_key):
    signer = PKCS1_v1_5.new(pub_key)
    if (hash == "SHA-512"):
        digest = SHA512.new()
    elif (hash == "SHA-384"):
        digest = SHA384.new()
    elif (hash == "SHA-256"):
        digest = SHA256.new()
    elif (hash == "SHA-1"):
        digest = SHA.new()
    else:
        digest = MD5.new()
    digest.update(message)
    return signer.verify(digest, signature)

因此,如果我更改文件中的某些数据,则在验证数据时。我得到验证程序是真的,即使它们不相同,两个数据也是相同的。我无法弄清楚为什么会这样。我没有使用 DSA 算法,只是遵循数字签名的过程,即私钥用于在发送方加密数据,并在接收方使用公钥解密该数据,然后验证文件中的两个数据。

【问题讨论】:

    标签: python-2.7 cryptography key rsa digital-signature


    【解决方案1】:

    您只能生成私钥/公钥对。试试RSA.generate(bits)

    【讨论】:

    • 我尝试使用stackoverflow.com/questions/9197507/…这个链接生成一个密钥。但是我在上面的代码中得到一个错误。Traceback (most recent call last): File "3.py", line 45, in <module> sign_data('private.pem','hash.txt') File "3.py", line 38, in sign_data rsakey = RSA.importKey(key) File "C:\Python27\lib\site-packages\Crypto\PublicKey\RSA.py", line 678, in importKey if bord(externKey[0])==0x30: IndexError: string index out of range
    • 似乎您需要为其提供二进制 DER 编码的密钥,您创建的密钥可能是 PEM / ASCII 编码的。 0x30 是 DER 编码的 ASN.1 SEQUENCE 标签。您可以使用 OpenSSL 命令行转换密钥。
    猜你喜欢
    • 1970-01-01
    • 2011-03-28
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多