reconstruct a private key from a public key
This commit is contained in:
parent
b6788a4bb4
commit
513a004f9f
|
@ -1,24 +1,26 @@
|
||||||
# OpenSSL Cheatsheet
|
# OpenSSL Cheatsheet
|
||||||
|
|
||||||
|
|
||||||
## Read X.509 Certificate
|
## Read X.509 Certificate
|
||||||
|
|
||||||
* A certificate can be read via
|
A certificate can be read via
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
openssl x509 -in $CERT -text
|
openssl x509 -in $CERT -text
|
||||||
```
|
```
|
||||||
|
|
||||||
## Generate CSR
|
## Generate CSR
|
||||||
|
|
||||||
* A Certificate Signing Request needs a private alongside the request for a cert.
|
A Certificate Signing Request needs a private alongside the request for a cert.
|
||||||
This is done in the following way
|
This is done in the following way
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
openssl req -new -nodes -newkey rsa:4096 -keyout $PRIVATE_KEY -out $CERT_CSR
|
openssl req -new -nodes -newkey rsa:4096 -keyout $PRIVATE_KEY -out $CERT_CSR
|
||||||
```
|
```
|
||||||
|
|
||||||
## Create an X.509 Certificate
|
## Create an X.509 Certificate
|
||||||
|
|
||||||
* Create a X.509 certificate via
|
Create a X.509 certificate via
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
openssl x509 -newkey -nodes rsa:4096 -keyout $PRIVATE_KEY -out $CERT -sha256 -days 365
|
openssl x509 -newkey -nodes rsa:4096 -keyout $PRIVATE_KEY -out $CERT -sha256 -days 365
|
||||||
openssl req -new -x509 -keyout cert.pem -out cert.pem -days 365 -nodes
|
openssl req -new -x509 -keyout cert.pem -out cert.pem -days 365 -nodes
|
||||||
|
@ -26,7 +28,8 @@ openssl req -new -x509 -keyout cert.pem -out cert.pem -days 365 -nodes
|
||||||
|
|
||||||
## Extract Keys from PFX Cert
|
## Extract Keys from PFX Cert
|
||||||
|
|
||||||
* Key and cert form PFX
|
Key and cert form PFX
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
openssl pkcs12 -in cert.pfx -nocerts -out key.pem -nodes
|
openssl pkcs12 -in cert.pfx -nocerts -out key.pem -nodes
|
||||||
openssl pkcs12 -in cert.pfx -out cert.pem -clcerts -nokeys
|
openssl pkcs12 -in cert.pfx -out cert.pem -clcerts -nokeys
|
||||||
|
@ -34,7 +37,8 @@ openssl pkcs12 -in cert.pfx -out cert.pem -clcerts -nokeys
|
||||||
|
|
||||||
## Extract & Repack PFX Cert
|
## Extract & Repack PFX Cert
|
||||||
|
|
||||||
* Extract & Repack with another password, e.g. from `mimikatz` to `cqure`
|
Extract & Repack with another password, e.g. from `mimikatz` to `cqure`
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
openssl pkcs12 -in *.pfx -out temp.pem -nodes
|
openssl pkcs12 -in *.pfx -out temp.pem -nodes
|
||||||
openssl pkcs12 -export -out *.pfx -in temp.pem
|
openssl pkcs12 -export -out *.pfx -in temp.pem
|
||||||
|
@ -44,26 +48,32 @@ openssl pkcs12 -export -out *.pfx -in temp.pem
|
||||||
|
|
||||||
### Read Parameters of a RSA Key
|
### Read Parameters of a RSA Key
|
||||||
|
|
||||||
* Show parameters of the private key
|
Show parameters of the private key
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
openssl rsa -in $PRIVATE_KEY -text -noout
|
openssl rsa -in $PRIVATE_KEY -text -noout
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Create RSA Key
|
### Create RSA Key
|
||||||
|
|
||||||
* Generate an OpenSSL RSA key via
|
Generate an OpenSSL RSA key via
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
openssl genrsa -out $PRIVATE_KEY 4096
|
openssl genrsa -out $PRIVATE_KEY 4096
|
||||||
```
|
```
|
||||||
|
|
||||||
* Generate an OpenSSl RSA public key from a private key
|
Generate an OpenSSl RSA public key from a private key
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
openssl rsa -in $PRIVATE_KEY -pubout -out public-key.pem
|
openssl rsa -in $PRIVATE_KEY -pubout -out public-key.pem
|
||||||
```
|
```
|
||||||
|
|
||||||
### Encrypt RSA
|
### Encrypt RSA
|
||||||
|
|
||||||
* Encrypt RSA current and deprecated
|
Encrypt RSA current and deprecated
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
openssl pkeyutl -encrypt -in $CLEAR_TEXT -out $CLEAR_TEXT -pubin -inkey $PUBLIC_KEY
|
openssl pkeyutl -encrypt -in $CLEAR_TEXT -out $CLEAR_TEXT -pubin -inkey $PUBLIC_KEY
|
||||||
openssl rsautl -encrypt -in $CLEAR_TEXT -out $ENCRYPTED -pubin -inkey $PUBLIC_KEY
|
openssl rsautl -encrypt -in $CLEAR_TEXT -out $ENCRYPTED -pubin -inkey $PUBLIC_KEY
|
||||||
|
@ -71,12 +81,14 @@ openssl rsautl -encrypt -in $CLEAR_TEXT -out $ENCRYPTED -pubin -inkey $PUBLIC_KE
|
||||||
|
|
||||||
### Decrypt RSA
|
### Decrypt RSA
|
||||||
|
|
||||||
* Decrypt a RSA cipher with the private key
|
Decrypt a RSA cipher with the private key
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
openssl pkeyutl -decrypt -in $CIPHER -out $PLAIN_TEXT -inkey $PRIVATE_KEY
|
openssl pkeyutl -decrypt -in $CIPHER -out $PLAIN_TEXT -inkey $PRIVATE_KEY
|
||||||
```
|
```
|
||||||
|
|
||||||
* Deprecated version of RSA decryption is the following
|
Deprecated version of RSA decryption is the following
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
openssl rsautl -decrypt -in $CIPHER -out $PLAIN_TEXT -inkey $PRIVATE_KEY
|
openssl rsautl -decrypt -in $CIPHER -out $PLAIN_TEXT -inkey $PRIVATE_KEY
|
||||||
```
|
```
|
||||||
|
|
|
@ -7,12 +7,12 @@ $$
|
||||||
1 < \phi < n
|
1 < \phi < n
|
||||||
$$
|
$$
|
||||||
|
|
||||||
* There is also
|
There is also
|
||||||
$$
|
$$
|
||||||
\phi = (p-1) * (q-1)
|
\phi = (p-1) * (q-1)
|
||||||
$$$
|
$$$
|
||||||
|
|
||||||
* Encryption, public key `e` is a prime between 2 and phi
|
Encryption, public key `e` is a prime between 2 and phi
|
||||||
$$
|
$$
|
||||||
2 < e < \phi
|
2 < e < \phi
|
||||||
$$
|
$$
|
||||||
|
@ -21,10 +21,10 @@ $$
|
||||||
possible_e = []
|
possible_e = []
|
||||||
for i in range (2, phi):
|
for i in range (2, phi):
|
||||||
if gcd(n, i) == 1 and gcd(phi, i) == 1:
|
if gcd(n, i) == 1 and gcd(phi, i) == 1:
|
||||||
possible_e.append()
|
possible_e.append()
|
||||||
```
|
```
|
||||||
|
|
||||||
* Decryption, private key `d`
|
Decryption, private key `d`
|
||||||
$$
|
$$
|
||||||
d * e mod \phi = 1
|
d * e mod \phi = 1
|
||||||
$$
|
$$
|
||||||
|
@ -35,13 +35,16 @@ for i in range (phi + 1, phi + foo):
|
||||||
if i * e mod phi == 1 :
|
if i * e mod phi == 1 :
|
||||||
possible_d.append()
|
possible_d.append()
|
||||||
```
|
```
|
||||||
|
|
||||||
* \\( Cipher = msg ** d mod $\phi$ \\)
|
* \\( Cipher = msg ** d mod $\phi$ \\)
|
||||||
* \\( Cleartext = cipher ** e mod $\phi$ )
|
* \\( Cleartext = cipher ** e mod $\phi$ )
|
||||||
|
|
||||||
## Euklid
|
## Euklid
|
||||||
|
|
||||||
Just a short excourse:
|
Just a short excourse:
|
||||||
A greatest common divisior out of an example a = 32 and b = 14 would be the groups of the following divisors
|
A greatest common divisior out of an example a = 32 and b = 14 would be the
|
||||||
|
groups of the following divisors
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
a = 32, b = 24
|
a = 32, b = 24
|
||||||
a = {1, 2, 4, 8, 16}
|
a = {1, 2, 4, 8, 16}
|
||||||
|
@ -53,6 +56,7 @@ gcd(a,b) = 8
|
||||||
|
|
||||||
Two values are prime and have themselves and only `1` as a divisor are called coprime.
|
Two values are prime and have themselves and only `1` as a divisor are called coprime.
|
||||||
To check if a and b have a greatest common divisor do the euclidean algorithm.
|
To check if a and b have a greatest common divisor do the euclidean algorithm.
|
||||||
|
|
||||||
```python
|
```python
|
||||||
def gcd(a, b):
|
def gcd(a, b):
|
||||||
if b == 0:
|
if b == 0:
|
||||||
|
@ -62,18 +66,21 @@ def gcd(a, b):
|
||||||
|
|
||||||
### Extended GCD
|
### Extended GCD
|
||||||
|
|
||||||
#TODO
|
\#TODO
|
||||||
|
|
||||||
## Fermat's Little Theorem
|
## Fermat`s Little Theorem
|
||||||
|
|
||||||
If modulus $p$ is a prime and and modulus $n$ is not a prime, p defines a finite field (ring).
|
If modulus $p$ is a prime and and modulus $n$ is not a prime, p defines a
|
||||||
|
finite field (ring).
|
||||||
$$
|
$$
|
||||||
n \in F_{p} \{0,1,...,p-1\}
|
n \in F_{p} \{0,1,...,p-1\}
|
||||||
$$
|
$$
|
||||||
|
|
||||||
The field consists of elements $n$ which have an inverse $m$ resulting in $n + m = 0$ and $n * m = 1$.
|
The field consists of elements $n$ which have an inverse $m$ resulting in $n +
|
||||||
|
m = 0$ and $n * m = 1$.
|
||||||
|
|
||||||
So , $n^p - n$ is a multiple of p then $n^p \equiv n\ mod\ p$ and therefore $ n = n^p\ mod\ p$. An example
|
So , $n^p - n$ is a multiple of p then $n^p \equiv n\ mod\ p$ and therefore $ n
|
||||||
|
= n^p\ mod\ p$. An example
|
||||||
$$
|
$$
|
||||||
4 = 4^{31}\ mod\ 31
|
4 = 4^{31}\ mod\ 31
|
||||||
$$
|
$$
|
||||||
|
@ -97,7 +104,8 @@ $n^{p-2} \equiv n^{-1}\ mod\ p$
|
||||||
$m$ is a quadratic residue when $\pm n^2 = m\ mod\ p$ with two solutions.
|
$m$ is a quadratic residue when $\pm n^2 = m\ mod\ p$ with two solutions.
|
||||||
Otherwise it is a quadratic non residue.
|
Otherwise it is a quadratic non residue.
|
||||||
|
|
||||||
So a porperty of quad res are, if Quadratic Residue $QR = 1$ and Quadratic NonResidue $QN = -1$
|
So a porperty of quad res are, if Quadratic Residue $QR = 1$ and Quadratic
|
||||||
|
NonResidue $QN = -1$
|
||||||
|
|
||||||
$$
|
$$
|
||||||
QR * QR = QR\\
|
QR * QR = QR\\
|
||||||
|
@ -120,14 +128,16 @@ $$
|
||||||
\frac{a}{p} \equiv a^{p-1/2}\ (mod\ p)\ and\ \frac{a}{p} \in \{-1,0,1\}
|
\frac{a}{p} \equiv a^{p-1/2}\ (mod\ p)\ and\ \frac{a}{p} \in \{-1,0,1\}
|
||||||
$$
|
$$
|
||||||
|
|
||||||
* Legendre Symbol test via Python with
|
Legendre Symbol test via Python with
|
||||||
|
|
||||||
```python
|
```python
|
||||||
pow(a,(p-1)/2,p)
|
pow(a,(p-1)/2,p)
|
||||||
```
|
```
|
||||||
|
|
||||||
[Finding the square root of integer a which is quadratic residue](http://mathcenter.oxford.emory.edu/site/math125/findingSquareRoots/)
|
[Finding the square root of integer a which is quadratic residue](http://mathcenter.oxford.emory.edu/site/math125/findingSquareRoots/)
|
||||||
|
|
||||||
* Given $p \equiv 3\ mod\ 4$ the square root is calculated through
|
Given $p \equiv 3\ mod\ 4$ the square root is calculated through
|
||||||
|
|
||||||
```python
|
```python
|
||||||
pow(a,((p+1)//4),p)
|
pow(a,((p+1)//4),p)
|
||||||
```
|
```
|
||||||
|
@ -138,6 +148,116 @@ pow(a,((p+1)//4),p)
|
||||||
* Precondition: modulus is not a prime
|
* Precondition: modulus is not a prime
|
||||||
* TBD
|
* TBD
|
||||||
|
|
||||||
|
## RSA PublicKey Extraction
|
||||||
|
|
||||||
|
### Extract n and e from RSA public key
|
||||||
|
|
||||||
|
```python
|
||||||
|
from Crypto.PublicKey import RSA
|
||||||
|
|
||||||
|
with open("./id_rsa.pub", 'r') as _f:
|
||||||
|
pub_k = RSA.importKey(_f.read())
|
||||||
|
|
||||||
|
print(f"n:\n{pub_k.n}\n")
|
||||||
|
print(f"\ne:\n{pub_k.e}\n")
|
||||||
|
```
|
||||||
|
|
||||||
|
### Extract p and q from PublicKey
|
||||||
|
|
||||||
|
Modified from [d4rkvaibhav](https://github.com/murtaza-u/zet/tree/main/20220808171808/README.md)
|
||||||
|
|
||||||
|
```python
|
||||||
|
from Crypto.PublicKey import RSA
|
||||||
|
|
||||||
|
with open("./id_rsa.pub", 'r') as _f:
|
||||||
|
pub_k = RSA.importKey(_f.read())
|
||||||
|
|
||||||
|
def isqrt(n):
|
||||||
|
x=n
|
||||||
|
y=(x+n//x)//2
|
||||||
|
while(y<x):
|
||||||
|
x=y
|
||||||
|
y=(x+n//x)//2
|
||||||
|
return x
|
||||||
|
def fermat(n):
|
||||||
|
t0=isqrt(n)+1
|
||||||
|
counter=0
|
||||||
|
t=t0+counter
|
||||||
|
temp=isqrt((t*t)-n)
|
||||||
|
while((temp*temp)!=((t*t)-n)):
|
||||||
|
counter+=1
|
||||||
|
t=t0+counter
|
||||||
|
temp=isqrt((t*t)-n)
|
||||||
|
s=temp
|
||||||
|
p=t+s
|
||||||
|
q=t-s
|
||||||
|
return p,q
|
||||||
|
|
||||||
|
p,q = fermat(pub_k.n)
|
||||||
|
print(f"\np: {p}\n")
|
||||||
|
print(f"\nq: {q}\n")
|
||||||
|
print(f"\np-q: {p-q}\n")
|
||||||
|
```
|
||||||
|
|
||||||
|
### Generate PrivateKey
|
||||||
|
|
||||||
|
```python
|
||||||
|
from Crypto.PublicKey import RSA
|
||||||
|
|
||||||
|
with open("./id_rsa.pub", 'r') as _f:
|
||||||
|
pub_k = RSA.importKey(_f.read())
|
||||||
|
|
||||||
|
def isqrt(n):
|
||||||
|
x=n
|
||||||
|
y=(x+n//x)//2
|
||||||
|
while(y<x):
|
||||||
|
x=y
|
||||||
|
y=(x+n//x)//2
|
||||||
|
return x
|
||||||
|
def fermat(n):
|
||||||
|
t0=isqrt(n)+1
|
||||||
|
counter=0
|
||||||
|
t=t0+counter
|
||||||
|
temp=isqrt((t*t)-n)
|
||||||
|
while((temp*temp)!=((t*t)-n)):
|
||||||
|
counter+=1
|
||||||
|
t=t0+counter
|
||||||
|
temp=isqrt((t*t)-n)
|
||||||
|
s=temp
|
||||||
|
p=t+s
|
||||||
|
q=t-s
|
||||||
|
return p,q
|
||||||
|
|
||||||
|
def extended_euclid(a, b):
|
||||||
|
if a == 0:
|
||||||
|
return b, 0, 1
|
||||||
|
else:
|
||||||
|
g, y, x = extended_euclid(b % a, a)
|
||||||
|
return g, x - (b // a) * y, y
|
||||||
|
|
||||||
|
def modular_inverse(e, phi):
|
||||||
|
g, x, y = extended_euclid(e, phi)
|
||||||
|
|
||||||
|
if g != 1 :
|
||||||
|
raise Exception("No modular inverse")
|
||||||
|
else:
|
||||||
|
return x % phi
|
||||||
|
|
||||||
|
p,q = fermat(pub_k.n)
|
||||||
|
phi = (p-1) * (q-1)
|
||||||
|
d = modular_inverse(pub_k.e, phi)
|
||||||
|
|
||||||
|
|
||||||
|
print(f"\np: {p}\n")
|
||||||
|
print(f"\nq: {q}\n")
|
||||||
|
print(f"\np-q: {p-q}\n")
|
||||||
|
print(f"\nd: {d}\n")
|
||||||
|
|
||||||
|
priv_k = RSA.construct((pub_k.n, pub_k.e, d))
|
||||||
|
with open ("./priv_id_rsa", "wb") as _f:
|
||||||
|
_f.write(priv_k.export_key('PEM'))
|
||||||
|
```
|
||||||
|
|
||||||
## Links
|
## Links
|
||||||
|
|
||||||
* [Encryption+Decryption](https://www.cs.drexel.edu/~jpopyack/Courses/CSP/Fa17/notes/10.1_Cryptography/RSA_Express_EncryptDecrypt_v2.html)
|
* [Encryption+Decryption](https://www.cs.drexel.edu/~jpopyack/Courses/CSP/Fa17/notes/10.1_Cryptography/RSA_Express_EncryptDecrypt_v2.html)
|
||||||
|
|
Loading…
Reference in New Issue