Elektronische Signatur für die abteilungsübergreifende Interaktion

In der Kryptographie PKCS gehört zur Gruppe der Public Key Cryptography Standards, die von RSA Laboratories entwickelt und veröffentlicht wurde.

PKCS sind Spezifikationen, die von RSA Laboratories in Zusammenarbeit mit Sicherheitsanbietern auf der ganzen Welt entwickelt wurden, um die Entwicklung der Kryptografie mit öffentlichen Schlüsseln zu beschleunigen. PKCS-Dokumente wurden erstmals 1991 als Ergebnis von Treffen einer kleinen Gruppe von Erstanwendern der Public-Key-Technologie veröffentlicht und sind inzwischen weit verbreitet. Beiträge aus der PKCS-Reihe sind Bestandteil vieler formaler und de facto-Standards geworden, einschließlich der ANSI X9-, PKIX-, SET-, S/MIME- und SSL-Dokumente.

Die Weiterentwicklung des PKCS erfolgt durch Mailinglistendiskussionen und Workshops.

Abschnitte des PKCS-Standards
Ausführung Name Kommentare
PKCS#1 2.1 RSA-Kryptografiestandard Siehe RFC 3447. Grundprinzipien der Arbeit mit Schlüsseln.
PKCS#2 - Zurückgezogen In PKCS #1 enthalten.
PKCS#3 1.4 Diffie-Hellman-Schlüsselvereinbarungsstandard Ein Algorithmus, mit dem Sie einen geheimen Schlüssel generieren können, wenn Sie eine Verbindung über einen unsicheren Kommunikationskanal herstellen.
PKCS#4 - Zurückgezogen In PKCS #1 enthalten.
PKCS#5 2.0 Passwortbasierter Verschlüsselungsstandard Siehe RFC 2898 und PBKDF2.
PKCS#6 1.5 Syntaxstandard für erweiterte Zertifikate Definiert Erweiterungen der alten v1 X.509-Zertifikatsspezifikation. Veraltet durch v3 desselben.
PKCS#7 1.5 Syntaxstandard für kryptografische Nachrichten Siehe RFC 2315.
PKCS#8 1.2 Syntaxstandard für Private-Key-Informationen.
PKCS#9 2.0 Ausgewählte Attributtypen
PKCS#10 1.7 Zertifizierungsanforderungsstandard Siehe RFC 2986.
PKCS#11 2.20 Kryptografische Token-Schnittstelle (Cryptoki)
PKCS#12 1.0 Syntaxstandard für den Austausch persönlicher Informationen Dateiformat zum Speichern asymmetrischer Schlüssel.
PKCS#13 - Elliptische-Kurven-Kryptographie-Standard In Entwicklung.
PKCS#14 - Generierung von Pseudo-Zufallszahlen In Entwicklung.
PKCS#15 1.1 Standard für kryptografisches Token-Informationsformat Identifizierung von Benutzern in der Anwendung mit einer Smartcard ohne Verwendung der PKCS #11-API.

siehe auch

Schreiben Sie eine Rezension zum Artikel "PKCS"

Verknüpfungen

  • .

Ein Auszug, der PKCS charakterisiert

„Wie leicht er denkt“, dachte Pierre. Er weiß nicht, wie beängstigend es ist, wie gefährlich es ist. Zu früh oder zu spät … beängstigend!“
- Wie möchten Sie bestellen? Möchtest du morgen gehen? fragte Savelich.
- Nein; Ich werde ein wenig verschieben. Ich werde es dir dann sagen. Entschuldigen Sie die Mühe “, sagte Pierre und sah Savelichs Lächeln an und dachte: „Wie seltsam, dass er nicht weiß, dass es jetzt kein Petersburg gibt und dass dies zunächst entschieden werden muss. Allerdings weiß er es sicherlich, aber tut nur so. Rede mit ihm? Was denkt er? dachte Pierre. Nein, irgendwann später.
Beim Frühstück erzählte Pierre der Prinzessin, dass er gestern bei Prinzessin Mary gewesen sei und ihn dort angetroffen habe – kannst du dir vorstellen, wen? - Natalie Rostova.
Die Fürstin tat so, als sehe sie in dieser Neuigkeit nichts Ungewöhnlicheres als in der Tatsache, dass Pierre Anna Semjonowna gesehen habe.
- Kennst du sie? fragte Pierre.
„Ich habe die Prinzessin gesehen“, antwortete sie. - Ich habe gehört, dass sie mit dem jungen Rostov verheiratet war. Das wäre sehr gut für die Rostovs; Sie sagen, dass sie völlig pleite sind.
- Nein, kennst du Rostow?
„Ich habe erst damals von dieser Geschichte gehört. Sehr schade.
„Nein, sie versteht es nicht oder tut so, als ob“, dachte Pierre. "Sag es ihr besser auch nicht."
Die Prinzessin bereitete auch Proviant für Pierres Reise vor.
„Wie nett sie alle sind“, dachte Pierre, „dass sie das alles jetzt tun, wo es für sie sicher nicht interessanter sein könnte. Und alles für mich; das ist das Erstaunliche."
Am selben Tag kam ein Polizeichef zu Pierre mit dem Vorschlag, einen Treuhänder in die Facettenkammer zu schicken, um die Dinge entgegenzunehmen, die jetzt an die Eigentümer verteilt wurden.
„Auch dieser hier“, dachte Pierre und blickte dem Polizeichef ins Gesicht, „was für ein herrlicher, gutaussehender Beamter und wie freundlich! Jetzt beschäftigt er sich mit solchem ​​Unsinn. Und sie sagen, dass er nicht ehrlich ist und benutzt. Was für ein Unsinn! Und doch, warum sollte er es nicht benutzen? So wurde er erzogen. Und jeder tut es. Und so ein angenehmes, freundliches Gesicht und ein Lächeln, das mich ansieht.
Pierre ging mit Prinzessin Mary essen.
Als er zwischen den Häuserbränden durch die Straßen fuhr, staunte er über die Schönheit dieser Ruinen. Schornsteine ​​von Häusern, heruntergefallene Mauern, die malerisch an den Rhein und das Kolosseum erinnern, zogen sich gegenseitig verdeckend durch die abgebrannten Viertel. Die Kutscher und Reiter, die sich trafen, die Zimmerleute, die die Blockhütten zuschnitten, die Händler und Ladenbesitzer, alle mit fröhlichen, strahlenden Gesichtern, sahen Pierre an und sagten, als ob: „Ah, hier ist er! Mal sehen, was dabei herauskommt."

pkcs7-Wiki (2)

Ich versuche, eine Zeichenfolge mit AES 128-Bit-Verschlüsselung (ECB) zu verschlüsseln/entschlüsseln. Ich möchte wissen, wie ich das PKCS7-Addon hinzufügen/entfernen kann. Es sieht so aus, als ob die Mcrypt-Erweiterung die Verschlüsselung/Entschlüsselung übernehmen kann, aber das Add-On muss manuell hinzugefügt/entfernt werden.

Irgendwelche Ideen?

Mal schauen. PKCS#7 ist in RFC 5652 (Cryptographic Message Syntax) beschrieben.

Das Verlegeschema selbst ist in Abschnitt 6.3 angegeben. Inhaltsverschlüsselungsprozess. Im Wesentlichen heißt es: Fügen Sie so viele Bytes wie nötig hinzu, um die angegebene Blockgröße zu füllen (aber mindestens eines), und jedes muss die Fülllänge als Wert haben.

Wenn wir uns also das letzte entschlüsselte Byte ansehen, wissen wir, wie viele Bytes entfernt werden müssen. (Sie können auch überprüfen, ob sie alle denselben Wert haben.)

Jetzt kann ich Ihnen ein paar PHP-Funktionen geben, aber mein PHP ist ein bisschen eingerostet. Machen Sie es also entweder selbst (dann können Sie meine Antwort bearbeiten, um sie hinzuzufügen) oder werfen Sie einen Blick auf die Notizen, die der Benutzer zur mcrypt-Dokumentation beigetragen hat - einige davon sind Add-On-spezifisch und bieten Implementierungen von PKCS # 7-Add- ons.

Schauen wir uns also die erste Note dort im Detail an:

Dadurch wird die Blockgröße des verwendeten Algorithmus abgerufen. In Ihrem Fall würden Sie aes oder rijndael_128 anstelle von des verwenden, nehme ich an (ich habe es nicht getestet). (Stattdessen können Sie hier einfach 16 für AES nehmen, anstatt eine Funktion aufzurufen.)

$pad = $block - (strlen ($str ) % $block );

Dadurch wird die Polsterungsgröße berechnet. strlen($str) ist die Länge Ihrer Daten (in Bytes), % $block ergibt den Rest modulo $block, d. h. die Anzahl der Datenbytes im letzten Block. $block - ... gibt also die Anzahl der Bytes an, die benötigt werden, um diesen letzten Block zu füllen (jetzt eine Zahl zwischen 1 und einschließlich $block).

$str .= str_repeat (chr ($pad ), $pad );

str_repeat erzeugt einen String bestehend aus einer Wiederholung desselben Strings, hier wird das durch $pad gegebene Zeichen $pad mal wiederholt, also ein String der Länge $pad gefüllt mit $pad . $str .= ... fügt diesen Füllstring zu den Originaldaten hinzu.

return mcrypt_encrypt(MCRYPT_DES , $key , $str , MCRYPT_MODE_ECB );

Hier ist die Verschlüsselung. Verwenden Sie MCRYPT_RIJNDAEL_128 anstelle von MCRYPT_DES .

}

Jetzt eine andere Richtung:

Funktion decrypt ($str , $key ) ( $str = mcrypt_decrypt (MCRYPT_DES , $key , $str , MCRYPT_MODE_ECB );

Entschlüsselung. (Sie werden natürlich den Algorithmus wie oben ändern). $str ist der dekodierte String inklusive Padding.

$block = mcrypt_get_block_size("des" , "ecb" );

Dies ist wieder die Blockgröße. (Siehe oben).

$pad = ord ($str [($len = strlen ($str )) - 1 ]);

Das sieht etwas seltsam aus. Schreiben Sie es besser in wenigen Schritten:

$len = strlen($str); $pad = ord ($str [ $len - 1 ]);

$len ist jetzt die Länge des gefüllten Strings und $str[$len - 1] ist das letzte Zeichen dieses Strings. ord wandelt diese Zahl in eine Zahl um. $pad ist also die Zahl, die wir zuvor als Auffüllwert für die Auffüllung verwendet haben, und das ist die Auffülllänge.

return substr ($str , 0 , strlen ($str ) - $pad );

Jetzt entfernen wir also die letzten Bytes von $pad aus der Zeichenfolge. (Statt strlen($str) könnten wir hier auch $len schreiben: substr($str, 0, $len - $pad) .).

} ?>

Beachten Sie, dass Sie anstelle von substr($str, $len - $pad) auch substr($str, -$pad) schreiben können, da die substr-Funktion von PHP eine spezielle Behandlung für negative Operanden/Argumente hat, die vom Ende des Strings an gezählt werden. (Ich weiß nicht, ob dies mehr oder weniger effizient ist, als die erste Länge zu erhalten und den Index manuell zu berechnen).

Wie bereits erwähnt, in einem Kommentar von Rossum statt einfache Entfernung Einrückung, wie hier gemacht, sollten Sie überprüfen, ob sie korrekt ist - schauen Sie sich zum Beispiel substr($str, $len - $pad) an und prüfen Sie, ob alle seine Bytes chr($pad) sind. Dies dient als kleine Überprüfung gegen Korruption (obwohl diese Überprüfung effektiver ist, wenn Sie den Kettenmodus anstelle von ECB verwenden und kein Ersatz für einen echten MAC sind).

(Und dennoch, lassen Sie Ihren Kunden wissen, was er über den Wechsel zu einem höheren denken sollte Sicherheitsmodus als EZB.)

Ich habe zwei Methoden zum Befüllen und Entpacken erstellt. Die Funktionen sind mit phpdoc dokumentiert und erfordern PHP 5. Wie Sie feststellen werden, enthält die Unpad-Funktion eine Menge Ausnahmebehandlung und generiert mindestens 4 verschiedene Meldungen für jeden möglichen Fehler.

Um die Blockgröße für PHP mcrypt zu erhalten, können Sie mcrypt_get_block_size verwenden, das auch die Blockgröße in Bytes anstelle von Bits angibt.

/** * Füllt den Datenstring gemäß PKCS#7 rechts mit 1 bis n Bytes auf, * wobei n die Blockgröße ist. * Die Größe des Ergebnisses ist x mal n, wobei x mindestens 1 ist. * * Die verwendete PKCS#7-Padding-Version ist die in RFC 5652 Kapitel 6.3 definierte. * Diese Auffüllung ist identisch mit der PKCS#5-Auffüllung für 8-Byte-Blockchiffren wie DES. * * @param string $plaintext der als String codierte Klartext mit Bytes * @param integer $blocksize die Blockgröße der Chiffre in Bytes * @return string der aufgefüllte Klartext */ Funktion pkcs7pad ($plaintext , $blocksize ) ( $padsize = $blocksize - (strlen ($plaintext ) % $blocksize ); return $plaintext . str_repeat (chr ($padsize ), $padsize ); ) /** * Validiert und entpolstert den aufgefüllten Klartext gemäß PKCS#7. * Der resultierende Klartext wird 1 bis n Bytes kleiner sein, abhängig von der Füllmenge, * wobei n die Blockgröße ist. * * Der Benutzer muss sicherstellen, dass Klartext- und Füllorakel nicht gelten, * indem er beispielsweise Integrität und Authentizität für IV und Chiffretext mithilfe eines HMAC bereitstellt. * * Beachten Sie, dass beim Hochladen Fehler auftreten können, wenn die Integrität des Chiffretexts * nicht validiert wird oder der Schlüssel falsch ist. Ein falscher Schlüssel, IV oder Chiffretext kann alle * zu Fehlern innerhalb dieser Methode führen. * * Die verwendete Version der PKCS#7-Auffüllung ist diejenige, die in RFC 5652, Kapitel 6.3 definiert ist. * Diese Auffüllung ist identisch mit der PKCS#5-Auffüllung für 8-Byte-Blockchiffren wie DES. * * @param string hat den aufgefüllten Klartext aufgefüllt, der als String mit Bytes codiert ist * @param integer $blocksize die Blockgröße der Chiffre in Bytes * @return string der nicht aufgefüllte Klartext * @throws Ausnahme, wenn das Auffüllen fehlgeschlagen ist */ function pkcs7unpad ($padded , $blocksize ) ( $l = strlen ($padded ); if ($l % $blocksize != 0 ) ( throw new Exception ( "Aufgefüllter Klartext kann nicht durch die Blockgröße geteilt werden"); ) $padsize = ord ($padded [ $l - 1 ]); if ($padsize === 0 ) ( throw new Exception ( „Null-Padding statt PKCS#7-Padding gefunden“); ) if ($padsize > $blocksize ) ( throw new Exception ( "Falsche PKCS#7-Auffüllung für Blockgröße"); } // Überprüfen Sie die Korrektheit der Füllbytes, indem Sie das Vorkommen zählen$padding = substr ($padded , - 1 * $padsize ); if (substr_count ($padding , chr ($padsize )) != $padsize ) ( throw new Exception ( „Ungültige PKCS#7-Auffüllung gefunden“); ) substr zurückgeben ($padded , 0 , $l - $padsize ); )

Dies macht die Antwort von Paŭlo Ebermann in keiner Weise ungültig, es ist im Grunde dieselbe Antwort in Code und PHPDoc, nicht als Beschreibung.

Beachten Sie, dass die Rückgabe eines Padding-Fehlers an einen Angreifer dazu führen kann Beleidigung Angriff, was CBC vollständig verletzt (wenn CBC anstelle von ECB oder einer sicheren authentifizierten Chiffre verwendet wird).

4.3 Regeln für die Bildung von ES Die folgenden Algorithmen sollten bei der Bildung von ES aller Art verwendet werden:


Name

URI

Berechnung der Hash-Summe

GOST R 34.11-94

http://www.w3.org/2001/04/xmldsig-more#gostr3411

Signaturgenerierung

GOST R 34.10-2001

http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411

Kanonisierung (für XMLDSig)

Exklusive XML-Kanonisierung vom 18. Juli 2002

http://www.w3.org/2001/10/xml-exc-c14n#

Zusätzliche Transformation (für XMLDSig)

Normalisierung von SMEV



Wenn in diesem Abschnitt ein Elementname ohne Namespace angegeben wird, wird der Namespace urn://x-artefacts-smev-gov-ru/services/message-exchange/types/1.1 angenommen.

4.3.1 Signaturen im PKCS#7-Format

Das PKCS#7-Format wird verwendet, um an Nachrichten angehängte Dateien zu signieren.

Es wird Version 1.5 der PKCS#7-Spezifikation (RFC-2315) verwendet.

Das Signaturformat unterliegt folgenden Einschränkungen:

Für das ContentInfo-Stammelement ist SignedData der einzig gültige contentType.

Die Signatur muss getrennt sein (d. h. für das Element SignedData/contentInfo/contentType ist der einzig gültige Wert 1.2.840.113549.1.7.1 und das Element SignedData/contentInfo/content darf nicht vorhanden sein).

Nur der GOST 34.11-94-Algorithmus ist für die Nachrichten-Digest-Berechnung zulässig.

Nur der Algorithmus GOST 34.10-2001 darf ein EDS generieren.

Es ist verboten, mehr als eine digitale Signatur in einer PKCS#7-Kryptonachricht zu platzieren.

Das SignerInfo-Element muss die folgenden authentifizierten Attribute enthalten:


  1. contentType (1.2.840.113549.1.9.3), immer 1.2.840.113549.1.7.1.

  2. messageDigest (1.2.840.113549.1.9.4), enthält den GOST-Digest der signierten Datei.
Formaler b um Die meisten dieser Einschränkungen sind im PKCS # 7-Formatprofil, Anhang 2, beschrieben. Das Profil spiegelt auch die Tatsache wider, dass in diesem Zusammenhang das PKCS # 7-Format nur zum Übertragen von ES verwendet wird und nicht zum Übertragen von verschlüsselten Daten und CRL. Das Profil verwendet die im Standard PKCS#9 (RFC-2985) definierten Typen.

4.4 Elektronische Signaturen von Interaktionssubjekten - Einzelpersonen

4.4.1 Allgemeine Anforderungen an eine elektronische Signatur, die im Auftrag von Regierungsbeamten im Rahmen des ressortübergreifenden Informationsaustauschs erstellt wird

Zertifikate und Schlüssel elektronische Unterschrift(Abschnitt 3, Artikel 14 Bundesgesetz Nr. 63-FZ „Über die elektronische Unterschrift“) eines Beamten werden im Namen von ausgestellt Individuell Vertreter der Behörde und werden in beantragt Informationssysteme bei der Erbringung staatlicher und kommunaler Dienstleistungen/Ausführung staatlicher und kommunaler Aufgaben unter Verwendung eines Systems der interministeriellen elektronischen Interaktion zur Bildung und (oder) Überprüfung elektronischer Signaturen.

Diese Unterschriften ähneln den handschriftlichen Unterschriften dieser Mitarbeiter und bestätigen unter anderem die Tatsache, dass ein elektronisches Dokument von einem bestimmten Mitarbeiter des OV im IS des OV erstellt wurde.

Für die Speicherung und Nutzung des ES-SP-Signaturschlüssels ist ein Beamter verantwortlich und wird von Behördenvertretern kontrolliert.

Die Neuausstellung bestehender EP-SP-Schlüsselzertifikate von OE-Beamten zur Verwendung in der abteilungsübergreifenden Interaktion ist nicht obligatorisch - es ist möglich, zuvor ausgestellte und gültige Signaturschlüsselzertifikate von Beamten zu verwenden, sofern sie von einer der darin enthaltenen Zertifizierungsstellen ausgestellt wurden der einzige ES-Vertrauensraum, der vom Ministerium für Kommunikation RF gebildet wird.

4.4.2 Elektronische Signatur für abteilungsübergreifende Interaktion

EP-SP signiert die Geschäftsdaten der in XML präsentierten Nachricht sowie die angehängten Dateien. Da Anhänge getrennt von Geschäftsdaten übertragen werden, wird EP-SP für Geschäftsdaten getrennt platziert, getrennt für jede angehängte Datei.

4.4.2.1 Regeln zur Generierung der elektronischen Signatur von Nachrichten


Signaturformat

XMLDSig getrennt

Transformation, zusätzlich zur Heiligsprechung

urn://smev-gov-ru/xmldsig/transform

Formatierungsanforderungen

In der Signatur-XML-Struktur zwischen Elementen nicht erlaubt das Vorhandensein von Textknoten, einschließlich Zeilenumbrüchen.

Signiertes Element

Bei Anforderungen und Antworten das Stammelement des XML-Dokuments, das die Geschäftsdaten der Anforderung oder Antwort darstellt.

Posten in einer Nachricht

//SenderProvidedRequestData/ PersonalSignature/dsig:Signature
(für Anfragen),

//SenderProvidedResponseData/PersonalSignature/dsig:Signature
(für Antworten),


So fügen Sie eine Signatur in eine Nachricht ein

übermittelt Webdienst-Client in der Parameterstruktur der Methoden SendRequest, SendResponse.

Verfahren zum Extrahieren einer Signatur zur Überprüfung

EP wird abgerufen und geprüft Webdienst-Client.