mirror of
https://github.com/monero-project/monero-docs.git
synced 2025-01-09 12:29:37 +00:00
WiP ed25519
This commit is contained in:
parent
92a264662d
commit
0f07b2e9a3
7 changed files with 137 additions and 50 deletions
72
docs/cryptography/asymmetric/ed25519.md
Normal file
72
docs/cryptography/asymmetric/ed25519.md
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
# Ed25519 curve
|
||||||
|
|
||||||
|
!!! danger
|
||||||
|
Article author is nowhere close to being a cryptographer. Be sceptical on accuracy.
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
This article is only about the underlying curve. Public key derivation and signing algorithm will be treated separately.
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
Before we get to Monero, a little bit of context. We are talking asymmetric cryptography here.
|
||||||
|
The "asymmetric" simply means the are two keys:
|
||||||
|
|
||||||
|
* the private key (used primarily for signing data and for decrypting data)
|
||||||
|
* the public key (used primarily for signature verification and encrypting data)
|
||||||
|
|
||||||
|
This is in contrast to symmetric cryptography which uses a single (secret) key.
|
||||||
|
|
||||||
|
Historically, asymmetric cryptography was based on the problem of factorization of a very large integers
|
||||||
|
back into prime numbers (which is practically impossible for large enough integers).
|
||||||
|
|
||||||
|
Recently, asymmetric cryptography is based on a mathematical notion of elliptic curves.
|
||||||
|
Ed25519 is a specific, well researched and standardized elliptic curve.
|
||||||
|
|
||||||
|
Monero employs Ed25519 elliptic curve as a basis for its key pair generation.
|
||||||
|
|
||||||
|
However, Monero does not exactly follow EdDSA reference signature scheme.
|
||||||
|
|
||||||
|
## Definition
|
||||||
|
|
||||||
|
This is the standard Ed25519 curve definition, no Monero specific stuff here.
|
||||||
|
|
||||||
|
Curve equation:
|
||||||
|
|
||||||
|
−x^2 + y^2 = 1 − (121665/121666) * x^2 * y^2
|
||||||
|
|
||||||
|
Base point:
|
||||||
|
|
||||||
|
# The base point is the specific point on the curve. It is used
|
||||||
|
# as a basis for further calculations. It is an arbitrary choice
|
||||||
|
# by the curve authors, just to standarize the scheme.
|
||||||
|
#
|
||||||
|
# Note that it is enough to specify the y value and the sign of the x value.
|
||||||
|
# That's because the specific x can be calculated from the curve equation.
|
||||||
|
G = (x, 4/5) # take the point with the positive x
|
||||||
|
|
||||||
|
# The hex representation of the base point
|
||||||
|
5866666666666666666666666666666666666666666666666666666666666666
|
||||||
|
|
||||||
|
Prime order of the base point:
|
||||||
|
|
||||||
|
# In layment terms, the "canvas" where the curve is drawn is assumed
|
||||||
|
# to have a finite "resolution", so point coordinates must "wrap around"
|
||||||
|
# at some point. This is achieved by modulo the "l" value.
|
||||||
|
# In other words, the "l" defines the maximum scalar we can use.
|
||||||
|
l = 2^252 + 27742317777372353535851937790883648493
|
||||||
|
|
||||||
|
The total number of points on the curve, a prime number:
|
||||||
|
|
||||||
|
q = 2^255 - 19
|
||||||
|
|
||||||
|
## Implementation
|
||||||
|
|
||||||
|
Monero uses (apparently modified) Ref10 implementation by Daniel J. Bernstein.
|
||||||
|
|
||||||
|
## Reference
|
||||||
|
|
||||||
|
* [Understanding Monero Cryptography](https://steemit.com/monero/@luigi1111/understanding-monero-cryptography-privacy-introduction) - excellent writeup by Luigi
|
||||||
|
* [StackOverflow answer](https://monero.stackexchange.com/questions/2290/why-how-does-monero-generate-public-ed25519-keys-without-using-the-standard-publ)
|
||||||
|
* [Python implementation](https://github.com/monero-project/mininero/blob/master/ed25519.py) - not the reference one but easier to understand
|
||||||
|
* [Encoding point to hex](https://monero.stackexchange.com/questions/6050/what-is-the-base-point-g-from-the-whitepaper-and-how-is-it-represented-as-a)
|
||||||
|
* [Ed25519 on Wikipedia](https://en.wikipedia.org/wiki/EdDSA#Ed25519)
|
||||||
|
* [A (Relatively Easy To Understand) Primer on Elliptic Curve Cryptography](https://blog.cloudflare.com/a-relatively-easy-to-understand-primer-on-elliptic-curve-cryptography/)
|
30
docs/cryptography/asymmetric/intro.md
Normal file
30
docs/cryptography/asymmetric/intro.md
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
# Asymmetric cryptography used in Monero
|
||||||
|
|
||||||
|
!!! danger
|
||||||
|
Article author is nowhere close to being a cryptographer. Be sceptical on accuracy.
|
||||||
|
|
||||||
|
Before we get to Monero, a little bit of context. We are talking asymmetric cryptography here.
|
||||||
|
The "asymmetric" simply means the are two keys:
|
||||||
|
|
||||||
|
* the private key (used primarily for signing data and for decrypting data)
|
||||||
|
* the public key (used primarily for signature verification and encrypting data)
|
||||||
|
|
||||||
|
This is in contrast to symmetric cryptography which uses a single (secret) key.
|
||||||
|
|
||||||
|
Historically, asymmetric cryptography was based on the problem of factorization of a very large integers
|
||||||
|
back into prime numbers (which is practically impossible for large enough integers).
|
||||||
|
|
||||||
|
Recently, asymmetric cryptography is based on a mathematical notion of elliptic curves.
|
||||||
|
Ed25519 is a specific, well researched and standardized elliptic curve used in Monero.
|
||||||
|
|
||||||
|
## Private key
|
||||||
|
|
||||||
|
Private key is a **large integer**, like:
|
||||||
|
`115792089237316195423570985008687907853269984665640564039457584007913129639930`
|
||||||
|
|
||||||
|
Private key is a **scalar**, meaning it is a single value.
|
||||||
|
|
||||||
|
In equations scalars are represented by **lowercase letters**.
|
||||||
|
|
||||||
|
In user-facing contexts, private keys are encoded in little-endian hexadecimal form, like:
|
||||||
|
`35187c5096d10db8a57be93885f28694ac9dcaa09d6b1fb1903aec07e168430a`
|
|
@ -1,27 +0,0 @@
|
||||||
# Ed25519 curve
|
|
||||||
|
|
||||||
**!! Work in progress - be sceptical on accuracy !!**
|
|
||||||
|
|
||||||
Monero employs Ed25519 curve as a basis for its signature scheme.
|
|
||||||
|
|
||||||
However, Monero does not follow EdDSA reference signature scheme.
|
|
||||||
|
|
||||||
## Public key derivation
|
|
||||||
|
|
||||||
In relation to EdDSA, Monero derives public keys differently:
|
|
||||||
|
|
||||||
* Monero uses Keccak instead of SHA-512
|
|
||||||
* Monero uses private keys as scalars, not as seeds
|
|
||||||
|
|
||||||
## Signature scheme
|
|
||||||
|
|
||||||
In relation to EdDSA, Monero uses a different signature scheme.
|
|
||||||
|
|
||||||
## Implementation
|
|
||||||
|
|
||||||
For the curve itself, Monero uses Ref10 implementation by Daniel J. Bernstein.
|
|
||||||
|
|
||||||
## Reference
|
|
||||||
|
|
||||||
* [Understanding Monero Cryptography](https://medium.com/@luigi1111w/understanding-monero-cryptography-privacy-introduction-9baf073e970c) - excellent writeup by Luigi
|
|
||||||
* [StackOverflow answer](https://monero.stackexchange.com/questions/2290/why-how-does-monero-generate-public-ed25519-keys-without-using-the-standard-publ)
|
|
|
@ -1,6 +1,7 @@
|
||||||
# Multisignature
|
# Multisignature
|
||||||
|
|
||||||
**!! This is unreleased feature !!**
|
!!! warning
|
||||||
|
This is unreleased feature.
|
||||||
|
|
||||||
In cryptocurrencies, multisig feature allows to sign transaction with more than one private key. Funds protected with multisig can only be spent by signing with M-of-N keys.
|
In cryptocurrencies, multisig feature allows to sign transaction with more than one private key. Funds protected with multisig can only be spent by signing with M-of-N keys.
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
# Subaddress
|
# Subaddress
|
||||||
|
|
||||||
**!! This is unreleased feature !!**
|
!!! warning
|
||||||
|
This is unreleased feature.
|
||||||
|
|
||||||
Subaddresses serve two purposes described below.
|
Subaddresses serve two purposes described below.
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
* Monero blockchain is live since 18 April 2014
|
* Monero blockchain is live since 18 April 2014
|
||||||
|
|
||||||
## No premine, no instamine, no ICO/token
|
## No premine, no instamine, no ICO, no token
|
||||||
|
|
||||||
* Monero had no premine or instamine
|
* Monero had no premine or instamine
|
||||||
* Monero did not sell any token
|
* Monero did not sell any token
|
||||||
|
@ -27,46 +27,46 @@
|
||||||
|
|
||||||
## Block reward
|
## Block reward
|
||||||
|
|
||||||
* ~6 XMR as of Dec 2017, see the [latest block](https://moneroblocks.info/) coinbase transaction amount for current reward
|
|
||||||
* smoothly decreasing and subject to penalties for blocks greater then median size of the last 100 blocks (M100)
|
* smoothly decreasing and subject to penalties for blocks greater then median size of the last 100 blocks (M100)
|
||||||
|
* ~6 XMR as of Dec 2017; for the current reward check the coinbase transaction of the [latest block](https://moneroblocks.info/)
|
||||||
|
|
||||||
## Block size
|
## Block size
|
||||||
|
|
||||||
* dynamic, maximum of two times median size of the last 100 blocks (2 * M100)
|
* dynamic
|
||||||
|
* maximum of two times the median size of the last 100 blocks (2 * M100)
|
||||||
|
* ~150KB as of Dec 2017; check [the latest block size](https://bitinfocharts.com/comparison/monero-size.html#3m)
|
||||||
|
|
||||||
## Emission curve
|
## Emission curve
|
||||||
|
|
||||||
**Main emission**
|
### Main emission
|
||||||
|
|
||||||
First, the main emission is about to produce ~18.132 million coins by the end of May 2022.
|
* first, the main emission is about to produce ~18.132 million coins by the end of May 2022
|
||||||
|
* as of Dec 2017 the emission is about 30 XMR per 10 minutes
|
||||||
|
* see [charts and details](https://www.reddit.com/r/Monero/comments/512kwh/useful_for_learning_about_monero_coin_emission/)
|
||||||
|
|
||||||
As of Dec 2017 the emission is about 30 XMR per 10 minutes.
|
### Tail emission
|
||||||
|
|
||||||
See [charts and details](https://www.reddit.com/r/Monero/comments/512kwh/useful_for_learning_about_monero_coin_emission/).
|
* the tail emission kicks in once main emission is done
|
||||||
|
* it will produce 0.6 XMR per 2-minute block
|
||||||
**Tail emission**
|
* this translates to <1% inflation decreasing over time
|
||||||
|
|
||||||
The tail emission kicks in once main emission is done.
|
|
||||||
|
|
||||||
It will produce 0.6 XMR per 2-minute block.
|
|
||||||
|
|
||||||
This translates to <1% inflation decreasing over time.
|
|
||||||
|
|
||||||
## Max supply
|
## Max supply
|
||||||
|
|
||||||
* infinite
|
* ~18.132 million XMR + 0.6 XMR per 2 minutes
|
||||||
|
* technically infinite
|
||||||
|
* practically might be deflationary if accounted for lost coins
|
||||||
|
|
||||||
## Sender privacy
|
## Sender privacy
|
||||||
|
|
||||||
* Ring signatures
|
* ring signatures
|
||||||
|
|
||||||
## Recipient privacy
|
## Recipient privacy
|
||||||
|
|
||||||
* Stealth addresses
|
* stealth addresses
|
||||||
|
|
||||||
## Amount privacy
|
## Amount privacy
|
||||||
|
|
||||||
* Ring confidential transactions
|
* ring confidential transactions
|
||||||
|
|
||||||
## IP address privacy
|
## IP address privacy
|
||||||
|
|
||||||
|
|
14
mkdocs.yml
14
mkdocs.yml
|
@ -7,12 +7,14 @@ site_url: 'https://monerodocs.org/'
|
||||||
pages:
|
pages:
|
||||||
- Home: 'index.md'
|
- Home: 'index.md'
|
||||||
- Interacting: 'interacting/overview.md'
|
- Interacting: 'interacting/overview.md'
|
||||||
- Technical Specs: 'technical-specs.md'
|
- Technical specs: 'technical-specs.md'
|
||||||
- Cryptography:
|
- Cryptography:
|
||||||
- Overview: 'cryptography/overview.md'
|
- Overview: 'cryptography/overview.md'
|
||||||
- PRNG: 'cryptography/prng.md'
|
- PRNG: 'cryptography/prng.md'
|
||||||
- 'Keccak-256': 'cryptography/keccak-256.md'
|
- 'Keccak-256': 'cryptography/keccak-256.md'
|
||||||
- Ed25519: 'cryptography/ed25519.md'
|
- Asymmetric:
|
||||||
|
# - Overview: 'cryptography/asymmetric/intro.md'
|
||||||
|
- 'Ed25519 curve': 'cryptography/asymmetric/ed25519.md'
|
||||||
# - CryptoNight PoW: 'cryptography/cryptonight.md'
|
# - CryptoNight PoW: 'cryptography/cryptonight.md'
|
||||||
- Base58: 'cryptography/base58.md'
|
- Base58: 'cryptography/base58.md'
|
||||||
- Address:
|
- Address:
|
||||||
|
@ -36,3 +38,11 @@ extra_css: ['extra.css']
|
||||||
|
|
||||||
repo_name: 'monerodocs/md'
|
repo_name: 'monerodocs/md'
|
||||||
repo_url: 'https://github.com/monerodocs/md'
|
repo_url: 'https://github.com/monerodocs/md'
|
||||||
|
|
||||||
|
markdown_extensions:
|
||||||
|
# https://squidfunk.github.io/mkdocs-material/extensions/admonition/
|
||||||
|
- admonition
|
||||||
|
- codehilite:
|
||||||
|
guess_lang: false
|
||||||
|
- toc:
|
||||||
|
permalink: true
|
||||||
|
|
Loading…
Reference in a new issue