Class KeyCrypterScrypt

java.lang.Object
org.bitcoinj.crypto.KeyCrypterScrypt
All Implemented Interfaces:
KeyCrypter

public class KeyCrypterScrypt extends Object implements KeyCrypter

This class encrypts and decrypts byte arrays and strings using scrypt as the key derivation function and AES for the encryption.

You can use this class to:

1) Using a user password, create an AES key that can encrypt and decrypt your private keys. To convert the password to the AES key, scrypt is used. This is an algorithm resistant to brute force attacks. You can use the ScryptParameters to tune how difficult you want this to be generation to be.

2) Using the AES Key generated above, you then can encrypt and decrypt any bytes using the AES symmetric cipher. Eight bytes of salt is used to prevent dictionary attacks.

  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final int
    The size of an AES block in bytes.
    static final int
    Key length in bytes.
    static final int
    The length of the salt used.
  • Constructor Summary

    Constructors
    Constructor
    Description
    Encryption/Decryption using default parameters and a random salt.
    KeyCrypterScrypt(int iterations)
    Encryption/Decryption using custom number of iterations parameters and a random salt.
    KeyCrypterScrypt(org.bitcoinj.protobuf.wallet.Protos.ScryptParameters scryptParameters)
    Encryption/ Decryption using specified Scrypt parameters.
  • Method Summary

    Modifier and Type
    Method
    Description
    byte[]
    decrypt(EncryptedData dataToDecrypt, AesKey aesKey)
    Decrypt bytes previously encrypted with this class.
    Generate AES key.
    encrypt(byte[] plainBytes, AesKey aesKey)
    Password based encryption using AES - CBC 256 bits.
    boolean
     
    org.bitcoinj.protobuf.wallet.Protos.ScryptParameters
     
    org.bitcoinj.protobuf.wallet.Protos.Wallet.EncryptionType
    Return the EncryptionType enum value which denotes the type of encryption/ decryption that this KeyCrypter can understand.
    int
     
    static byte[]
    Returns SALT_LENGTH (8) bytes of random data
     

    Methods inherited from class java.lang.Object

    clone, finalize, getClass, notify, notifyAll, wait, wait, wait
  • Field Details

    • KEY_LENGTH

      public static final int KEY_LENGTH
      Key length in bytes.
      See Also:
    • BLOCK_LENGTH

      public static final int BLOCK_LENGTH
      The size of an AES block in bytes. This is also the length of the initialisation vector.
      See Also:
    • SALT_LENGTH

      public static final int SALT_LENGTH
      The length of the salt used.
      See Also:
  • Constructor Details

    • KeyCrypterScrypt

      public KeyCrypterScrypt()
      Encryption/Decryption using default parameters and a random salt.
    • KeyCrypterScrypt

      public KeyCrypterScrypt(int iterations)
      Encryption/Decryption using custom number of iterations parameters and a random salt. As of August 2016, a useful value for mobile devices is 4096 (derivation takes about 1 second).
      Parameters:
      iterations - number of scrypt iterations
    • KeyCrypterScrypt

      public KeyCrypterScrypt(org.bitcoinj.protobuf.wallet.Protos.ScryptParameters scryptParameters)
      Encryption/ Decryption using specified Scrypt parameters.
      Parameters:
      scryptParameters - ScryptParameters to use
      Throws:
      NullPointerException - if the scryptParameters or any of its N, R or P is null.
  • Method Details

    • randomSalt

      public static byte[] randomSalt()
      Returns SALT_LENGTH (8) bytes of random data
    • deriveKey

      public AesKey deriveKey(CharSequence password) throws KeyCrypterException
      Generate AES key. This is a very slow operation compared to encrypt/ decrypt so it is normally worth caching the result.
      Specified by:
      deriveKey in interface KeyCrypter
      Parameters:
      password - The password to use in key generation
      Returns:
      The AesKey containing the created AES key
      Throws:
      KeyCrypterException
    • encrypt

      public EncryptedData encrypt(byte[] plainBytes, AesKey aesKey) throws KeyCrypterException
      Password based encryption using AES - CBC 256 bits.
      Specified by:
      encrypt in interface KeyCrypter
      Returns:
      encryptedPrivateKey An encryptedPrivateKey containing the encrypted bytes and an initialisation vector.
      Throws:
      KeyCrypterException - if encryption was unsuccessful
    • decrypt

      public byte[] decrypt(EncryptedData dataToDecrypt, AesKey aesKey) throws KeyCrypterException
      Decrypt bytes previously encrypted with this class.
      Specified by:
      decrypt in interface KeyCrypter
      Parameters:
      dataToDecrypt - The data to decrypt
      aesKey - The AES key to use for decryption
      Returns:
      The decrypted bytes
      Throws:
      KeyCrypterException - if bytes could not be decrypted
    • getScryptParameters

      public org.bitcoinj.protobuf.wallet.Protos.ScryptParameters getScryptParameters()
    • getUnderstoodEncryptionType

      public org.bitcoinj.protobuf.wallet.Protos.Wallet.EncryptionType getUnderstoodEncryptionType()
      Return the EncryptionType enum value which denotes the type of encryption/ decryption that this KeyCrypter can understand.
      Specified by:
      getUnderstoodEncryptionType in interface KeyCrypter
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • hashCode

      public int hashCode()
      Overrides:
      hashCode in class Object
    • equals

      public boolean equals(Object o)
      Overrides:
      equals in class Object