com.google.bitcoin.crypto
Class KeyCrypterScrypt

java.lang.Object
  extended by com.google.bitcoin.crypto.KeyCrypterScrypt
All Implemented Interfaces:
KeyCrypter, Serializable

public class KeyCrypterScrypt
extends Object
implements KeyCrypter, Serializable

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.

See Also:
Serialized Form

Field Summary
static int BLOCK_LENGTH
          The size of an AES block in bytes.
static int KEY_LENGTH
          Key length in bytes.
static int SALT_LENGTH
          The length of the salt used.
 
Constructor Summary
KeyCrypterScrypt()
          Encryption/ Decryption using default parameters and a random salt
KeyCrypterScrypt(Protos.ScryptParameters scryptParameters)
          Encryption/ Decryption using specified Scrypt parameters.
 
Method Summary
 byte[] decrypt(EncryptedPrivateKey privateKeyToDecode, org.spongycastle.crypto.params.KeyParameter aesKey)
          Decrypt bytes previously encrypted with this class.
 org.spongycastle.crypto.params.KeyParameter deriveKey(CharSequence password)
          Generate AES key.
 EncryptedPrivateKey encrypt(byte[] plainBytes, org.spongycastle.crypto.params.KeyParameter aesKey)
          Password based encryption using AES - CBC 256 bits.
 boolean equals(Object obj)
           
 Protos.ScryptParameters getScryptParameters()
           
 Protos.Wallet.EncryptionType getUnderstoodEncryptionType()
          Return the EncryptionType enum value which denotes the type of encryption/ decryption that this KeyCrypter can understand.
 int hashCode()
           
 String toString()
           
 
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
 

Field Detail

KEY_LENGTH

public static final int KEY_LENGTH
Key length in bytes.

See Also:
Constant Field Values

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:
Constant Field Values

SALT_LENGTH

public static final int SALT_LENGTH
The length of the salt used.

See Also:
Constant Field Values
Constructor Detail

KeyCrypterScrypt

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


KeyCrypterScrypt

public KeyCrypterScrypt(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 Detail

deriveKey

public org.spongycastle.crypto.params.KeyParameter 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 KeyParameter containing the created AES key
Throws:
KeyCrypterException

encrypt

public EncryptedPrivateKey encrypt(byte[] plainBytes,
                                   org.spongycastle.crypto.params.KeyParameter 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(EncryptedPrivateKey privateKeyToDecode,
                      org.spongycastle.crypto.params.KeyParameter aesKey)
               throws KeyCrypterException
Decrypt bytes previously encrypted with this class.

Specified by:
decrypt in interface KeyCrypter
Parameters:
privateKeyToDecode - The private key to decrypt
aesKey - The AES key to use for decryption
Returns:
The decrypted bytes
Throws:
KeyCrypterException - if bytes could not be decoded to a valid key

getScryptParameters

public Protos.ScryptParameters getScryptParameters()

getUnderstoodEncryptionType

public 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 obj)
Overrides:
equals in class Object


Copyright © 2014. All rights reserved.