<p>The secp256k1 curve has cofactor one, so every point on the curve can be written as a multiple of the generator. As a result, there are exactly as many points on the curve (excluding the point at infinity) as there are valid (nonzero) private keys.</p>
<p>In short: yes, every point on the curve is a valid public key.</p>

CC BY-SA 4.0
2022-05-10T09:40:28.280Z
The point K = (9166C289B9F905E55F9E3DF9F69D7F356B4A22095F894F4715714AA4B56606AF, F181EB966BE4ACB5CFF9E16B66D809BE94E214F06C93FD091099AF98499255E7) is part of the secp256k1 curve, but it's derived from an invalid private key (FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF), such that according to the definition in my question, the point is not a valid Bitcoin public key. Question that remains: is there a non-brute-force way to determine such validity of a public key?
drogos86
CC BY-SA 4.0
2022-05-10T12:48:36.087Z
@drogos86 That point also has corresponding (valid) private key 0x000000000000000000000000000000014551231950b75fc4402da1732fc9bebe. The restriction for private keys to be in range 1 to 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141 is simply to make sure there is exactly one private key for every public key, but beyond that, private keys act "modulo" the size of the curve.
Pieter Wuille
CC BY-SA 4.0
2022-05-06T13:03:37.720Z
2022-05-06T13:03:37.720Z
Pieter Wuille
<p>Let's first define a <code>valid Bitcoin private key</code> as a number in the range of [1, 115792089237316195423570985008687907852837564279074904382605163141518161494336], and a <code>valid Bitcoin public key</code> as a public key derived from a valid Bitcoin private key.</p>
<p>Then my question is: Is there a way to determine whether a specific point on the secp256k1 curve is a valid Bitcoin public key?</p>

<secp256k1>
Is there a way to determine whether a specific point on the secp256k1 curve is a valid Bitcoin public key?
drogos86
# Is there a way to determine whether a specific point on the secp256k1 curve is a valid Bitcoin public key?

(Asked by: username_0 on 2022-05-06)

Let's first define a `valid Bitcoin private key` as a number in the range of [1, 115792089237316195423570985008687907852837564279074904382605163141518161494336], and a `valid Bitcoin public key` as a public key derived from a valid Bitcoin private key.

Then my question is: Is there a way to determine whether a specific point on the secp256k1 curve is a valid Bitcoin public key?

**Tags:** secp256k1


---

## 1 answers

### Answer by username_1 on 2022-05-06. Score: 3

The secp256k1 curve has cofactor one, so every point on the curve can be written as a multiple of the generator. As a result, there are exactly as many points on the curve (excluding the point at infinity) as there are valid (nonzero) private keys.

In short: yes, every point on the curve is a valid public key.

> **Comments:**
> **username_0**: The point K = (9166C289B9F905E55F9E3DF9F69D7F356B4A22095F894F4715714AA4B56606AF, F181EB966BE4ACB5CFF9E16B66D809BE94E214F06C93FD091099AF98499255E7) is part of the secp256k1 curve, but it's derived from an invalid private key (FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF), such that according to the definition in my question, the point is not a valid Bitcoin public key. Question that remains: is there a non-brute-force way to determine such validity of a public key?  
> **username_1**: @username_0 That point also has corresponding (valid) private key 0x000000000000000000000000000000014551231950b75fc4402da1732fc9bebe. The restriction for private keys to be in range 1 to 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141 is simply to make sure there is exactly one private key for every public key, but beyond that, private keys act "modulo" the size of the curve.  

---

