This is a continuation of the issue: GetScatter/ScatterWebExtension#39
There is two distinct use cases that are important.
- Single account encryption using private key.
- Two accounts data encryption exchange (Alice sends private data to Bob).
For the first case you can sign some TEXT with account private key and then use it on symmetrical encryption algorithms like AES-256. Or you can generate a sharedSecret between the account private key / public key.
In both cases a nonce is recommended to be used for generating the resulting symmetrical key to add entropy. Think of it as disposable keys per message.
For the second case the only option so far is to generate a sharedSecret between Alice private key / Bob public key. (indirect asymmetrical encryption). This also requires the nonce entropy.
My solution Proposal
In order to avoid using encryption inside scatter I propose to only calculate the disposable symmetrical key inside scatter and let the dapp developers use the symmetrical algorithms they choose. AES-XXX or any other.
Requirements to implementation
Note that so far the sharedSecret implemented in eosjs is based on secp256k1 curve that happens to be the default one used to create account keys in crypto. It returns 64 bytes from a sha512 hash.
The encryption key for AES-256 is 32 bytes + 16 bytes for a IV(initialization vector).
Is there a need to generate bigger encryption keys? If so a hashing algorithm that returns more bytes is needed.
check here: https://github.com/EOSIO/eosjs-ecc/blob/master/src/key_private.js#L81
In order to eosjs-ecc play nice with this implementation the crypt function would need receive as parameter the encryption key.
check here: https://github.com/EOSIO/eosjs-ecc/blob/master/src/aes.js#L56
Example:
scatter.getEncryptionKey(fromPubKey, toPubKey, nonce)
NOTE: the fromPubKey to obtain the privateKey inside scatter domain.
Returns the encryptionKey.
Advantages:
- avoids scatter from encrypt/decrypt Data.
- with nonce scatter can require user permission for each getEncryptionKey per message. Also avoids giving the shared secret to a rogue dapp.
Disadvantages:
- none so far? Please comment