Seeder
Security

Security by design

Seeder is built around the idea that every encrypted seed should remain independent. Each recovery phrase is encrypted separately, using its own password-derived encryption key. If one password were ever guessed or compromised, it would not unlock any other encrypted seed, because the other seeds were not encrypted with the same password.

This is fundamentally different from common storage models, where many unencrypted files are protected by one outer access layer, such as a hard drive login, cloud account or server permission. Once that outer layer is bypassed, an attacker may gain access to many readable files at once.

Seeder avoids this model. Encrypted recovery data can be stored publicly on the blockchain, the encryption and decryption process can be publicly documented, and still there is no single password, account, device or storage layer that decrypts all seeds.

Traditional storage versus Seeder security model
Encryption workflow

Standard OpenSSL-based encryption

Seeder uses standard OpenSSL tooling to derive an encryption key and encrypt recovery data with AES-256-GCM inside a CMS envelope. The result is encrypted text that can be handled like ordinary text and stored on-chain.

1. Prepare salt

A random salt is generated for each encryption operation.

HEX_SALT=$(openssl rand -hex 16)

2. Derive encryption key

The password and salt are used to derive a 256-bit secret key with Argon2id.

SECRET_KEY=$(openssl kdf \
  -keylen 32 \
  -kdfopt pass:$PASSWORD \
  -kdfopt hexsalt:$HEX_SALT \
  -kdfopt iter:4 \
  -kdfopt memcost:131072 \
  -kdfopt lanes:2 \
  ARGON2ID)

3. Encrypt recovery phrase

The input seed is encrypted with AES-256-GCM and written as PEM-formatted CMS data.

openssl cms -encrypt \
  -aes-256-gcm \
  -secretkey $SECRET_KEY \
  -secretkeyid 01 \
  -binary \
  -in $INPUT_SEED \
  -outform PEM

At the end of the encrypted text, Seeder appends the generated salt and the encryption configuration version. Version 01 identifies the exact parameter set used for this configuration. The encrypted output can then be stored on the Sui blockchain as ordinary text.

Example encrypted seed output

ENCRYPTED_SEED =
-----BEGIN CMS-----
MFAGCSqGSIb3DQEHBqBDMEECAQAwPAYJKoZIhvcNAQcBMB0GCWCGSAFlAwQBKgQQ
oqaDJvAnKyByBVBlfcHJ0oAQIUGsX/7ybAmFx69CeWw4mQBDMEECAQAwPAYJKoZIhvcN
AQcBMB0GCWCGSAFlAwQBKgQQBDMEECAQAwPAYJKoZIhvcNAQcBMB0GCWCGSAFlA
wQBKgQQoqaDJvAnKyByBVBlfcHJ0oAQIUGsX/7ybAmFx69CeWw4mQ
oqaDJvAnKyByBVBlfcHJ0oAQIUGsX/7ybAmFx69CeWw4mQ==
-----END CMS-----
8cb5915676b67031ad98992d5e44017e
01
Decryption workflow

Recovery without hidden dependencies

Decryption is the reverse process. The encrypted text, appended salt, configuration version and user password are used to reconstruct the same key and decrypt the original seed.

1. Recreate the key

The same password, salt and OpenSSL KDF parameters produce the same secret key.

SECRET_KEY=$(openssl kdf \
  -keylen 32 \
  -kdfopt pass:$PASSWORD \
  -kdfopt hexsalt:$HEX_SALT \
  -kdfopt iter:4 \
  -kdfopt memcost:131072 \
  -kdfopt lanes:2 \
  ARGON2ID)

2. Decrypt the CMS text

The encrypted CMS payload is decrypted with the recreated key.

openssl cms -decrypt \
  -secretkey $SECRET_KEY \
  -secretkeyid 01 \
  -binary \
  -inform PEM \
  -in $ENCRYPTED_SEED \
  -out $INPUT_SEED

The result of decryption is the original INPUT_SEED. Because the process is publicly documented and based on standard OpenSSL commands, recovery does not depend exclusively on one specific Seeder device.

For your security

If you lose your Seeder device, or if our company stops operating, you will always retain a simple way to decrypt your encrypted text within seconds on any PC using the command line or standard OpenSSL tools. Your encrypted recovery data can remain preserved on the blockchain indefinitely.

The only thing you must remember is your password.

Parameter explanation

What each parameter means

Seeder records the salt and configuration version together with the encrypted text, so the same decryption process can be repeated later with the correct parameters.

HEX_SALT

A random 16-byte salt encoded as hexadecimal. It makes each encryption operation unique and prevents equal passwords from producing identical derived keys.

PASSWORD

The user password. It is never stored as plaintext and is used only to derive the encryption key.

openssl kdf

The OpenSSL key derivation command used to transform the password and salt into a fixed-length encryption key.

ARGON2ID

A password-based key derivation function designed to resist brute-force attacks by requiring memory and computation.

-keylen 32

Creates a 32-byte key, which equals 256 bits and matches AES-256.

-kdfopt iter:4

Sets the Argon2id iteration count. More iterations increase the amount of work required to test a password.

-kdfopt memcost:131072

Sets the memory cost for Argon2id. This makes large-scale guessing attacks more expensive.

-kdfopt lanes:2

Sets the parallelism parameter for Argon2id.

AES-256-GCM

The encryption mode used for confidentiality and integrity protection of the encrypted seed data.

CMS

Cryptographic Message Syntax. It provides a standardized envelope format for the encrypted payload.

-secretkeyid 01

Identifies the key and configuration context used by this encryption version.

Version 01

The appended configuration version. It allows future Seeder versions to recognize which parameters were used.

Join the waitlist

Be first. Stay ahead.

Get product updates and early access information as Seeder moves toward public release.