|
narzędziaW innych językach |
Comp128COMP128 - algorytm implementowany w kartach SIM, realizujący w jednym kroku operacje wykonywane przez algorytmy A3 oraz A8. Pierwszy z nich (A3) odpowiedzialny jest za uwierzytelnianie (autoryzację) użytkownika w sieci GSM, drugi (A8) -za wybór klucza sesyjnego Kc pozwalającego szyfrować dane. Ponieważ algorytmy te posiadają te same parametry wejścia, ale dwa różne parametry wyjścia mogły w praktyce zostać zastąpione jednym algorytmem posiadającym dwa wyjścia (SRES, Kc), jakim jest właśnie COMP128.
Autoryzacja użytkownika w sieci oraz wyliczanie klucza sesyjnego Kc:
VOID A3A8 (wejście RAND[16], Ki[16],
wyjście SIMoutput[12])-operują na bajtach
{
x[32]-bufor wewnętrzny-operuje na bajtach, bit[128]-bufor roboczy;
T[5][]-bloki podstawieniowe zapisane w tablicy (512, 256, 128, 64, 32 bajtów);
pozostałe zmienne i, j, k, l, m, n, y, z, następny_bit;
zapisanie RAND na ostatnich 16 bajtach bufora (x[16...31])
for i=16 to 31{
x[i]=RAND[i]
}
wykonanie pętli 8 razy
for i=1 to 8{
zapisanie Ki na pierwszych 16 bajtach bufora (x[0...15])
for j=0 to 15{
x[j]=Ki[j]
}
kompresja (tzw. kompresja motyla, czyli jedna z głównych słabości algorytmu COMP128)
for j=0 to 4{
for k=0 to (2^j)-1{
for l=0 to 2(^4-j)-1{
m=1+k2^(5-j)
n=m+2^(4-j)
y=(x[m]+2x[n])mod 2^(9-j);
z=(2x[m]+x[n])mod 2^(9-j);
x[m]=T[j][y];
x[n]=T[j][z];
}
}
}
"Form bits From bytes" czyli przestawienie bitów w buforze
for j=0 to 31{
for k=0 to 3{
bit[4j+k]=(x[j]>>(3-k))&1
}
}
permutacja z pominięciem ostatniej pętli
if i<8{
for j=0 to 15{
for k=0 to 7{
następny_bit=17(8j+k)mod 128
k-ty bit x[j+16]=bit[następny_bit]
}
}
}
}
kompresja 16 bajtów wynikowych do 12 bajtów oraz zapisanie
ich w SIMoutput[] (x[0...3]-SRES; x[4...11]-Kc);
wyzerowanie ostatnich 10 bitów klucza Kc
for i=0 to 3
SIMoutput[i]=(x[2i]<<4)|x[2i+1]
for i=0 to 5
SIMoutput[4+i]=(x[2i+18]<<6|(x[2i+18+1]<<2)|(x[2i+18+2]>>2)
SIMoutput[4+6]=(x[26+18]<<6)|(x[26+18+1]<<2)
SIMoutput[4+7]=0
}
|