The data behind ECC keys are numbers that graph a curve using an equation:
$
y^2 = z^3 + Ax + B
$
And an agreed-upon "generator" X,Y point on the curve.
For example, `secp256k1` uses Generator point $A=0$ and $B=7$, giving us:
$
\begin{align}
y^2 & = z^3 + 0x + 7 \\
& = z^3 + 7
\end{align}
$
The Private Key is just a secret number ($k$ -- a very large number), which that generator point gets multiplied by, yielding a new point ($P$). That new point is the Public Key.
$
P = k \times G
$
Variables for this:
* $P$: Public Key point $(x, y)$
* $G$: Generator point $(x, y)$
* $k$: Private key number (scalar)
So basically:
$
PublicKeyXY = PrivateKey \times GeneratorXY
$
It's not a simple matter of multiplying $G.X \times k$ and $G.Y \times k$. Instead, a [Point Multiplication](https://en.wikipedia.org/wiki/Elliptic_curve_point_multiplication#Point_multiplication) algorithm like **Double-and-add** is needed.
This is really fast to compute, but the inverse:
$
k = \frac{P}{G}
$
is infeasibly slow, making it near-impossible to determine the Private Key for a given Public Key $(x, y)$ and a generator, particularly when using large numbers.
Here's an example of what these values really look like:
```
Private key (k) = 1896210029587523673235534059566342111348873350953180246605090801317300429416071118492133488973633185117643667899428
Public key X (P.x) = 11955080011875801947143167170210257597950619449551741375614902271810826641322600871986272531089904595463635788387886
Public key Y (P.y) = 7955743933195102999097862967723910443024419264467030513387549320823099633244329839669516991481576026437937402559720
```
You could conceivably just write down `k` on a post-it note and stick it behind the fridge and have a Private Key you could use for all sorts of things.
This all means:
* Fast computation
* Small, compact storage
* Low memory requirements
* Improbably-difficult brute-forcing