commit 428d6922833d1e7178381afc041d0de78cbc9aad Author: Mateusz Piątkowski Date: Sat Apr 13 21:28:33 2024 +0200 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..417eed4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +__pycache__ +exchange.bin diff --git a/.utils.py.swp b/.utils.py.swp new file mode 100644 index 0000000..463b281 Binary files /dev/null and b/.utils.py.swp differ diff --git a/README.md b/README.md new file mode 100644 index 0000000..5e03ec2 --- /dev/null +++ b/README.md @@ -0,0 +1,46 @@ +# Rekomendowane parametry/komponenty + +## Punkt _a_ w dokumencie projektu + +Interesują nas grupy dla Internet Key Exchange (IKE), jeżeli nie chcemy używać krzywych eliptycznych to użyjmy MODP-3072 z (RFC3526)[https://www.ietf.org/rfc/rfc3526.txt], jeżeli chcemy krzywe eliptyczne to można brać NIST P-224 – parametry dostępne są (tutaj)[https://safecurves.cr.yp.to/field.html]. +``` +MOPD-3072 + +prime = FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 + 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD + EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 + E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED + EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D + C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F + 83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D + 670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B + E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9 + DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510 + 15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64 + ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7 + ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B + F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C + BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31 + 43DB5BFC E0FD108E 4B82D120 A93AD2CA FFFFFFFF FFFFFFFF + +generator = 2 +``` + +Dlaczego tak a nie inaczej – opiszę to #TODO + +## Punkt _b_ w dokumencie projektu + +KDF który proponuję to scrypt, ponieważ jest kosztowy obliczeniowo ORAZ pamięciowo. + +(Tutaj)[https://datatracker.ietf.org/doc/html/rfc7914#section-2] można znaleźć rekomendowane parametry, ze względu na ilość wykonywnych operacji proponuję parametry: +``` +N = 2 ** 14 +r = 8 +p = 1 +``` +poparte (tą prezentacją)[https://www.tarsnap.com/scrypt/scrypt-slides.pdf]. + +## Punkt _c_ w dokumencie projektu + +Tutaj proponuję AES256 w trybie CouTeR, opisane np. (tutaj)[https://www.pycryptodome.org/src/cipher/classic#ctr-mode]. +Do wygenerowania noncji może zostać użyty scrypt. diff --git a/alice.py b/alice.py new file mode 100644 index 0000000..62279e9 --- /dev/null +++ b/alice.py @@ -0,0 +1,10 @@ +from utils import generate_secret +from utils import prime, FILE +from Crypto.Math.Numbers import Integer, from_bytes + +g = Integer(2) +a = generate_secret() +A_secret = pow(g, Integer.from_bytes(a), prime) + +with open(FILE, 'wb') as f: + f.write(A_secret.to_bytes()) diff --git a/bob.py b/bob.py new file mode 100644 index 0000000..7a99482 --- /dev/null +++ b/bob.py @@ -0,0 +1,16 @@ +from utils import generate_secret, coin_toss +from utils import prime, FILE +from Crypto.Math.Numbers import Integer + +g = Integer(2) +b = generate_secret() + +B_secret = pow(g, Integer.from_bytes(b), prime) + +if coin_toss(): + with open(FILE, 'r') as f: + A_secret = f.read() + B_secret = A_secret * B_secret + print('siup') + +print(B_secret) diff --git a/main.py b/main.py new file mode 100644 index 0000000..e69de29 diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..3bbc598 --- /dev/null +++ b/utils.py @@ -0,0 +1,26 @@ +from Crypto.PublicKey import ECC +from Crypto.Protocol.KDF import PBKDF2 +from Crypto.Hash import SHA512 +from Crypto.Random import get_random_bytes +from secrets import randbelow + +FILE = 'exchange.bin' + +prime = 0xffffffffffffffffffffffffffffffff000000000000000000000001 + +def generate_secret(c = 0): + # 'DER' format for byte output + return ECC.generate(curve='NIST P-224').export_key(format='DER') + +def H(secret): + # secret should be bytearray[], pref. from generate_secret() function + salt = get_random_bytes(16) + key = PBKDF2(generate_secret(), salt, 64, count=1000000, hmac_hash_module=SHA512) + return key[32:] # first 32 bytes of generated key + +def coin_toss(): + x = randbelow(2 ** 64) + if x & 1: + return False + else: + return True