Verschlüsselung mit öffentlichem Schlüssel, ** Roman **, ist es nicht (persönlicher Eindruck) </ sub>? Es scheint, dass Sie etwas Spaß machen können, wie es in persönlich entwickelte Software zu integrieren, abgesehen von seiner Praktikabilität.
Soweit ich grob gegoogelt habe, ~~ möchte ich ein Skriptkind wie mich kopieren und einfügen ~~ Ich konnte nicht feststellen, dass die Implementierung, die auf der einfachen Seite extrem schwankte, an einem Ort gesammelt wurde, also zum Üben habe es gerade geschafft.
Ich dachte, dass ungefähr 5% als praktisch angesehen werden könnten, also werde ich es einfach in Python und C # schreiben und verschlüsselte Daten zwischen den beiden austauschen. Wenn dies beispielsweise möglich ist, können auf der Clientseite (C #) verschlüsselte Daten auf der Serverseite (Python) entschlüsselt werden, sodass sie, wenn auch nur in geringem Umfang, für die Praxis verwendet werden können.
** Ich sage nicht, dass es einen besseren Weg gibt, es in die Praxis umzusetzen. ** ** **
Mit Anaconda ist es einfach, weil es fast alles und ein Verschlüsselungsmodul enthält.
Wenn Sie nur mit Python beginnen möchten, installieren Sie pycrypto. [^ 1]
[^ 1]: Es gibt mehrere Module mit derselben Funktion (und die Funktionsnamen unterscheiden sich geringfügig), was bei der Suche Verwirrung stiftet. Hier verwenden wir die, die standardmäßig mit Anaconda geliefert wird.
cmd.exe
pip install -U pycrypto
Für einige Funktionen ist .NET Core 3.0 oder höher (.NET Framework 5.0 RC1) erforderlich, um .NET Standard 2.1 anzuwenden.
CreateKey.py
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
key_length = 1024
def createKey():
key = RSA.generate(key_length)
private_key = key.exportKey().decode('utf-8')
with open(file="private.pem", mode="w", encoding='utf-8') as file_out:
file_out.write(private_key)
public_key = key.publickey().exportKey().decode('utf-8')
with open(file="public.pem", mode="w", encoding='utf-8') as file_out:
file_out.write(public_key)
Dadurch wird der Schlüssel generiert. Die Variable key_length gibt 1024 oder mehr an, laut Handbuch für ein anderes ähnliches Modul sollte sie jedoch 2048 oder mehr betragen. Empfohlen, 1024,2048,3072 sollte einer von ihnen sein. [^ 2] Diesmal muss es nicht lange dauern, also 1024.
Der generierte Schlüssel wird getrennt als privater und öffentlicher Schlüssel gespeichert. [^ 3]
[^ 2]: pycrypto manual ist 404. Wo ist das Original?
[^ 3]: Eigentlich scheint es, dass die private Schlüsseldatei auch die öffentlichen Schlüsseldaten enthält (?)
Lesen Sie die in Python erstellte öffentliche Schlüsseldatei und versuchen Sie, den kurzen Satz zu verschlüsseln.
Das Beispiel wird von der Konsolenanwendung (.NET Core 3.1) erstellt.
main.cs
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
class Encrypt_sample
{
static void Main(string[] args)
{
const string message = @"This is test message!";
const string key_begin = "-----BEGIN PUBLIC KEY-----\r\n";
const string key_end = "\r\n-----END PUBLIC KEY-----";
string public_key = File.ReadAllText(@"public.pem");
public_key = public_key.Replace(key_begin, "").Replace(key_end, "");
var publicKeyBytes = Convert.FromBase64String(public_key);
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.ImportSubjectPublicKeyInfo(publicKeyBytes, out _);
byte[] encrypted = rsa.Encrypt(Encoding.UTF8.GetBytes(message), false);
File.WriteAllText(@"encrypted.txt", Convert.ToBase64String(encrypted));
}
}
}
Die variable Nachricht ist die zu verschlüsselnde Zeichenfolge.
Nach dem Lesen der auf der Python-Seite erstellten öffentlichen Schlüsseldatei public.pem wird sie nach dem Entfernen von Kopf- und Fußzeile in Bytes konvertiert und mit ImportSubjectPublicKeyInfo () in die RSACryptoServiceProvider-Typvariable rsa eingelesen. [^ 4]
[^ 4]: Es gibt eine Funktion namens ImportRSAPublicKey (), aber dies ist die richtige Antwort.
Verschlüsseln Sie anschließend die in eine Byte-Zeichenfolge konvertierte Nachricht mit Encrypt () und speichern Sie den konvertierten base64-Text. Die Konvertierung erfolgt so, dass sie als Textdatei gelesen werden kann.
Wenn das zweite Argument von Encrypt () auf false gesetzt ist, wird das Auffüllen von PKCS # 1 v1.5 verwendet.
In der angenommenen Situation erfolgt die Verschlüsselung auf der C # -Seite. Erstellen Sie jedoch eine Funktion, mit der Sie bestätigen können, dass die Verschlüsselung / Entschlüsselung auch in Python möglich ist.
Encrypt.py
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
message = R"This is test message!"
def encrypt():
with open(file="public.pem", mode='rb') as file_read:
public_pem = file_read.read()
public_key = RSA.importKey(public_pem)
public_cipher = PKCS1_v1_5.new(key=public_key)
encrypted = public_cipher.encrypt(message=message.encode())
with open(file="encrypted.txt", mode='w', encoding='utf-8') as w:
w.write(base64.b64encode(encrypted).decode('utf-8'))
Als eigentliche Arbeit,
ist.
Der letzte ist die Entschlüsselung.
Decrypt.py
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
def decrypt():
with open(file="private.pem", mode='rb') as file_read:
private_pem = file_read.read()
private_key = RSA.importKey(private_pem)
private_cipher = PKCS1_v1_5.new(key=private_key)
with open(file="encrypted.txt", mode='r', encoding='utf-8') as r:
encrypt_data = base64.b64decode(s=r.read())
decrypt_data = private_cipher.decrypt(ct=encrypt_data, sentinel="")
print(decrypt_data.decode('utf-8'))
Wenn die vom letzten print () angezeigte Zeichenfolge mit der Nachricht übereinstimmt, als sie in C # erstellt wurde, ist die Entschlüsselung erfolgreich.
Es ist ein offener Eindruck, dass ich mit einem kürzeren Code als erwartet auskommen kann. ** Ich bin überrascht, dass es relativ einfach ist, sprachübergreifend zu verschlüsseln / entschlüsseln, indem detaillierte Einstellungen wie Fehlerbehandlung, tatsächliche Sicherheit und praktische Verschlüsselungsstärke übersprungen werden.
Bitte beachten Sie, dass der ** Code wirklich angemessen ist und nicht in die Praxis umgesetzt werden sollte. ** ** **
Q&A
--Q: Warum gibt es auf der C # -Seite keine Schlüsselerstellung und -entschlüsselung?
→ Entschlüsselung beiseite (Ist der private Schlüssel auf der angenommenen Clientseite hinterlegt?) Und die Schlüsselerstellung war ein Durchgang, da die Ausgabe in ein Format, das gemeinsam genutzt werden kann, etwas mühsam war. Ich werde hinzufügen, wenn es ein gutes Mittel gibt.