Я работаю над созданием сервера проверки лицензионного ключа, который разблокирует часть программного обеспечения. Платформа C++, которую я использую для клиента, имеет встроенную функциональность, которая позволяет серверу отправлять обратно ответ POST с зашифрованным сообщением RSA, содержащим данные, в которых говорится, что лицензионный ключ действителен для машины, отправляющей POST.
Способ, которым платформа обрабатывает шифрование ответов, заключается в размещении открытого ключа в клиентском программном обеспечении, а закрытого ключа на сервере, который выполняет обратную версию типичного шифрования RSA. Я понимаю, что это не обязательно безопасно, но для данного варианта использования это не имеет значения. Я также читал, что это можно назвать подписанием, а не шифрованием, но я не уверен.
Я пишу сервер на Python и поэтому хочу выполнить обратное шифрование RSA с использованием библиотек Python.< /p>
Я попробовал несколько разных вещей, в основном используя библиотеку pycryptodome, но не смог добиться успеха. Ниже я нашел функцию шифрования и дешифрования, но она выдает неправильную ошибку заполнения при попытке использовать b64decode. Я пытался выяснить, как исправить заполнение, но безуспешно.
Я предоставил образцы закрытого и открытого ключей, а также testMsg, который платформа выдает при шифровании с помощью закрытого ключа.< /p>
from http.server import BaseHTTPRequestHandler, HTTPServer
import time
import sqlite3
from random import choice
from string import ascii_uppercase, digits
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import base64
hostName = "localhost"
serverPort = 8080
serverVersion = "v0.2.3"
privateRSAKey = "279808e40cef4350640026c8739e7201826d002cec7e260f3d16d0cf786842f1,602815978d207ee7ce4982c23d5c39729da90af57b850863165936256e3b7227"
publick = "11,602815978d207ee7ce4982c23d5c39729da90af57b850863165936256e3b7227"
testMsg = "#62a29db7f09c76d2b28a2313911cbaad1a89b235ab52d05f704a9110c517b1db90d824d88188d08cb2b9002ba2f64e0bdf78a393a7cfc3f2bbad0e43f8167184975183357c2a73e1537fb0fe47e74586d553bc68e0e4e03d6b1ef67d03e57ea794f0029db1d6b2ef048db4e6b019d198e2876e925dc3036bbcca85369f67435884a9ff60a28a3e6131056805b58f804e74a8a224453b5099f831c57a16f87e"
def encrypt_private_key(a_message, private_key):
encryptor = PKCS1_OAEP.new(private_key)
encrypted_msg = encryptor.encrypt(a_message)
print(encrypted_msg)
encoded_encrypted_msg = base64.b64encode(encrypted_msg)
print(encoded_encrypted_msg)
return encoded_encrypted_msg
def decrypt_public_key(encoded_encrypted_msg, public_key):
encryptor = PKCS1_OAEP.new(public_key)
decoded_encrypted_msg = base64.b64decode(encoded_encrypted_msg)
print(decoded_encrypted_msg)
decoded_decrypted_msg = encryptor.decrypt(decoded_encrypted_msg)
print(decoded_decrypted_msg)
def verify_product(product):
if product == "Test":
return True
else:
return False
def verify_email(email):
if email == "[email protected]":
return True
else:
return False
def verify_license_key(licenseKey):
sql_connection = sqlite3.connect("SynergyLicenseKey.db");
cur = sql_connection.cursor()
data = cur.execute(f"SELECT * FROM LICENSEKEYS WHERE LicenseKey = '{licenseKey}'")
# if rows return it is a valid license key
for row in data:
sql_connection.close()
return True
sql_connection.close()
return False
def generate_license_key():
# Using random.choice to select characters from uppercase letters and digits
key = ''.join([choice(ascii_uppercase + digits) for _ in range(7)]) + '-' + \
''.join([choice(ascii_uppercase + digits) for _ in range(7)]) + '-' + \
''.join([choice(ascii_uppercase + digits) for _ in range(7)])
return key
class testServer(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
def do_POST(self):
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
request_data = post_data.decode('utf-8').split('&')
print(request_data)
if verify_product(request_data[0][8:]) and verify_email(request_data[1][6:]):
response = bytes(f'{test}', "utf-8")
else:
response = bytes('', "utf-8")
self.send_response(200)
self.send_header("Content-Length", str(len(response)))
self.end_headers()
self.wfile.write(response)
if __name__ == "__main__":
webServer = HTTPServer((hostName, serverPort), testServer)
print("Server - " + serverVersion + " - http://%s:%s" % (hostName, serverPort))
decrypt_public_key(testMsg, publick)
try:
webServer.serve_forever()
except KeyboardInterrupt:
pass
webServer.server_close()
print("Server stopped.")
Подробнее здесь: https://stackoverflow.com/questions/785 ... to-decrypt
Шифрование Python RSA – использование закрытого ключа для шифрования и открытого ключа для расшифровки ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Использование ключа RSA Azure Key Vault для шифрования и расшифровки строк
Anonymous » » в форуме C# - 0 Ответы
- 26 Просмотры
-
Последнее сообщение Anonymous
-