X.690 är en av ASN.1 -standarderna som utvecklats gemensamt av ISO , IEC och ITU-T för bekvämligheten att representera data under överföring i telekommunikationsnätverk. Kodningsreglerna som beskrivs i X.690 tjänar till att representera datastrukturer som beskrivs enligt ASN.1 -regler som sekvenser av byte. Det är bekvämare att överföra sådana sekvenser över kommunikationslinjer eller spara dem i filer än att göra samma operationer med själva strukturerna [1] .
X.690-standarden beskriver följande regler för kodning av datastrukturer skapade enligt ASN.1 :
1984 skapade ITU-T- organisationen en serie standarder X.400 , bland vilka var X.409- standarden , som, på grund av aktiv användning, 1988, ITU-T , tillsammans med ISO och IEC , separerade i två separata standarder: X.208 , som beskriver ASN.1 , och X.209 , som beskriver BER-reglerna. 1994 gjordes om ASN.1 och X.208-serien av standarder flyttade till X.680- serien , och X.209-standarden ersattes av X.690-standarden [2] .
Basic Encoding Rules eller BER är en uppsättning regler som förklarar hur man representerar vilken datastruktur som helst som beskrivs enligt ASN.1 som en sekvens av åttabitars oktetter [3] .
För att tillåta olika typer av data att beskrivas på ett liknande sätt, definierade X.690 den allmänna strukturen för det kodade informationsblocket, bestående av följande 3 delar:
Identifieringsformatet är strikt fast [4] .
åtta | 7 | 6 | 5 | fyra | 3 | 2 | ett |
---|---|---|---|---|---|---|---|
Klass | Sorts | Märka |
Bitarna 8 och 7 definierar dataklassen
Klass | bit 8 | bit 7 | Klassbeskrivning |
---|---|---|---|
Universell | 0 | 0 | typer som endast definieras i X.690 och har samma betydelse i alla applikationer |
Applicerad | 0 | ett | typer vars betydelse varierar beroende på applikationen [Note 1] |
Kontextkänslig | ett | 0 | typer vars betydelse beror på en given sammansatt typ [not 2] |
Privat | ett | ett | typer vars betydelse beror på den särskilda organisationen |
Bit 6 bestämmer om data är enkel (som INTEGER), eller kan innehålla olika andra datamängder (som SET). Samtidigt, när man kodar i det första fallet, talar man om primitiv kodning, och i det andra, konstruktiv;
Data typ | bit 6 |
---|---|
Enkel | 0 |
Sammansatt | ett |
Bitarna 5 - 1 definierar datataggen.
Data typ | Tag (decimal) | Tag (hexadecimal) |
---|---|---|
EOC (End-of-Content) | 0 | 0 |
BOOLEAN | ett | ett |
HELTAL | 2 | 2 |
BITSTRÄNG | 3 | 3 |
OCTETTSTRÄNG | fyra | fyra |
NULL | 5 | 5 |
OBJEKTIDENTIFIERING | 6 | 6 |
Objektbeskrivning | 7 | 7 |
EXTERN | åtta | åtta |
VERKLIG | 9 | 9 |
RÄKNAD | tio | A |
INBÄDDAD PDV | elva | B |
UTF8 String | 12 | C |
RELATIV OID | 13 | D |
(reserverad) | fjorton | E |
(reserverad) | femton | F |
SEKVENS och SEKVENS AV | 16 | tio |
SET och SET OF | 17 | elva |
Numerisk sträng | arton | 12 |
PrintableString | 19 | 13 |
T61 String | tjugo | fjorton |
VideotexString | 21 | femton |
IA5 String | 22 | 16 |
UTC-tid | 23 | 17 |
Generaliserad tid | 24 | arton |
GraphicString | 25 | 19 |
VisibleString | 26 | 1A |
GeneralString | 27 | IB |
UniversalString | 28 | 1C |
KARAKTÄRSTRÄNG | 29 | 1D |
BMPString | trettio | 1E |
(lång form) | 31 | 1F |
Om dataklassen inte är definierad i ASN.1 kan taggen vara större än 30. I detta fall används flera oktetter för att representera identifieraren. I det här fallet har bitarna 5-1 i den första oktetten värdet , och följande oktetter kodas enligt följande: 111112
Om längden på det kodade datablocket är känd i förväg, kodas längdoktetterna enligt följande:
Om denna längd inte överstiger 127 oktetter (byte), skrivs den helt enkelt till motsvarande längdoktett. Denna form av representation av längdoktetter kallas kortform .
Exempel: Datablockets längd L: L = 34 kommer att kodas som 0010 0010Om längden på det kodade datablocket är större än 127 byte, då:
Denna form av att representera längdoktetter kallas långform .
Exempel: Datablockets längd L: L = 2614 (0000 1010 0011 0110 i binärt) kommer att kodas som: 82 0A 36 (10000010 00001010 00110110 i binärt)Om längden på det kodade datablocket vid tidpunkten för längdkodningen är okänd, skrivs värdet till längdoktetten 0х80, vilket indikerar kodning med en obestämd längd (obestämd form). I detta fall måste slutet av det kodade datablocket vara oktetter som 00 00uttryckligen indikerar dess avslutning. Obestämd längdkodning är endast tillåten för konstruktiva datatyper; de två nolloktetterna i slutet motsvarar ASN.1-datatypen med tagg 0 (End-of-contents) och längd 0.
Kodning av olika datatyper beskrivs i detalj i standardtexten (eng.) .
Tvetydighet i kodningenBeroende på strukturen och målen som eftersträvas under kodningen, kan kodningen av samma data variera avsevärt [5] [6] .
Således kan BER-kodningen för ett TRUE-värde av typen BOOLEAN se ut så här:
01 01 01så är utsikten:
01 01 0FResultatet av att koda SET-typen kan vara olika beroende på i vilken ordning vi kodar de "kapslade" datatyperna:
om
set::= SET { int, float} int::= HELTAL flyta::= RIKTIGTsedan för
set{-128, 0,15625}Resultatet av kodning enligt BER-reglerna kan bli följande:
31 08 02 01 80 09 03 80 FB 05;och så här:
31 08 09 03 80 FB 05 02 01 80.Beroende på om primitiv eller konstruktiv kodning används kan resultatet också skilja sig åt. Så för värdet "Testa användare 1" av typen STRING med primitiv kodning kommer resultatet att se ut så här:
13 0B 54 65 73 74 20 55 73 65 72 20 31med konstruktiva:
33 0F 13 05 54 65 73 74 20 13 06 55 73 65 72 20 31DER- och CER-kodningsregler används för att entydigt koda data.
Särskilda kodningsregler eller DER är samma som BER med förbehåll för följande begränsningar:
De kanoniska kodningsreglerna eller CER är desamma som BER med förbehåll för följande begränsningar:
BER erbjuder användaren olika sätt att koda samma data, och det antas att ett system som stöder ASN.1- standarder korrekt kan avkoda dem oavsett representation, medan DER och CER endast stöder ett specifikt kodningsalternativ för varje typ [6] . Denna skillnad manifesteras i hastigheten för datakodning: enligt forskning, om ett strikt definierat dataformat används under kodning, kräver systemet mycket färre operationer för detta. Enkelt uttryckt ger DER och CER mycket snabbare prestanda än BER [7] .
Huvudskillnaden mellan DER och CER är att DER använder kodning av data med en känd längd, medan CER i vissa fall (till exempel vid kodning av data av typen STRING med en längd på mer än 1000 tecken) använder kodning med en okänd längd i förväg. Denna skillnad uttrycks i antalet block som krävs för att koda längden på den krypterade datan. Så för att bestämma längden på blocket med kodad data vid kodning med en okänd längd krävs endast 3 oktetter, medan för stora meddelanden med DER-kodning kan deras antal nå 32 oktetter. Det vill säga att det är tillrådligt att använda DER vid kodning av små data, och CER - för stora [8] .
Övergången från standarderna X.208 och X.209 till X.680 - X.683 och X.690 berodde på behovet av att korrigera fel som identifierats i processen för att använda protokoll som arbetar med ASN.1 [9] . I detta avseende, under övergången från en standard till en annan, säkerställdes deras fulla kompatibilitet. I synnerhet när en användare får en BER-kodad struktur från en annan är det ofta omöjligt att med säkerhet säga vilken av standarderna han använde vid kodningen [10] .
BER, DER och CER används aktivt i olika dataöverföringsprotokoll och i kryptografiska protokoll, såsom:
Trots enkelheten i datakodning [14] anser många att BER, DER och CER är ineffektiva jämfört med andra kodningsregler, eftersom, för det första, storleken på datakodningsresultatet med hjälp av BER ofta visar sig vara större än när man använder dess alternativ. , och för det andra tar själva kodningen lite mer tid [7] .
Sådana datakodningsscheman utvecklade för att förbättra BER [6] är Packed Encoding Rules (PER), XML Encoding Rules (XER) och ASN.1 SOAP, som beskrivs i ITU-T X.691 , X.693 , respektive X. 892 .