public class ECKey extends Object implements Serializable
Represents an elliptic curve public and (optionally) private key, usable for digital signatures but not encryption. Creating a new ECKey with the empty constructor will generate a new random keypair. Other constructors can be used when you already have the public or private parts. If you create a key with only the public part, you can check signatures but not create them.
ECKey also provides access to Bitcoin-Qt compatible text message signing, as accessible via the UI or JSON-RPC. This is slightly different to signing raw bytes - if you want to sign your own data and it won't be exposed as text to people, you don't want to use this. If in doubt, ask on the mailing list.
The ECDSA algorithm supports key recovery in which a signature plus a couple of discriminator bits can be reversed to find the public key used to calculate it. This can be convenient when you have a message and a signature and want to find out who signed it, rather than requiring the user to provide the expected identity.
Modifier and Type | Class and Description |
---|---|
static class |
ECKey.ECDSASignature
Groups the two components that make up a signature, and provides a way to encode to DER form, which is
how ECDSA signatures are represented when embedded in other data structures in the Bitcoin protocol.
|
Modifier and Type | Field and Description |
---|---|
static org.spongycastle.crypto.params.ECDomainParameters |
CURVE
The parameters of the secp256k1 curve that Bitcoin uses.
|
static boolean |
FAKE_SIGNATURES
If this global variable is set to true, sign() creates a dummy signature and verify() always returns true.
|
static BigInteger |
HALF_CURVE_ORDER
Equal to CURVE.getN().shiftRight(1), used for canonicalising the S value of a signature.
|
Constructor and Description |
---|
ECKey()
Generates an entirely new keypair.
|
ECKey(BigInteger privKey)
Creates an ECKey given the private key only.
|
ECKey(BigInteger privKey,
BigInteger pubKey)
A constructor variant with BigInteger pubkey.
|
ECKey(BigInteger privKey,
byte[] pubKey,
boolean compressed)
Creates an ECKey given either the private key only, the public key only, or both.
|
ECKey(byte[] privKeyBytes,
byte[] pubKey)
Creates an ECKey given only the private key bytes.
|
ECKey(EncryptedPrivateKey encryptedPrivateKey,
byte[] pubKey,
KeyCrypter keyCrypter)
Create a new ECKey with an encrypted private key, a public key and a KeyCrypter.
|
Modifier and Type | Method and Description |
---|---|
void |
clearPrivateKey()
Clears all the ECKey private key contents from memory.
|
ECKey |
decrypt(KeyCrypter keyCrypter,
org.spongycastle.crypto.params.KeyParameter aesKey)
Create a decrypted private key with the keyCrypter and AES key supplied.
|
ECKey |
encrypt(KeyCrypter keyCrypter,
org.spongycastle.crypto.params.KeyParameter aesKey)
Create an encrypted private key with the keyCrypter and the AES key supplied.
|
static boolean |
encryptionIsReversible(ECKey originalKey,
ECKey encryptedKey,
KeyCrypter keyCrypter,
org.spongycastle.crypto.params.KeyParameter aesKey)
Check that it is possible to decrypt the key with the keyCrypter and that the original key is returned.
|
boolean |
equals(Object o) |
static ECKey |
fromASN1(byte[] asn1privkey)
Construct an ECKey from an ASN.1 encoded private key.
|
long |
getCreationTimeSeconds()
Returns the creation time of this key or zero if the key was deserialized from a version that did not store
that data.
|
EncryptedPrivateKey |
getEncryptedPrivateKey() |
KeyCrypter |
getKeyCrypter() |
DumpedPrivateKey |
getPrivateKeyEncoded(NetworkParameters params)
Exports the private key in the form used by the Satoshi client "dumpprivkey" and "importprivkey" commands.
|
byte[] |
getPrivKeyBytes()
Returns a 32 byte array containing the private key, or null if the key is encrypted or public only
|
byte[] |
getPubKey()
Gets the raw public key value.
|
byte[] |
getPubKeyHash()
Gets the hash160 form of the public key (as seen in addresses).
|
int |
hashCode() |
boolean |
hasPrivKey() |
boolean |
isCompressed()
Returns whether this key is using the compressed form or not.
|
boolean |
isEncrypted()
Indicates whether the private key is encrypted (true) or not (false).
|
boolean |
isPubKeyCanonical()
Returns true if this pubkey is canonical, i.e.
|
static boolean |
isPubKeyCanonical(byte[] pubkey)
Returns true if the given pubkey is canonical, i.e.
|
boolean |
isPubKeyOnly() |
static byte[] |
publicKeyFromPrivate(BigInteger privKey,
boolean compressed)
Returns public key bytes from the given private key.
|
static ECKey |
recoverFromSignature(int recId,
ECKey.ECDSASignature sig,
Sha256Hash message,
boolean compressed)
Given the components of a signature and a selector value, recover and return the public key
that generated the signature according to the algorithm in SEC1v2 section 4.1.6.
|
void |
setCreationTimeSeconds(long newCreationTimeSeconds)
Sets the creation time of this key.
|
ECKey.ECDSASignature |
sign(Sha256Hash input)
Signs the given hash and returns the R and S components as BigIntegers.
|
ECKey.ECDSASignature |
sign(Sha256Hash input,
org.spongycastle.crypto.params.KeyParameter aesKey)
Signs the given hash and returns the R and S components as BigIntegers.
|
static ECKey |
signedMessageToKey(String message,
String signatureBase64)
Given an arbitrary piece of text and a Bitcoin-format message signature encoded in base64, returns an ECKey
containing the public key that was used to sign it.
|
String |
signMessage(String message)
Signs a text message using the standard Bitcoin messaging signing format and returns the signature as a base64
encoded string.
|
String |
signMessage(String message,
org.spongycastle.crypto.params.KeyParameter aesKey)
Signs a text message using the standard Bitcoin messaging signing format and returns the signature as a base64
encoded string.
|
Address |
toAddress(NetworkParameters params)
Returns the address that corresponds to the public part of this ECKey.
|
byte[] |
toASN1()
Output this ECKey as an ASN.1 encoded private key, as understood by OpenSSL or used by the BitCoin reference
implementation in its wallet storage format.
|
String |
toString() |
String |
toStringWithPrivate()
Produce a string rendering of the ECKey INCLUDING the private key.
|
boolean |
verify(byte[] data,
byte[] signature)
Verifies the given ASN.1 encoded ECDSA signature against a hash using the public key.
|
static boolean |
verify(byte[] data,
byte[] signature,
byte[] pub)
Verifies the given ASN.1 encoded ECDSA signature against a hash using the public key.
|
static boolean |
verify(byte[] data,
ECKey.ECDSASignature signature,
byte[] pub)
Verifies the given ECDSA signature against the message bytes using the public key bytes.
|
boolean |
verify(Sha256Hash sigHash,
ECKey.ECDSASignature signature)
Verifies the given R/S pair (signature) against a hash using the public key.
|
void |
verifyMessage(String message,
String signatureBase64)
Convenience wrapper around
signedMessageToKey(String, String) . |
public static final org.spongycastle.crypto.params.ECDomainParameters CURVE
public static final BigInteger HALF_CURVE_ORDER
public static boolean FAKE_SIGNATURES
public ECKey()
public ECKey(BigInteger privKey)
public ECKey(BigInteger privKey, BigInteger pubKey)
ECKey(BigInteger, byte[])
.public ECKey(@Nullable byte[] privKeyBytes, @Nullable byte[] pubKey)
public ECKey(@Nullable EncryptedPrivateKey encryptedPrivateKey, @Nullable byte[] pubKey, KeyCrypter keyCrypter)
encryptedPrivateKey
- The private key, encrypted,pubKey
- The keys public keykeyCrypter
- The KeyCrypter that will be used, with an AES key, to encrypt and decrypt the private keypublic ECKey(@Nullable BigInteger privKey, @Nullable byte[] pubKey, boolean compressed)
compressed
- If set to true and pubKey is null, the derived public key will be in compressed form.public static ECKey fromASN1(byte[] asn1privkey)
public boolean isPubKeyOnly()
public boolean hasPrivKey()
public byte[] toASN1()
public static byte[] publicKeyFromPrivate(BigInteger privKey, boolean compressed)
public byte[] getPubKeyHash()
public byte[] getPubKey()
public boolean isCompressed()
public String toStringWithPrivate()
public Address toAddress(NetworkParameters params)
public void clearPrivateKey()
public ECKey.ECDSASignature sign(Sha256Hash input) throws KeyCrypterException
toASN1()
instead. However sometimes the independent components can be useful, for instance, if you're doing to do
further EC maths on them.KeyCrypterException
- if this ECKey doesn't have a private part.public ECKey.ECDSASignature sign(Sha256Hash input, @Nullable org.spongycastle.crypto.params.KeyParameter aesKey) throws KeyCrypterException
ECKey.ECDSASignature.encodeToDER()
instead. However sometimes the independent components can be useful, for instance, if you're doing to do further
EC maths on them.aesKey
- The AES key to use for decryption of the private key. If null then no decryption is required.KeyCrypterException
- if this ECKey doesn't have a private part.public static boolean verify(byte[] data, ECKey.ECDSASignature signature, byte[] pub)
Verifies the given ECDSA signature against the message bytes using the public key bytes.
When using native ECDSA verification, data must be 32 bytes, and no element may be larger than 520 bytes.
data
- Hash of the data to verify.signature
- ASN.1 encoded signature.pub
- The public key bytes to use.public static boolean verify(byte[] data, byte[] signature, byte[] pub)
data
- Hash of the data to verify.signature
- ASN.1 encoded signature.pub
- The public key bytes to use.public boolean verify(byte[] data, byte[] signature)
data
- Hash of the data to verify.signature
- ASN.1 encoded signature.public boolean verify(Sha256Hash sigHash, ECKey.ECDSASignature signature)
public boolean isPubKeyCanonical()
public static boolean isPubKeyCanonical(byte[] pubkey)
public String signMessage(String message) throws KeyCrypterException
IllegalStateException
- if this ECKey does not have the private part.KeyCrypterException
- if this ECKey is encrypted and no AESKey is provided or it does not decrypt the ECKey.public String signMessage(String message, @Nullable org.spongycastle.crypto.params.KeyParameter aesKey) throws KeyCrypterException
IllegalStateException
- if this ECKey does not have the private part.KeyCrypterException
- if this ECKey is encrypted and no AESKey is provided or it does not decrypt the ECKey.public static ECKey signedMessageToKey(String message, String signatureBase64) throws SignatureException
message
- Some piece of human readable text.signatureBase64
- The Bitcoin-format message signature in base64SignatureException
- If the public key could not be recovered or if there was a signature format error.public void verifyMessage(String message, String signatureBase64) throws SignatureException
signedMessageToKey(String, String)
. If the key derived from the
signature is not the same as this one, throws a SignatureException.SignatureException
@Nullable public static ECKey recoverFromSignature(int recId, ECKey.ECDSASignature sig, Sha256Hash message, boolean compressed)
Given the components of a signature and a selector value, recover and return the public key that generated the signature according to the algorithm in SEC1v2 section 4.1.6.
The recId is an index from 0 to 3 which indicates which of the 4 possible keys is the correct one. Because the key recovery operation yields multiple potential keys, the correct key must either be stored alongside the signature, or you must be willing to try each recId in turn until you find one that outputs the key you are expecting.
If this method returns null it means recovery was not possible and recId should be iterated.
Given the above two points, a correct usage of this method is inside a for loop from 0 to 3, and if the output is null OR a key that is not the one you expect, you try again with the next recId.
recId
- Which possible key to recover.sig
- the R and S components of the signature, wrapped.message
- Hash of the data that was signed.compressed
- Whether or not the original pubkey was compressed.@Nullable public byte[] getPrivKeyBytes()
public DumpedPrivateKey getPrivateKeyEncoded(NetworkParameters params)
VersionedChecksummedBytes.toString()
method to get the string.params
- The network this key is intended for use on.DumpedPrivateKey
.IllegalStateException
- if the private key is not available.public long getCreationTimeSeconds()
public void setCreationTimeSeconds(long newCreationTimeSeconds)
public ECKey encrypt(KeyCrypter keyCrypter, org.spongycastle.crypto.params.KeyParameter aesKey) throws KeyCrypterException
keyCrypter
- The keyCrypter that specifies exactly how the encrypted bytes are created.aesKey
- The KeyParameter with the AES encryption key (usually constructed with keyCrypter#deriveKey and cached as it is slow to create).KeyCrypterException
public ECKey decrypt(KeyCrypter keyCrypter, org.spongycastle.crypto.params.KeyParameter aesKey) throws KeyCrypterException
keyCrypter
- The keyCrypter that specifies exactly how the decrypted bytes are created.aesKey
- The KeyParameter with the AES encryption key (usually constructed with keyCrypter#deriveKey and cached).KeyCrypterException
public static boolean encryptionIsReversible(ECKey originalKey, ECKey encryptedKey, KeyCrypter keyCrypter, org.spongycastle.crypto.params.KeyParameter aesKey)
Wallet.encrypt(KeyCrypter keyCrypter, KeyParameter aesKey)
for example usage.public boolean isEncrypted()
@Nullable public EncryptedPrivateKey getEncryptedPrivateKey()
public KeyCrypter getKeyCrypter()
Copyright © 2014. All rights reserved.