• تحذير: يجب على كل روّاد الشبكة تشغيل برامج الاختراق داخل الأنظمة الوهمية وهي بهدف التعلم وحماية الأعضاء والتوعية بها

[ شرح ] أداة لاستخراج القيم من الـ private key وعمل Encrypt و Decrypt لرسالة مع الكود الأصلي

3b0-0d

{ || مشرف قسم CTF || }
.:: طاقم المشرفين ::.

الفكرة اجت لما كتبت تحدي بإحدى المسابقات ألا وهي private key أعطيتهم نص مشفر
طبعًا الكود بمساعده shadow ببدايته ساعدني 🫡

الكود بعمل الخطوات التاليه :
1. أول شيء بطلع القيم من ملف الـ private key عن طريق أداة openssl

2. بعدها بطول القيم p , q , n , d , e وبحولهن من هكس لأرقام وبطبعهن على الشاشة.
3. بعدها بسأل المستخدم هل حاب تعمل تشفير أو فك تشفير عن طريق هاي القيم؟


1.عشان يعمل أول خطوة بطبق الأمر :
كود:
openssl rsa -in id_rsa -text -noout

بتكون القيم هيك:

1723597424159.webp

2.بحول القيم من هكس لأرقام عن طريق كود مشابه لهاد، بقيم ال : وبقيم المسافة:
Python:
import re
hex = """

    f8:e3:64:70:25:89:b2:9d:8e:8b:e9:bc:a5:14:be
 
"""
print(int(re.sub(r'[:\s]', '', hex), 16))

3.طريقة التشفير بال RSA بتصير بالطريقة هاي:
Python:
from Crypto.Util.number import *
p = 1031
q = 1049
phi = (p - 1) * (q - 1)
n = p * q
e = 65537
m = bytes_to_long("A".encode())
c = pow(m, e, n)

print(c)

طريقة فك تشفير بال RSA بتصير بالطريقة التالية:
Python:
from Crypto.Util.number import *
p = 1031
q = 1049
phi = (p - 1) * (q - 1)
n = p * q
e = 65537
d = inverse(e, phi)
m = pow(c, d, n)
print(long_to_bytes(m).decode())

هاي هي طريقة الاستخدام:
كود:
PS C:\Users\allft\Downloads\output> .\prv.exe -p .\id_rsa

ممكن يعطيكم خطأ لازم تنزلوا أداة openssl عشان تقدروا تشغلوا الكود، من هون بتقدرو تنزلوها :

لعمل تشفير:


1723596362649.webp


لعمل فك تشفير:

1723596397670.webp


فـهاد هو البرانامج ( مرفق مع المنشور بملف مضغوط )

وهاد هو الكود الأصلي :

Python:
import argparse
import subprocess
import platform
from ast import literal_eval
from colorama import Fore, init
import re
from Crypto.Util.number import *
from colorama import *

init(autoreset=True)

parser = argparse.ArgumentParser(description="A tool to process private RSA keys using OpenSSL.")
parser.add_argument("-p", dest="id_rsa", required=True, help="The name of the private key file.")
args = parser.parse_args()

def check_openssl():
    try:
        subprocess.run(["openssl", "version"], capture_output=True, check=True)
    except FileNotFoundError:
        print(f"{Fore.RED}OpenSSL is not installed. Please install OpenSSL to use this tool.")
        exit(1)

check_openssl()

if not args.id_rsa:
    print(f"\nusage: File.py -p ID_RSA\n\noptions:\n  -h, --help  show this help message and exit\n  -p ID_RSA   The name of the private key file.\n")
    exit(1)

print(rf"""
{Fore.BLUE}  /\\_/\\
  ( o.o )
   > ^ <
{Fore.RED}3b0-0d
{Fore.RED}0776874247

{Fore.RED}To use this tool, run:
{Fore.RED}.\prv.exe -p <private_key_file>
""")

def run_openssl():
    try:
        if platform.system() == "Windows":
            result = subprocess.run(["openssl", "rsa", "-in", args.id_rsa, "-text", "-noout"], capture_output=True, text=True, check=True)
        else:
            result = subprocess.run(f"openssl rsa -in {args.id_rsa} -text -noout", shell=True, capture_output=True, text=True, check=True)
        return result.stdout
    except subprocess.CalledProcessError as e:
        print(f"{Fore.RED}An error occurred while running OpenSSL: {e}")
        exit(1)

# Define function to extract values
def ex(a, x):
    start = a.find(x) + len(x)
    end = a.find(o[o.index(x) + 1])
    value = a[start:end].strip().replace(':', '').replace('\n', '').replace(' ', '')
    return literal_eval(f"0x{value}")

a = run_openssl()

o = ["modulus:", "privateExponent:", "prime1:", "prime2:", "-----BEGIN PRIVATE KEY-----"]
e = ["n", "d", "p", "q"]

t = a[a.find("publicExponent:"):a.find("privateExponent:")].strip()
e_value = int(re.search(r"\d+", t).group())
print("e =", e_value)

a = a.replace(t, "")
r = a[a.find("exponent1:"):a.find("-----BEGIN PRIVATE KEY-----")].strip()
a = a.replace(r, "")

values = {}
for i in o[:-1]:
    values[e[o.index(i)]] = ex(a, i)
for key, value in values.items():
    print(f"{key} = {value}")
choice = input(f"{Fore.MAGENTA}Do you want to encrypt a message (m) or decrypt a ciphertext (c)? ")

if choice.lower() == 'm':
    message = input("Enter the message to encrypt: ")
    m_value = bytes_to_long(message.encode())
    c_value = pow(m_value, e_value, values['n'])
    print(f"Ciphertext: {c_value}")

elif choice.lower() == 'c':
    ciphertext = int(input("Enter the ciphertext to decrypt: "))
    phi = (values['p'] - 1) * (values['q'] - 1)
    d_value = inverse(e_value, phi)
    m_value = pow(ciphertext, d_value, values['n'])
    decrypted_message = long_to_bytes(m_value).decode()
    print(Fore.GREEN + f"Decrypted message: {decrypted_message}")
else:
    print("Invalid choice. Please enter 'm' for message encryption or 'c' for ciphertext decryption.")

أرجو أي نقل أو تعديل على الكود ذكر المصدر الأساسي ( رابط المنشور )

وشكراً
 

المرفقات

  • prv.rar
    prv.rar
    7.8 MB · المشاهدات: 2,296
التعديل الأخير بواسطة المشرف:
الفكره اجت لما كتبت تحدي باحدى المسابقات الا وهي private key واعطيتهم نص مشفر
طبعا الكود بمساعده shadow ببدايته ساعدني 🫡

الكود بعمل الخطوات التاليه :
1. اول اشي بطلع القيم من ملف الـ private key عن طريق اداه openssl
2. بعدها بطول القيم p , q , n , d , e وبحولهن من هكس ل ارقام وبطبعهن على الشاشة
3. بعدها بسال المستخدم هل حاب تعمل تشفير او فك تشفير عن طريق هاي القيم



1.
عشان يعمل اول خطوه بطبق الامر
كود:
openssl rsa -in id_rsa -text -noout

بتكون القيم هيك


2.
بحول القيم من هكس ل ارقام عن طريق كود مشابه لهاد اللي بقيم ال : وبقيم المسافه
Python:
import re
hex = """

    f8:e3:64:70:25:89:b2:9d:8e:8b:e9:bc:a5:14:be
 
"""
print(int(re.sub(r'[:\s]', '', hex), 16))

3.
طريقه التشفير بال RSA بتصير بالطريقه هاي
Python:
from Crypto.Util.number import *
p = 1031
q = 1049
phi = (p - 1) * (q - 1)
n = p * q
e = 65537
m = bytes_to_long("A".encode())
c = pow(m, e, n)

print(c)


طريقه فك تشفير بال RSA بتصير بالطريقه هاي
Python:
from Crypto.Util.number import *
p = 1031
q = 1049
phi = (p - 1) * (q - 1)
n = p * q
e = 65537
d = inverse(e, phi)
m = pow(c, d, n)
print(long_to_bytes(m).decode())



هاي هي طريقه الاستخدام
كود:
PS C:\Users\allft\Downloads\output> .\prv.exe -p .\id_rsa
ممكن يعطيكم خطأ لازم تنزلو اداه openssl عشان تقدر تشغلو الكود من هون بتقدرو تنزلوها

لعمل تشفير




لعمل فك تشفير



فـ هاد هو البرانامج ( مرفق مع المنشور بملف مظغوط )

وهاد هو الكود الاصلي

ارجو اي نقل او تعديل على الكود ذكر المصدر الاساسي ( رابط المنشور ) وشكرا

Python:
import argparse
import subprocess
import platform
from ast import literal_eval
from colorama import Fore, init
import re
from Crypto.Util.number import *
from colorama import *

init(autoreset=True)

parser = argparse.ArgumentParser(description="A tool to process private RSA keys using OpenSSL.")
parser.add_argument("-p", dest="id_rsa", required=True, help="The name of the private key file.")
args = parser.parse_args()

def check_openssl():
    try:
        subprocess.run(["openssl", "version"], capture_output=True, check=True)
    except FileNotFoundError:
        print(f"{Fore.RED}OpenSSL is not installed. Please install OpenSSL to use this tool.")
        exit(1)

check_openssl()

if not args.id_rsa:
    print(f"\nusage: File.py -p ID_RSA\n\noptions:\n  -h, --help  show this help message and exit\n  -p ID_RSA   The name of the private key file.\n")
    exit(1)

print(rf"""
{Fore.BLUE}  /\\_/\\
  ( o.o )
   > ^ <
{Fore.RED}3b0-0d
{Fore.RED}0776874247

{Fore.RED}To use this tool, run:
{Fore.RED}.\prv.exe -p <private_key_file>
""")

def run_openssl():
    try:
        if platform.system() == "Windows":
            result = subprocess.run(["openssl", "rsa", "-in", args.id_rsa, "-text", "-noout"], capture_output=True, text=True, check=True)
        else:
            result = subprocess.run(f"openssl rsa -in {args.id_rsa} -text -noout", shell=True, capture_output=True, text=True, check=True)
        return result.stdout
    except subprocess.CalledProcessError as e:
        print(f"{Fore.RED}An error occurred while running OpenSSL: {e}")
        exit(1)

# Define function to extract values
def ex(a, x):
    start = a.find(x) + len(x)
    end = a.find(o[o.index(x) + 1])
    value = a[start:end].strip().replace(':', '').replace('\n', '').replace(' ', '')
    return literal_eval(f"0x{value}")

a = run_openssl()

o = ["modulus:", "privateExponent:", "prime1:", "prime2:", "-----BEGIN PRIVATE KEY-----"]
e = ["n", "d", "p", "q"]

t = a[a.find("publicExponent:"):a.find("privateExponent:")].strip()
e_value = int(re.search(r"\d+", t).group())
print("e =", e_value)

a = a.replace(t, "")
r = a[a.find("exponent1:"):a.find("-----BEGIN PRIVATE KEY-----")].strip()
a = a.replace(r, "")

values = {}
for i in o[:-1]:
    values[e[o.index(i)]] = ex(a, i)
for key, value in values.items():
    print(f"{key} = {value}")
choice = input(f"{Fore.MAGENTA}Do you want to encrypt a message (m) or decrypt a ciphertext (c)? ")

if choice.lower() == 'm':
    message = input("Enter the message to encrypt: ")
    m_value = bytes_to_long(message.encode())
    c_value = pow(m_value, e_value, values['n'])
    print(f"Ciphertext: {c_value}")

elif choice.lower() == 'c':
    ciphertext = int(input("Enter the ciphertext to decrypt: "))
    phi = (values['p'] - 1) * (values['q'] - 1)
    d_value = inverse(e_value, phi)
    m_value = pow(ciphertext, d_value, values['n'])
    decrypted_message = long_to_bytes(m_value).decode()
    print(Fore.GREEN + f"Decrypted message: {decrypted_message}")
else:
    print("Invalid choice. Please enter 'm' for message encryption or 'c' for ciphertext decryption.")
First blood 🔥
 
ما شاء الله تبارك الله بارك الله فيك
شغل جميل ومتعوب عليه تسلم ايدك
ننتظر جديدك دائماً
 
الفكرة اجت لما كتبت تحدي بإحدى المسابقات ألا وهي private key أعطيتهم نص مشفر
طبعًا الكود بمساعده shadow ببدايته ساعدني 🫡

الكود بعمل الخطوات التاليه :
1. أول شيء بطلع القيم من ملف الـ private key عن طريق أداة openssl

2. بعدها بطول القيم p , q , n , d , e وبحولهن من هكس لأرقام وبطبعهن على الشاشة.
3. بعدها بسأل المستخدم هل حاب تعمل تشفير أو فك تشفير عن طريق هاي القيم؟


1.عشان يعمل أول خطوة بطبق الأمر :
كود:
openssl rsa -in id_rsa -text -noout

بتكون القيم هيك:


2.بحول القيم من هكس لأرقام عن طريق كود مشابه لهاد، بقيم ال : وبقيم المسافة:
Python:
import re
hex = """

    f8:e3:64:70:25:89:b2:9d:8e:8b:e9:bc:a5:14:be
 
"""
print(int(re.sub(r'[:\s]', '', hex), 16))

3.طريقة التشفير بال RSA بتصير بالطريقة هاي:
Python:
from Crypto.Util.number import *
p = 1031
q = 1049
phi = (p - 1) * (q - 1)
n = p * q
e = 65537
m = bytes_to_long("A".encode())
c = pow(m, e, n)

print(c)

طريقة فك تشفير بال RSA بتصير بالطريقة التالية:
Python:
from Crypto.Util.number import *
p = 1031
q = 1049
phi = (p - 1) * (q - 1)
n = p * q
e = 65537
d = inverse(e, phi)
m = pow(c, d, n)
print(long_to_bytes(m).decode())

هاي هي طريقة الاستخدام:
كود:
PS C:\Users\allft\Downloads\output> .\prv.exe -p .\id_rsa

ممكن يعطيكم خطأ لازم تنزلوا أداة openssl عشان تقدروا تشغلوا الكود، من هون بتقدرو تنزلوها :

لعمل تشفير:




لعمل فك تشفير:



فـهاد هو البرانامج ( مرفق مع المنشور بملف مضغوط )

وهاد هو الكود الأصلي :

Python:
import argparse
import subprocess
import platform
from ast import literal_eval
from colorama import Fore, init
import re
from Crypto.Util.number import *
from colorama import *

init(autoreset=True)

parser = argparse.ArgumentParser(description="A tool to process private RSA keys using OpenSSL.")
parser.add_argument("-p", dest="id_rsa", required=True, help="The name of the private key file.")
args = parser.parse_args()

def check_openssl():
    try:
        subprocess.run(["openssl", "version"], capture_output=True, check=True)
    except FileNotFoundError:
        print(f"{Fore.RED}OpenSSL is not installed. Please install OpenSSL to use this tool.")
        exit(1)

check_openssl()

if not args.id_rsa:
    print(f"\nusage: File.py -p ID_RSA\n\noptions:\n  -h, --help  show this help message and exit\n  -p ID_RSA   The name of the private key file.\n")
    exit(1)

print(rf"""
{Fore.BLUE}  /\\_/\\
  ( o.o )
   > ^ <
{Fore.RED}3b0-0d
{Fore.RED}0776874247

{Fore.RED}To use this tool, run:
{Fore.RED}.\prv.exe -p <private_key_file>
""")

def run_openssl():
    try:
        if platform.system() == "Windows":
            result = subprocess.run(["openssl", "rsa", "-in", args.id_rsa, "-text", "-noout"], capture_output=True, text=True, check=True)
        else:
            result = subprocess.run(f"openssl rsa -in {args.id_rsa} -text -noout", shell=True, capture_output=True, text=True, check=True)
        return result.stdout
    except subprocess.CalledProcessError as e:
        print(f"{Fore.RED}An error occurred while running OpenSSL: {e}")
        exit(1)

# Define function to extract values
def ex(a, x):
    start = a.find(x) + len(x)
    end = a.find(o[o.index(x) + 1])
    value = a[start:end].strip().replace(':', '').replace('\n', '').replace(' ', '')
    return literal_eval(f"0x{value}")

a = run_openssl()

o = ["modulus:", "privateExponent:", "prime1:", "prime2:", "-----BEGIN PRIVATE KEY-----"]
e = ["n", "d", "p", "q"]

t = a[a.find("publicExponent:"):a.find("privateExponent:")].strip()
e_value = int(re.search(r"\d+", t).group())
print("e =", e_value)

a = a.replace(t, "")
r = a[a.find("exponent1:"):a.find("-----BEGIN PRIVATE KEY-----")].strip()
a = a.replace(r, "")

values = {}
for i in o[:-1]:
    values[e[o.index(i)]] = ex(a, i)
for key, value in values.items():
    print(f"{key} = {value}")
choice = input(f"{Fore.MAGENTA}Do you want to encrypt a message (m) or decrypt a ciphertext (c)? ")

if choice.lower() == 'm':
    message = input("Enter the message to encrypt: ")
    m_value = bytes_to_long(message.encode())
    c_value = pow(m_value, e_value, values['n'])
    print(f"Ciphertext: {c_value}")

elif choice.lower() == 'c':
    ciphertext = int(input("Enter the ciphertext to decrypt: "))
    phi = (values['p'] - 1) * (values['q'] - 1)
    d_value = inverse(e_value, phi)
    m_value = pow(ciphertext, d_value, values['n'])
    decrypted_message = long_to_bytes(m_value).decode()
    print(Fore.GREEN + f"Decrypted message: {decrypted_message}")
else:
    print("Invalid choice. Please enter 'm' for message encryption or 'c' for ciphertext decryption.")

أرجو أي نقل أو تعديل على الكود ذكر المصدر الأساسي ( رابط المنشور )

وشكراً
بارك الله فيك
والله كمية معلومات كبيرة, مشكور كتير على جهدك 🌹 ❤️
 
مُبدع 🔥
 
لماذا طلبت n و d و البرنامج يقدر يحسبهم من p و q
 
  • Love
التفاعلات: ibada
يعطيك العافية
 
عودة
أعلى