- إنضم17 يونيو 2023
- المشاركات 411
- الحلول 8
- مستوى التفاعل 895
- النقاط 93
الفكرة اجت لما كتبت تحدي بإحدى المسابقات ألا وهي private key أعطيتهم نص مشفر
طبعًا الكود بمساعده shadow ببدايته ساعدني
الكود بعمل الخطوات التاليه :
1. أول شيء بطلع القيم من ملف الـ private key عن طريق أداة openssl
2. بعدها بطول القيم p , q , n , d , e وبحولهن من هكس لأرقام وبطبعهن على الشاشة.
3. بعدها بسأل المستخدم هل حاب تعمل تشفير أو فك تشفير عن طريق هاي القيم؟
1.عشان يعمل أول خطوة بطبق الأمر :
بتكون القيم هيك:
2.بحول القيم من هكس لأرقام عن طريق كود مشابه لهاد، بقيم ال : وبقيم المسافة:
3.طريقة التشفير بال RSA بتصير بالطريقة هاي:
طريقة فك تشفير بال RSA بتصير بالطريقة التالية:
هاي هي طريقة الاستخدام:
ممكن يعطيكم خطأ لازم تنزلوا أداة openssl عشان تقدروا تشغلوا الكود، من هون بتقدرو تنزلوها :
لعمل تشفير:
لعمل فك تشفير:
فـهاد هو البرانامج ( مرفق مع المنشور بملف مضغوط )
وهاد هو الكود الأصلي :
أرجو أي نقل أو تعديل على الكود ذكر المصدر الأساسي ( رابط المنشور )
وشكراً
طبعًا الكود بمساعده 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.")
أرجو أي نقل أو تعديل على الكود ذكر المصدر الأساسي ( رابط المنشور )
وشكراً
المرفقات
التعديل الأخير بواسطة المشرف: