pythontextbase64nacl-cryptographypynacl

How to use Python to save nacl SigningKey public and private keys as plain text?


I must be missing something in the nacl docs. How do I save both the private and public keys in plain text? The available encoders are Raw (binary?), Hex, Base16/32/64 and URLSafeBase64Encoder.

I thought I would just use the base64 library to convert the Base64-encoded key.

Example:

from nacl.signing import SigningKey
from nacl.encoding import Base64Encoder
from base64 import b64decode


# Create SigningKey as base64-encoded bytes

signing_key = SigningKey.generate().encode(encoder=Base64Encoder)
print(type(signing_key))


# Convert base64-encoded bytes to string

signing_key = signing_key.decode('utf-8')
print(type(signing_key))


# Decode base64 string to plain text

signing_key = b64decode(signing_key)
print(type(signing_key))
print(signing_key)

Results: Bytes object

<class 'bytes'>
<class 'str'>
<class 'bytes'>
b'e\xfa ?H\xd8\xe7^2\xfa1\x18\xa61\xca\x95\xec~\x8c\x011[\xf8\x05q!\xfc\xe4\x94\x13\xc2\x89'

Tried:


Solution

  • This is mostly the same as the link you attached in your comment, but here is a more succinct example that may help

    signing_key = SigningKey.generate()
    
    priv_key_b64 = signing_key.encode(encoder=Base64Encoder)
    pub_key_b64  = signing_key.verify_key.encode(encoder=Base64Encoder)
    
    data = b'testtest'
    
    signed_b64 = signing_key.sign(data, encoder=Base64Encoder)
    
    print(priv_key_b64)         # private key in alpha-numeric encoding
    print(pub_key_b64)          # public key in alpha-numeric encoding
    print(signed_b64)           # data & signature over data in single chunk
    
    verified = signing_key.verify_key.verify(signed_b64, encoder=Base64Encoder)
    
    print(verified)             # origin 'data' (testtest)
    

    To respond to your comment about the seed, the SigningKey.generate() generates a random seed for you and uses that to construct a private (signing) key. You could provide your own seed using signing_key = SigningKey(seed, encoder=RawEncoder)