-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDSA.py
68 lines (57 loc) · 2.66 KB
/
DSA.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
from Crypto.PublicKey import DSA
from Crypto.Signature import DSS
from Crypto.Hash import SHA256
# Por exemplo, é assim que você gera um novo par de chaves DSA,
# salva a chave pública em um arquivo chamado public_key.pem,
# assina uma mensagem (com Crypto.Signature.DSS) e a verifica:
# https://pycryptodome.readthedocs.io/en/latest/src/public_key/dsa.html
# As assinaturas digitais baseiam-se na criptografia de chave pública:
# quem assina a mensagem possui a chave privada e quem verifica a assinatura é a chave pública.
# *** O algoritmo só pode ser usado para autenticação (assinatura digital).
# O DSA não pode ser usado para fins de confidencialidade (criptografia).
# Criando uma chave DSA
pri_key = DSA.generate(2048)
f = open("public_key.pem", "w")
print(pri_key.export_key().decode('UTF-8')) #converte bytes para string
print(pri_key.publickey().export_key().decode('UTF-8'))
f.write(pri_key.publickey().export_key().decode('UTF-8'))
f.close()
# Assinando a mensagem
message = b"Esta mensagem e apenas um Teste! @#$%*()(*&$#@. Mensagem Clara."
hash_obj = SHA256.new(message)
signer = DSS.new(pri_key, 'fips-186-3') # Padrão de Assinatura Digital (DSS)
signature = signer.sign(hash_obj)
print('Assinatura digital com DSA :\nHash SHA256 \t',hash_obj.hexdigest(),'\nAssinatura \t',signature)
# Recebe (signature ,public_key)
# Carregando a chave publica. repete o processo de carregar a chave e gerar a hash como se fosse o receptor
f = open("public_key.pem", "r")
hash_obj = SHA256.new(message)
pub_key = DSA.import_key(f.read())
signer = DSS.new(pub_key, 'fips-186-3') # Padrão de Assinatura Digital (DSS)
# Verificando sua autenticidade 1
try:
signer.verify(hash_obj, signature)
print ("Mensagem 1 é autentica.")
except ValueError:
print ("Mensagem 1 não é autentica.")
finally:
# Verificando sua autenticidade 2, sem assinar
message = b"Mensagem nao assinada! @#$%*()(*&$#@. Mensagem Clara."
hash_obj = SHA256.new(message)
try:
signer.verify(hash_obj, signature)
print ("Mensagem 2 é autentica.")
except ValueError:
print ("Mensagem 2 não é autentica.")
finally:
# Verificando sua autenticidade 3, assinada com outra chave
message = b"Mensagem assinada com outra chave! @#$%*()(*&$#@. Mensagem Clara."
pri_key = DSA.generate(2048)
hash_obj2 = SHA256.new(message)
signer = DSS.new(pri_key, 'fips-186-3') # Padrão de Assinatura Digital (DSS)
signature = signer.sign(hash_obj2)
try:
signer.verify(hash_obj, signature)
print ("Mensagem 3 é autentica.")
except ValueError:
print ("Mensagem 3 não é autentica.")