Package org.bitcoinj.crypto
Class KeyCrypterScrypt
java.lang.Object
org.bitcoinj.crypto.KeyCrypterScrypt
- All Implemented Interfaces:
Serializable
,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.
- See Also:
-
Field Summary
Modifier and TypeFieldDescriptionstatic 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
ConstructorDescriptionEncryption/Decryption using default parameters and a random salt.KeyCrypterScrypt
(int iterations) Encryption/Decryption using custom number of iterations parameters and a random salt.KeyCrypterScrypt
(Protos.ScryptParameters scryptParameters) Encryption/ Decryption using specified Scrypt parameters. -
Method Summary
Modifier and TypeMethodDescriptionbyte[]
decrypt
(EncryptedData dataToDecrypt, org.bouncycastle.crypto.params.KeyParameter aesKey) Decrypt bytes previously encrypted with this class.org.bouncycastle.crypto.params.KeyParameter
deriveKey
(CharSequence password) Generate AES key.encrypt
(byte[] plainBytes, org.bouncycastle.crypto.params.KeyParameter aesKey) Password based encryption using AES - CBC 256 bits.boolean
Return the EncryptionType enum value which denotes the type of encryption/ decryption that this KeyCrypter can understand.int
hashCode()
static byte[]
Returns SALT_LENGTH (8) bytes of random datatoString()
-
Field Details
-
KEY_LENGTH
public static final int KEY_LENGTHKey length in bytes.- See Also:
-
BLOCK_LENGTH
public static final int BLOCK_LENGTHThe 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_LENGTHThe 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
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 org.bouncycastle.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 interfaceKeyCrypter
- Parameters:
password
- The password to use in key generation- Returns:
- The KeyParameter containing the created AES key
- Throws:
KeyCrypterException
-
encrypt
public EncryptedData encrypt(byte[] plainBytes, org.bouncycastle.crypto.params.KeyParameter aesKey) throws KeyCrypterException Password based encryption using AES - CBC 256 bits.- Specified by:
encrypt
in interfaceKeyCrypter
- Returns:
- encryptedPrivateKey An encryptedPrivateKey containing the encrypted bytes and an initialisation vector.
- Throws:
KeyCrypterException
- if encryption was unsuccessful
-
decrypt
public byte[] decrypt(EncryptedData dataToDecrypt, org.bouncycastle.crypto.params.KeyParameter aesKey) throws KeyCrypterException Decrypt bytes previously encrypted with this class.- Specified by:
decrypt
in interfaceKeyCrypter
- Parameters:
dataToDecrypt
- The data to decryptaesKey
- The AES key to use for decryption- Returns:
- The decrypted bytes
- Throws:
KeyCrypterException
- if bytes could not be decrypted
-
getScryptParameters
-
getUnderstoodEncryptionType
Return the EncryptionType enum value which denotes the type of encryption/ decryption that this KeyCrypter can understand.- Specified by:
getUnderstoodEncryptionType
in interfaceKeyCrypter
-
toString
-
hashCode
public int hashCode() -
equals
-