Create a tool for public key encryption

This commit is contained in:
Juhani Krekelä 2020-06-25 12:37:10 +03:00
parent d9363f3b69
commit cd6544ce67
1 changed files with 52 additions and 0 deletions

52
tool.py Normal file
View File

@ -0,0 +1,52 @@
import os
import secrets
import sys
import compact_xchapoly
import compact_ecdh_curve25519
def keygen():
sk = os.urandom(32)
pk = compact_ecdh_curve25519.pubkey(sk)
return sk, pk
def enc_pk(pk, plaintext):
ephemeral_sk, ephemeral_pk = keygen()
# Based on monocypher's
raw_shared_secret = compact_ecdh_curve25519.ecdh(pk, ephemeral_sk)
shared_secret = compact_xchapoly.hchacha20(raw_shared_secret, b'\x00'*24)
nonce = os.urandom(24)
print(shared_secret, nonce, plaintext)#debg
return ephemeral_pk + nonce + compact_xchapoly.enc(b'', shared_secret, nonce, plaintext)
def dec_sk(sk, ciphertext):
ephemeral_pk = ciphertext[:32]
nonce = ciphertext[32:56]
ciphertext = ciphertext[56:]
raw_shared_secret = compact_ecdh_curve25519.ecdh(ephemeral_pk, sk)
shared_secret = compact_xchapoly.hchacha20(raw_shared_secret, b'\x00'*24)
return compact_xchapoly.dec(b'', shared_secret, nonce, ciphertext)
def usage():
name=os.path.basename(sys.argv[0])
print('Usage: %s -G seckey\n %s -E pubkey\n %s -D seckey' % (name, name, name), file=sys.stderr)
sys.exit(1)
if __name__ == '__main__':
if len(sys.argv) != 3:
usage()
if sys.argv[1] == '-G':
sk, pk = keygen()
with open(sys.argv[2], 'wb') as f:
f.write(sk)
print('pubkey:', pk.hex())
elif sys.argv[1] == '-E':
pk = bytes.fromhex(sys.argv[2])
print(enc_pk(pk, input().encode('utf-8')).hex())
elif sys.argv[1] == '-D':
with open(sys.argv[2], 'rb') as f:
sk = f.read()
print(dec_sk(sk, bytes.fromhex(input())))
else:
usage()