Kommunikation verschlüsselter Daten zwischen Python und C #

Kommunikation verschlüsselter Daten zwischen Python und C

Einführung

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. ** ** **

Angenommene Situation

  1. Erstellen Sie einen RSA-Schlüssel auf der Serverseite (Python)
  2. Auf der Clientseite (C #) wurde ein öffentlicher Schlüssel erstellt, der die Textdatei verschlüsselt.
  3. Entschlüsseln Sie die verschlüsselte Datei, die mit dem privaten Schlüssel an die Serverseite gesendet (entschieden) wurde

Umgebung

Python-Seite

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

C # Seite

Für einige Funktionen ist .NET Core 3.0 oder höher (.NET Framework 5.0 RC1) erforderlich, um .NET Standard 2.1 anzuwenden.

Implementierung

Erstellen eines öffentlichen / privaten Schlüssels

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 (?)

Verschlüsselung (C #)

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.

Verschlüsselung (Python)

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,

  1. Importieren Sie die öffentliche Schlüsseldatei (public_key).
  2. Konvertieren Sie von public_key in das PKCS1_v1_5-Format (?) (?) (Public_cipher)
  3. Verschlüsseln Sie die Nachricht mit public_cipher

ist.

Entschlüsselung (Python)

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'))
  1. Importieren Sie die private Schlüsseldatei (private_key).
  2. Konvertieren Sie von private_key in das PKCS1_v1_5-Format (?) (?) (Private_cipher)
  3. Entschlüsseln Sie den Inhalt der verschlüsselten Datei mit private_cipher

Wenn die vom letzten print () angezeigte Zeichenfolge mit der Nachricht übereinstimmt, als sie in C # erstellt wurde, ist die Entschlüsselung erfolgreich.

Impressionen

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. ** ** **

Dinge, die Sie hinzufügen sollten

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.

Recommended Posts

Kommunikation verschlüsselter Daten zwischen Python und C #
[Python] Konvertierungsnotiz zwischen Zeitdaten und numerischen Daten
Einfacher Datenaustausch zwischen Python, R und Julia im Feather-Format
Untersuchen Sie den Java- und Python-Datenaustausch mit Apache Arrow
Grenze zwischen C und Golang
Unterschied zwischen Ruby und Python Split
Unterschied zwischen list () und [] in Python
Unterschied zwischen == und ist in Python
Zusammenarbeit zwischen Python-Modul und API
Unterschied zwischen Python, Stftime und Strptime
Unterschied zwischen der Python2-Serie und der Python3-Serie dict.keys ()
Hashing von Daten in R und Python
[Python] Unterschied zwischen Funktion und Methode
Python - Unterschied zwischen exec und eval
[Python] Unterschied zwischen randrange () und randint ()
[Python] Unterschied zwischen sortiert und sortiert (Colaboratory)
Kommunizieren Sie mit gRPC zwischen Elixir und Python
Unterschied in der Authentizität zwischen Python und JavaScript
Unterschiede zwischen Ruby und Python im Umfang
Unterschied zwischen Anweisungen (Anweisungen) und Ausdrücken (Ausdrücken) in Python
Implementieren Sie den FIR-Filter in Python und C.
Unterschiede zwischen Python- und Java-Syntax
Unterschiede in der Beziehung zwischen PHP und Python schließlich und beenden
Unterschied zwischen @classmethod und @staticmethod in Python
Python-Datenstruktur und interne Implementierung ~ Liste ~
Unterschied zwischen Anhängen und + = in der Python-Liste
Unterschied zwischen nicht lokal und global in Python
Schreiben Sie die O_SYNC-Datei in C und Python
[Python] Unterschied zwischen Klassenmethode und statischer Methode
Struktur und Betrieb der Python-Daten (Python-Lernnotiz ③)
Zeichnen Sie Daten einfach in Shell und Python
[Python3] Wechseln Sie zwischen Shift_JIS, UTF-8 und ASCII
Socket-Kommunikation in C-Sprache und Python
[Python] Unterschied zwischen Rand- und Randn-Ausgabe
Komprimieren Sie Python-Daten und schreiben Sie in SQLite
Unterschiede in der Multithread-Verarbeitung zwischen Python und Jython
Unterschied zwischen Ruby und Python (grundlegende Syntax)
RaspberryPi L Chika mit Python und C #
Korrespondenz zwischen den in Python integrierten Funktionen und Rust
Python C / C ++ - Erweiterungsmuster-Übergeben Sie Daten als np.array an Python
Beziehung zwischen Firestore- und Go-Datentypkonvertierung
So generieren Sie eine Sequenz in Python und C ++
Datenanalyse Python
Empfangen und Anzeigen von HTML-Formulardaten in Python
Die Antwort von "1/2" unterscheidet sich zwischen Python2 und 3
[Python] Vertauschen von Zeilen und Spalten mit Numpy-Daten
Unterschied zwischen Variablen und Selbst. Variablen in der [Python] -Klasse
[Python] Lesen von Daten aus CIFAR-10 und CIFAR-100
Über den Unterschied zwischen "==" und "is" in Python
Python-Handspiel (Interoperation zwischen CSV und PostgreSQL)
Python C ++ Notizen
Versuchen Sie, MLB-Daten auf Mac und Python zu importieren
cv2-Funktionen und Datentypen (OpenCV-Python-Bindung)
Unterschiede im Verhalten zwischen den Operatoren append () und "+ =" beim Hinzufügen von Daten zu einer Liste in Python
Verarbeitung von CSV-Daten in voller und halber Breite in Python
Liste der Python-Bibliotheken für Datenwissenschaftler und Dateningenieure
C-Sprache, Java, Python-Benchmarks mit Primfaktorisierung
Experiment zum Vergleich der Schreibgeschwindigkeit von Dateien zwischen Python 2.7.9 und Pypy 2.5.0
Empfängt und gibt die Standardausgabe von Python 2- und Python 3> C-Implementierungen aus
[Ruby vs Python] Benchmark-Vergleich zwischen Rails und Flask