Allgemeines
Anwendungsgebiet: | Verschlüsselung von Wörtern; siehe "Verschlüsselung" |
Makrotyp: | S-Typ, MF-Format 3: D-/C-/M-/E-/L-Form; |
Makrobeschreibung
Der Makro CRYPT dient der Einweg-Verschlüsselung von Wörtern mit einer maximalen Länge von 8 Byte. Einweg-Verschlüsselung heißt, dass eine Entschlüsselung der mit CRYPT verschlüsselten Wörter nicht möglich ist. Im Ergebnis der Makroausführung wird eine 4 Byte oder 8 Byte lange Zeichenkette zurückgeliefert.
Makroaufrufformat und Operandenbeschreibung
|
|
In der nachfolgenden Operandenbeschreibung sind die Operanden alphabetisch geordnet.
CRCL2OP=
verschlüsselt das Eingabewort in Abhängigkeit vom Systemparameter ENCRYPT.
*YES
Es wird abhängig vom Systemparameter ENCRYPT verschlüsselt.
*NO
Es wird immer verschlüsselt, also unabhängig vom Systemparameter ENCRYPT.
<var: enum-of _cl2op_s:1>
Name des Feldes mit der Art der Verschlüsselung.
CRYALG=
wählt den Verschlüsselungsalgorithmus aus.
*SCA
Es wird der Verschlüsselungsalgorithmus SCA verwendet.
*SCAVK
Es wird der Verschlüsselungsalgorithmus SCA und der im Schlüsselfeld (Operand VKEYA) angegebene Schlüssel verwendet.
*OLD
Der bisher verwendete Verschlüsselungsalgorithmus wird verwendet.
<var: enum-of _ecrt_s:1>
Name des Feldes mit dem Verschlüsselungsalgorithmus.
INSTRA=
bestimmt die Adresse eines Feldes, dass das zu verschlüsselnde Wort (Eingabewort) enthält. Die Länge des Feldes wird mit dem Operanden INSTRL angegeben. Das Eingabewort muss eine Zeichenkette vom Typ X-String oder C-String mit maximal 8 Zeichen sein.
Die Angabe dieses Operanden ist Pflicht bei MF=L.
<var: pointer>
Name des Feldes mit der Adresse des Eingabewortes; nur in Verbindung mit MF=M zulässig.
(<reg: pointer>)
Register mit der Adresse des Eingabewortes; nur in Verbindung mit MF=M zulässig.
INSTRL=
gibt die Länge des Feldes an, das für das zu verschlüsselnde Eingabewort reserviert werden muss. Die Länge darf den Wert 8 nicht übersteigen. Das Feld, in dem das Eingabewort spezifiziert ist, darf nur entweder 4 Byte oder 8 Byte lang sein.
4
Es werden 4 Byte für die Feldlänge reserviert.
8
Es werden 8 Byte für das Feld reserviert.
<var: int:1>
Name des Feldes mit der Angabe der zu reservierenden Feldlänge.
MF=
Zur allgemeinen Beschreibung des Operanden MF, der dazugehörenden Operandenwerte und der evtl. nachfolgenden Operanden (z.B. PREFIX, MACID und PARAM) siehe Abschnitt „S-Typ-Makroaufrufe“. Die gültigen MF-Werte sind zu Beginn der Makrobeschreibung bei „Makrotyp“ angegeben und aus dem Aufrufformat ersichtlich.
Bei der C-Form oder D-Form des Makroaufrufs kann ein Präfix PREFIX und bei der C-Form zusätzlich eine Macid MACID angegeben werden (siehe Abschnitt „S-Typ-Makroaufrufe“).
OUSTRA=
bestimmt die Adresse eines Feldes, dass das verschlüsselte Wort (Ausgabewort) enthalten soll. Zurückgeliefert wird ein 4 Byte langes Ausgabewort, wenn das Eingabewort <= 4 Byte ist. Beträgt die Länge des Eingabewortes zwischen 5 Byte und 8 Byte, wird ein 8 Byte langes Ausgabewort zurückgeliefert.
Die Angabe dieses Operanden ist Pflicht bei MF=L.
<var: pointer>
Name des Feldes mit der Adresse des Ausgabewortes; nur in Verbindung mit MF=M zulässig.
(<reg: pointer>)
Register mit der Adresse des Ausgabewortes; nur in Verbindung mit MF=M zulässig.
VKEYA=
Adresse des verwendeten variablen Schlüssels, der bei der Verschlüsselungseinstellung CRYALG=*SCAVK verwendet werden soll.
<var: pointer>
Name des Feldes mit der Adresse des variablen Schlüssels; nur in Verbindung mit MF=M zulässig.
(<reg: pointer>)
Register mit der Adresse des variablen Schlüssels; nur in Verbindung mit MF=M zulässig.
XPAND=
steuert die Makroauflösung.
*INPAR
Es wird die Parameterstruktur expandiert.
*KEYPAR
Es wird nur der Datenbereich für den variablen Schlüssel expandiert.
Auswahl des variablen Schlüssels
Die Verwendung eines variablen Schlüssels ist nur bei einer Verschlüsselung mit dem SCA-Algorithmus (Operand CRYALG=*SCA) möglich. Der variable Schlüssel ist 44 Byte lang und besteht aus folgenden vier Teilen (PREFIX und MACID sind jeweils mit ihren Voreinstellungen belegt):
SRMEVK | DS | 0F | |
SRMECC | DS | F | Iterationsanzahl |
SRMEKEE1 | DS | XL16 | Schlüsselkomponente EE1 |
SRMEKEE2 | DS | XL16 | Schlüsselkomponente EE2 |
SRMEKEE3 | DS | XL8 | Schlüsselkomponente EE3 |
SRMEVK# | EQU | *-SRMEVK |
Die Verschlüsselung mit dem SCA-Algorithmus beruht auf der iterativen Anwendung einer Basisverschlüsselung. Um eine genügend große Sicherheit zu bieten, muss die Anzahl der Iterationen (Feld SRMECC
) 128 bis 8192 betragen. Eine Verschlüsselung mit der Iterationsanzahl 128 benötigt ca. 15000 Operationen. Die Anzahl der Operationen steigt linear mit der Anzahl der Iterationen.
Die Schlüsselkomponenten EE1 und EE2 (Felder SRMEKEE1
und SRMEKEE2
) repräsentieren Permutationen der Zahlen 0 bis 15. Für einen sog. „sicheren“ Schlüssel muss jedes Byte von EE1 und EE2 eine Zahl von 0 bis 15 enthalten, und zwar so, dass jede dieser Zahlen jeweils einmal in EE1 bzw. EE2 vorkommt.
Die Schlüsselkomponente EE3 (Feld SRMEKEE3
) enthält beliebige Zeichen in der Länge 8 Byte. Es dürfen jedoch keine 2 gleichen Byte enthalten sein.
Die Verschlüsselungsroutine prüft die o.g. Bedingungen für einen „sicheren“ variablen Schlüssel nicht ab. Bei Einweg-Verschlüsselungsverfahren ist die Verwendung von „schwachen“ Schlüsseln oft nicht zu vermeiden. Der SCA-Verschlüsselungsalgorithmus ist daher auch mit „schwachen“ Schlüsseln ablauffähig. Aus Sicherheitsgründen sollte die Verwendung von „schwachen“ Schlüsseln vermieden werden.
Verschlüsselung von Eingabeworten einer Länge > 8 Byte
Ist eine Verschlüsselung von Worten mit einer Länge > 8 Byte nötig, kann das Eingabewort in 8-Byte-Worte zerlegt und die Wortsegmente separat verschlüsselt werden. Die Verschlüsselung von Wörtern mit einer Länge > 8 Byte ist mit den vom Makro CRYPT angebotenen Algorithmen nicht sicherer, als die Verschlüsselung eines Wortes mit einer Länge <= 8 Byte.
Layout der DSECT
Das Layout der DSECT finden Sie in "CRYPT - Wörter verschlüsseln".
Rückinformation und Fehleranzeigen
Standardheader:
+---------------+ | | | | | |c|c|b|b|a|a|a|a| +---------------+
Über die Ausführung des Makros CRYPT wird im Standardheader folgender Returncode übergeben (cc=Subcode2, bb=Subcode1, aaaa=Maincode):
X'cc' | X'bb' | X'aaaa' | Erläuterung |
X'00' | X'00' | X'0000' | Funktion erfolgreich ausgeführt. |
X'01' | X'01' | X'0001' | Funktion wegen Operandenfehler nicht ausgeführt: |
X'02' | X'01' | X'0001' | Funktion wegen Operandenfehler nicht ausgeführt: |
X'03' | X'01' | X'0001' | Funktion wegen Operandenfehler nicht ausgeführt: |
X'04' | X'01' | X'0001' | Funktion wegen Operandenfehler nicht ausgeführt: |
X'05' | X'01' | X'0001' | Funktion wegen Operandenfehler nicht ausgeführt: |
X'06' | X'01' | X'0001' | Funktion wegen Operandenfehler nicht ausgeführt: |
X'08' | X'01' | X'0001' | Funktion wegen Operandenfehler nicht ausgeführt: |
X'09' | X'01' | X'0002' | Funktion nicht ausgeführt wegen Fehler bei der Speicherbereichsanforderung: |
X'0A' | X'01' | X'0002' | Funktion nicht ausgeführt wegen Fehler bei der Speicherbereichsanforderung: |
X'0B' | X'01' | X'0002' | Funktion nicht ausgeführt wegen Fehler bei der Speicherbereichsanforderung: |
X'0C' | X'01' | X'0002' | Funktion nicht ausgeführt wegen Fehler bei der Speicherbereichsanforderung: |
X'0D' | X'01' | X'0002' | Funktion nicht ausgeführt wegen Fehler bei der Speicherbereichsanforderung: |
X'20' | X'0003' | Funktion nicht ausgeführt: Interner Fehler. |
Weitere Returncodes, deren Bedeutung durch Konvention makroübergreifend festgelegt ist, können der Tabelle „Standard-Returncodes“ (Standardheader) entnommen werden.
Beispiel
PRINT NOGEN CRYPT START BALR 10,0 USING *,10 CRYPT MF=E,PARAM=PARLIST -------------------------------------(1) 1 MFCHK MF=E,PREFIX=S,MACID=RME,PARAM=PARLIST, 1 SVC=16, 1 DMACID=RME,SUPPORT=(D,L,C,M,E) 2 LA 1,PARLIST 2 SVC 16 CLI SRMEMR1,SRMEOK * Error query BNE ERREXIT UNPK OUTPUTX(9),OUTPUT(5) UNPK OUTPUTX+8(9),OUTPUT+4(5) TR OUTPUTX,CODETAB-C'0' WROUT CODE,0 * Output TERM * ERREXIT WROUT TEXT,0 TERM **** CODE DC Y(CODEEND-CODE) DS CL3 DC C'OUTPUT OF THE ENCRYPTED WORD ' INPUT DC C'SUPERMAN' * Input word * DC C': ' OUTPUT DS CL8 * Output word DC C' ' OUTPUTX DS CL16 * Output word hex CODEEND EQU * DS C TEXT DC Y(TEXTEND-TEXT) DS CL3 DC C'ERROR !!' TEXTEND EQU * KEY DS 0F DC F'250' * Number of iterations DC X'0203040506070809' * EE1 DC X'0A0B0C0D0E0F0001' EE1 * DC X'0100030205040706' * EE2 DC X'09080B0A0D0C0F0E' EE2 * DC X'A1A2A3A4A5A6A7A8' * EE3 * PARLIST CRYPT MF=L,INSTRL=8,CRYALG=*SCAVK,CRCL2OP=*NO, 2 VKEYA=KEY,INSTRA=INPUT,OUSTRA=OUTPUT -------------------(1) ORG PARLIST CRYPT MF=C ---------------------------------------------------(2)
1 * 1 SRMEPA DS 0F BEGIN of PARAMETERAREA 1 FHDR MF=(C,SRME),EQUATES=NO STANDARD HEADER 2 DS 0A 2 SRMEFHE DS 0XL8 0 GENERAL PARAMETER AREA HEADER 2 * 2 SRMEIFID DS 0A 0 INTERFACE IDENTIFIER 2 SRMEFCTU DS AL2 0 FUNCTION UNIT NUMBER 2 * BIT 15 HEADER FLAG BIT, 2 * MUST BE RESET UNTIL FURTHER NOTICE 2 * BIT 14-12 UNUSED, MUST BE RESET 2 * BIT 11-0 REAL FUNCTION UNIT NUMBER 2 SRMEFCT DS AL1 2 FUNCTION NUMBER 2 SRMEFCTV DS AL1 3 FUNCTION INTERFACE VERSION NUMBER 2 * 2 SRMERET DS 0A 4 GENERAL RETURN CODE 2 SRMESRET DS 0AL2 4 SUB RETURN CODE 2 SRMESR2 DS AL1 4 SUB RETURN CODE 2 2 SRMESR1 DS AL1 5 SUB RETURN CODE 1 2 SRMEMRET DS 0AL2 6 MAIN RETURN CODE 2 SRMEMR2 DS AL1 6 MAIN RETURN CODE 2 2 SRMEMR1 DS AL1 7 MAIN RETURN CODE 1 2 SRMEFHL EQU 8 8 GENERAL OPERAND LIST HEADER LENGTH 2 * 1 * RETURN CODE EQUATES FOR MAIN-CODE 1 1 SRMEOK EQU X'00' NOERROR 1 SRMEIOP EQU X'01' INVALID OPERAND 1 SRMEIAR EQU X'02' INVALID AREA 1 SRMEINE EQU X'03' INTERNAL ERROR 1 * 1 SRMEIN DS F INPUT STRING ADDRESS 1 SRMEOUT DS F OUTPUT STRING ADDRESS 1 SRMELEN DS X INPUT STRING LENGTH 1 SRMEECR DS X SELECT ENCRYPTION ROUTINE 1 * 1 * EQUATES FOR ENCRYPTION ROUTINE SELECT 1 SRMEECRS EQU X'01' SCA ENCRYPTION ROUTINE 1 SRMEECRO EQU X'02' OLD ENCRYPTION ROUTINE 1 SRMEECRV EQU X'03' SCA ENCR. ROUT. (V. KEY) 1 * 1 SRMEC2O DS X SEL. CLASS 2 OPTION YES/NO 1 * EQUATES FOR CLASS 2 OPTION 1 SRMEC2OY EQU X'01' CLASS 2 OPTION YES 1 SRMEC2ON EQU X'02' CLASS 2 OPTION NO 1 * 1 SRMEPOE DS X PROGRESS OF EXECUTION 1 * RETURN FOR PROGRESS OF EXECUTION 1 SRMEUV EQU X'01' UNCRYPTED
1 SRMESCA EQU X'02' SCA ENCRYPTED 1 SRMEOLD EQU X'03' OLD ENCRYPTED 1 SRMESVK EQU X'04' SCA ENCRYPTED (V. KEY) 1 * 1 SRMESVK@ DS F ADR. VARIABLE KEY 1 SRME# EQU *-SRMEPA LENGTH OF PARAMETERAREA * CODETAB DC C'0123456789ABCDEF' END CRYPT
Ablaufprotokoll:
/start-assembh % BLS0500 PROGRAM 'ASSEMBH', VERSION '<ver>' OF '<date>' LOADED % ASS6010 <ver> OF BS2000 ASSEMBH READY %//compile source=*library-element(lib.srpmencp,crypt), - %// compiler-action=module-generation(module-format=llm), - %// module-library=lib.srpmencp, - %// listing=parameters(output=*library-element(lib.srpmencp,crypt)) % ASS6011 ASSEMBLY TIME: 360 MSEC % ASS6018 0 FLAGS, 0 PRIVILEGED FLAGS, 0 MNOTES % ASS6019 HIGHEST ERROR-WEIGHT: NO ERRORS % ASS6006 LISTING GENERATOR TIME: 65 MSEC %//end % ASS6012 END OF ASSEMBH /start-executable-program library=lib.srpmencp,element-or-symbol=crypt % BLS0523 ELEMENT 'CRYPT', VERSION '@', TYPE 'L' FROM LIBRARY ':2OSC:$EVA.LIB .SRPMENCP' IN PROCESS % BLS0524 LLM 'CRYPT', VERSION ' ' OF '<date> <time>' LOADED OUTPUT OF THE ENCRYPTED WORD SUPERMAN: |ÑzÄkè~] 4F69A9639254FFBD --------(3)
(1) | Ein Wort der Länge 8 Bytes soll mit dem SCA-Algorithmus unabhängig vom Systemparameter mit dem Makro CRYPT verschlüsselt werden. Es soll ein variabler Schlüssel verwendet werden. Das Eingabewort wird aus dem Feld |
(2) | Layout der Parameterliste. |
(3) | Ausgabe des Feldes |