Package org.bitcoinj.crypto
Class KeyCrypterScrypt
- java.lang.Object
-
- org.bitcoinj.crypto.KeyCrypterScrypt
-
- All Implemented Interfaces:
java.io.Serializable,KeyCrypter
public class KeyCrypterScrypt extends java.lang.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.
- See Also:
- Serialized Form
-
-
Field Summary
Fields Modifier and Type Field Description static intBLOCK_LENGTHThe size of an AES block in bytes.static intKEY_LENGTHKey length in bytes.static intSALT_LENGTHThe length of the salt used.
-
Constructor Summary
Constructors Constructor Description KeyCrypterScrypt()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(Protos.ScryptParameters scryptParameters)Encryption/ Decryption using specified Scrypt parameters.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description byte[]decrypt(EncryptedData dataToDecrypt, org.bouncycastle.crypto.params.KeyParameter aesKey)Decrypt bytes previously encrypted with this class.org.bouncycastle.crypto.params.KeyParameterderiveKey(java.lang.CharSequence password)Generate AES key.EncryptedDataencrypt(byte[] plainBytes, org.bouncycastle.crypto.params.KeyParameter aesKey)Password based encryption using AES - CBC 256 bits.booleanequals(java.lang.Object o)Protos.ScryptParametersgetScryptParameters()Protos.Wallet.EncryptionTypegetUnderstoodEncryptionType()Return the EncryptionType enum value which denotes the type of encryption/ decryption that this KeyCrypter can understand.inthashCode()static byte[]randomSalt()Returns SALT_LENGTH (8) bytes of random datajava.lang.StringtoString()
-
-
-
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(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(Protos.ScryptParameters scryptParameters)
Encryption/ Decryption using specified Scrypt parameters.- Parameters:
scryptParameters- ScryptParameters to use- Throws:
java.lang.NullPointerException- if the scryptParameters or any of its N, R or P is null.
-
-
Method Detail
-
randomSalt
public static byte[] randomSalt()
Returns SALT_LENGTH (8) bytes of random data
-
deriveKey
public org.bouncycastle.crypto.params.KeyParameter deriveKey(java.lang.CharSequence password) throws KeyCrypterExceptionGenerate AES key. This is a very slow operation compared to encrypt/ decrypt so it is normally worth caching the result.- Specified by:
deriveKeyin 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:
encryptin 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:
decryptin 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
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:
getUnderstoodEncryptionTypein interfaceKeyCrypter
-
toString
public java.lang.String toString()
- Overrides:
toStringin classjava.lang.Object
-
hashCode
public int hashCode()
- Overrides:
hashCodein classjava.lang.Object
-
equals
public boolean equals(java.lang.Object o)
- Overrides:
equalsin classjava.lang.Object
-
-