
å 責äºé ãã®èšäºã¯æ å ±æäŸã®ã¿ãç®çãšããŠå ¬éãããŠããããã®èšäºã§å ¬éãããŠããè³æã䜿çšããå Žåãèè ã¯è²¬ä»»ãè² ããŸããã
ãŸãããã®èšäºã§GSMãã©ãã£ãã¯ãèãããã®ã¹ããããã€ã¹ãããã¬ã€ããèŠã€ããããšãæåŸ ããŠããå ŽåããŸãã¯ãã®èšäºãèªãã§ãå人ãç¥äººã
ããŒã1ïŒGSMã»ãã¥ãªãã£ã®ãã€ã©ã€ã
GSMãããã¯ãŒã¯ã§äœ¿çšãããæå·åã¢ã«ãŽãªãºã ã®èª¬æã«é²ãåã«ããŠãŒã¶ãŒã®èªèšŒæ¹æ³ãšæå·åããŒã®çææ¹æ³ã«ã€ããŠèããŠã¿ãŸãããã ãããè¡ãããã«ããŠã£ãããã£ã¢ããåçšããåçã䜿çšããŸãïŒå質ã«è¬çœªããŸããããã以äžè¯ããã®ã¯èŠã€ãããŸããã§ããïŒã

ãã®å³ã§ã¯ã次ã®æé ãæš¡åŒçã«ç€ºããŠããŸãã
- ãªãã¬ãŒã¿ãŒã®é»è©±ããããã¯ãŒã¯ã«æ¥ç¶ãããŠããŸãã
- çæ£æ§ã確èªããããã«ãé»è©±ã¯TMSIïŒTemporary Mobile Subscriber IdentityïŒãšåŒã°ããç¹å¥ãªèå¥ã³ãŒããéä¿¡ããŸãã
- èªèšŒã»ã³ã¿ãŒïŒCAïŒã¯128ãããã®ä¹±æ°RANDãçæãããããã¢ãã€ã«ã¹ããŒã·ã§ã³ïŒMSïŒã«éä¿¡ããŸãã
- MSã¯ããã©ã€ããŒãããŒK iãšèªèšŒã¢ã«ãŽãªãºã A3ã䜿çšããŠãåä¿¡ããRANDçªå·ãæå·åããŸãã
- MCã¯ãåã®æé ã§ååŸããã·ãŒã±ã³ã¹ããæåã®32ããããååŸãïŒSRESïŒçœ²åä»ãå¿çïŒãšåŒã³ãŸãããïŒãCAã«éãè¿ããŸãã
- CAã¯åãæäœãè¡ãã32ãããã®XRESã·ãŒã±ã³ã¹ïŒäºæãããå¿çïŒãåãåããŸãã
- 次ã«ãCAã¯SRESãšXRESãæ¯èŒããŸãã äž¡æ¹ã®å€ãçããå Žåãé»è©±ã¯èªèšŒããããšèŠãªãããŸãã
- MSãšCAã¯ãç§å¯éµK iãšéµçæã¢ã«ãŽãªãºã A8 K c = A8 ki ïŒRANDïŒã䜿çšããŠã»ãã·ã§ã³æå·åéµãèšç®ããŸã
èªèšŒã¢ã«ãŽãªãºã A3ãšããŒçæã¢ã«ãŽãªãºã A8ã«ã€ããŠèšãã°ãå®éã«ã¯ã»ãšãã©ã®ã¢ãã€ã«ãªãã¬ãŒã¿ãŒãCOMP128ãšåŒã°ãããã®ç®çã®ããã«1ã€ã®ã¢ã«ãŽãªãºã ã䜿çšããŠããããšã«æ³šæããå¿ èŠããããŸãïŒCOMP128-1ãCOMP128-2ãCOMP128-3ã«å€ãã®å€æŽããããŸãïŒã
COMP128ã¯éåžžã®ããã·ã¥é¢æ°ã§ãå ¥åã§128ãããã·ãŒã±ã³ã¹ãåãåããåºåã§96ãããã·ãŒã±ã³ã¹ãè¿ããŸãã
ãã®ãããèªèšŒã«ç°ãªãã¢ã«ãŽãªãºã ã䜿çšããŠã»ãã·ã§ã³ããŒãçæãã代ããã«ã次ã®ã¹ããŒã ã䜿çšãããŸãã
SRES = COMP128ããã®æåã®32ãããïŒK i || RANDïŒ
K c = COMP128ã®æåŸã®64ãããïŒK i || RANDïŒã
æå·åã®åžžãšããŠãéçºè ã®æéãç¯çŽããããšããè©Šã¿ã¯å®å šãªå€±æã§ããããšãå€æããŸããã GSMãããã¯ãŒã¯ã®ã»ãã¥ãªãã£ã¯ãåœåã¯ãæªç¥ã«ããã»ãã¥ãªãã£ãã®ååã«åºã¥ããŠããŸããã ãããŠã1998幎ã«Marc BricenoãIan GoldbergãDavid Wagnerããæãç 究è ã°ã«ãŒãã«ãã£ãŠã¢ã«ãŽãªãºã ãçºèŠããããšãã1ã€ã®èå³æ·±ãæ©èœãæããã«ãªããŸãããç§å¯éµK iã®æåŸã®10ãããã¯åžžã«ãŒãã§ããã ãã®å¥åŠãªç¹æ§ãšããèªçæ¥ã®æ»æãã«å¯ŸããCOMP128ã®è匱æ§ãå©çšããŠãMarc BricenoãIan GoldbergãDavid Wagnerã¯ãSIMã«ãŒãããç§å¯éµK iãæœåºã§ããŸããã
ãã®ç 究ã®çµæãCOMP128ã¢ã«ãŽãªãºã ãåºãæåŠããããã®æè¡çãªè©³çŽ°ã¯ç§å¯ã«ããããããä¿¡é Œæ§ã®é«ãä¿®æ£COMP128-2ããã³COMP128-3ã«çœ®ãæããããŸããã ããŒã...ããã¯äœããæãåºãããŸããïŒ
ããŒã2ïŒA5 / 1æå·åã¢ã«ãŽãªãºã
次ã«ãããäžè¬çãªãã®ãããããã©ã€ããŒããªãã®ã«ç§»ããé»è©±ã§ã®äŒè©±ã®GSMæå·åãã©ã®ããã«å®è£ ããããã«ã€ããŠè©±ããŸãããã
GSMã®æå·åã¢ã«ãŽãªãºã ãšããŠãA5ãã¡ããªãŒã®ã¢ã«ãŽãªãºã ã䜿çšãããŸãã çŸåšããã®ãã¡ã®3ã€ã®ã¿ã§ãã
- A5 / 1-çŸåšæãäžè¬çãªã¹ããªãŒã æå·ã
- A5 / 2㯠ã以åã®ã貧匱ãªãã¢ã«ãŽãªãºã ã®å€åœ¢ã§ãã 圌ã®ãå ãã«éåžžã«äŒŒãŠããŸãããæåã¯A5 / 1ã®éåžžã«åŒ±äœåããããŒãžã§ã³ã«ã€ããŠèããŸããã çŸåšäœ¿çšãããŠããŸãã
- A5 / 3ãããã¯æå·ã å»æ¢ãããA5 / 1ã眮ãæããããã«2002幎ã«èšèšãããŸããã ãã ããçŸåšã¯3GPPãããã¯ãŒã¯ã§ã®ã¿äœ¿çšãããŠããŸãã ã¢ã«ãŽãªãºã ã«å€ãã®è匱æ§ãèŠã€ãããŸããããå®éã®æ»æã«ã€ããŠã¯ãŸã 話ããããŸããã
ã¢ã«ãŽãªãºã A5 / 1ãããã«è©³ããèããŠã¿ãŸãããã
ãããã£ãŠãåè¿°ã®ããã«ãA5 / 1ã¯ã¹ããªãŒã æå·ã§ãã ãŸãããŠã£ãããã£ã¢ã®åçã¯æ¥ãã§å©ãã«ãªããŸãã

A5 / 1æå·ã®å éšç¶æ ã¯ããã£ãŒãããã¯R1ãR2ãR3ãããããé·ã19ã22ãããã³23ãããïŒåèš64ãããïŒã®3ã€ã®ç·åœ¢ã·ããã¬ãžã¹ã¿ã§æ§æãããŠããŸãã
ã¬ãžã¹ã¿R1ãR2ãR3ã®ã·ããã¯ãç¹å®ã®æ¡ä»¶ãæºããããå Žåã«ã®ã¿çºçããŸãã åã¬ãžã¹ã¿ã«ã¯ãã¯ããã¯å¶åŸ¡ãããããå«ãŸããŠããŸãã R1ã§ã¯ããã¯8çªç®ã®ãããã§ãããR2ããã³R3ã§ã¯10çªç®ã®ãããã§ãã åã¹ãããã§ãåæãããã®å€ã3ã€ãã¹ãŠã®ã¬ãžã¹ã¿ã®åæãããã®å€ã®ã»ãšãã©ã«çããã¬ãžã¹ã¿ã®ã¿ãã·ãããããŸãã
ã¢ã«ãŽãªãºã ãå®è¡ããåã«ãã¬ãžã¹ã¿ã®åæåãå®è¡ãããŸãã 次ã®ããã«çºçããŸãã
- R1 = R2 = R3 = 0
- i = 0ã63ã®å Žå
R1 [0] = R1 [0]âKc[i]
R2 [0] = R2 [0]âKc[i]
R2 [0] = R2 [0]âKc[i]
åæããããç¡èŠããŠããã¹ãŠã®ã¬ãžã¹ã¿ã1ããžã·ã§ã³ã ãã·ããããŸãã - i = 0ã22ã®å Žå
R1 [0] = R1 [0]âFrameCount[[i]
R2 [0] = R2 [0]âFrameCount[[i]
R2 [0] = R2 [0]âFrameCount[[i]
åæããããç¡èŠããŠããã¹ãŠã®ã¬ãžã¹ã¿ã1ããžã·ã§ã³ã ãã·ããããŸãã - i = 0ã99ã®å Žå
åæããããèæ ®ããŠãã¬ãžã¹ã¿ã1ããžã·ã§ã³ã·ããããŸãã
çŸåšã®ãã¬ãŒã ã®çªå·ã®FrameCount 32ãããã¬ã³ãŒãã
åæååŸã228ãããã®åºåã·ãŒã±ã³ã¹ãèšç®ãããŸãã 114ãããã¯ããããã¯ãŒã¯ããæºåž¯é»è©±ã«éä¿¡ãããããŒã¿ãæå·åããããã«äœ¿çšãããæ®ãã®114ãããã¯ãé»è©±ãããããã¯ãŒã¯ã«éä¿¡ãããããŒã¿ãæå·åããããã«äœ¿çšãããŸãã æå·åèªäœã¯ãA5 / 1ã¢ã«ãŽãªãºã ã«ãã£ãŠçæãããããŒã¿ãšããŒã¹ããªãŒã éã®éåžžã®XORã§ãã
ããŒã¿è»¢éåŸããã¬ãŒã çªå·ã1ã€å¢å ããã¬ãžã¹ã¿ãå床åæåãããŸãã
äžèšã®èª¬æã䜿çšããŠãCïŒã§A5 / 1æå·åãå®è£ ããŸãã
Cã®ã¯ã©ã¹A5EncïŒ
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace A5project { class A5Enc { private bool[] reg = new bool[19]; private bool[] reg2 = new bool[22]; private bool[] reg3 = new bool[23]; //, public A5Enc(bool[][] startState) { reg = startState[0]; reg2 = startState[1]; reg3 = startState[2]; } public A5Enc() { for (int i = 0; i < 19; i++) reg[i] = false; for (int i = 0; i < 22; i++) reg2[i] = false; for (int i = 0; i < 23; i++) reg3[i] = false; } // , A5 public void KeySetup(byte[] key, int[] frame) { for (int i = 0; i < 19; i++) reg[i] = false; for (int i = 0; i < 22; i++) reg2[i] = false; for (int i = 0; i < 23; i++) reg3[i] = false; BitArray KeyBits = new BitArray(key); BitArray FrameBits = new BitArray(frame); bool[] b = new bool[64]; for (int i = 0; i < 64; i++) { clockall(); reg[0] = reg[0] ^ KeyBits[i]; reg2[0] = reg2[0] ^ KeyBits[i]; reg3[0] = reg3[0] ^ KeyBits[i]; } for (int i = 0; i < 22; i++) { clockall(); reg[0] = reg[0] ^ FrameBits[i]; reg2[0] = reg2[0] ^ FrameBits[i]; reg3[0] = reg3[0] ^ FrameBits[i]; } for (int i = 0; i < 100; i++) { clock(); } } // , public void KeySetup(int[] frame) { BitArray FrameBits = new BitArray(frame); for (int i = 0; i < 22; i++) { clockall(); reg[0] = reg[0] ^ FrameBits[i]; reg2[0] = reg2[0] ^ FrameBits[i]; reg3[0] = reg3[0] ^ FrameBits[i]; } for (int i = 0; i < 100; i++) { clock(); } } private void clock() { bool majority = ((reg[8] & reg2[10]) | (reg[8] & reg3[10]) | (reg2[10] & reg3[10])); if (reg[8] == majority) clockone(reg); if (reg2[10] == majority) clocktwo(reg2); if (reg3[10] == majority) clockthree(reg3); } // private bool[] clockone(bool[] RegOne) { bool temp = false; for (int i = RegOne.Length - 1; i > 0; i--) { if (i == RegOne.Length - 1) temp = RegOne[13] ^ RegOne[16] ^ RegOne[17] ^ RegOne[18]; RegOne[i] = RegOne[i - 1]; if (i == 1) RegOne[0] = temp; } return RegOne; } private bool[] clocktwo(bool[] RegTwo) { bool temp = false; for (int i = RegTwo.Length - 1; i > 0; i--) { if (i == RegTwo.Length - 1) temp = RegTwo[20] ^ RegTwo[21]; RegTwo[i] = RegTwo[i - 1]; if (i == 1) RegTwo[0] = temp; } return RegTwo; } private bool[] clockthree(bool[] RegThree) { bool temp = false; for (int i = RegThree.Length - 1; i > 0; i--) { if (i == RegThree.Length - 1) temp = RegThree[7] ^ RegThree[20] ^ RegThree[21] ^ RegThree[22]; RegThree[i] = RegThree[i - 1]; if (i == 1) RegThree[0] = temp; } return RegThree; } private void clockall() { reg = clockone(reg); reg2 = clocktwo(reg2); reg3 = clockthree(reg3); } // 114 public bool[] A5() { bool[] FirstPart = new bool[114]; for (int i = 0; i < 114; i++) { clock(); FirstPart[i] = (reg[18] ^ reg2[21] ^ reg3[22]); } return FirstPart; } // 228 public bool[] A5(bool AsFrame) { bool[] FirstPart = new bool[228]; for (int i = 0; i < 228; i++) { clock(); FirstPart[i] = (reg[18] ^ reg2[21] ^ reg3[22]); } return FirstPart; } public byte[] FromBoolToByte(bool[] key, bool lsb) { int bytes = key.Length / 8; if ((key.Length % 8) != 0) bytes++; byte[] arr2 = new byte[bytes]; int bitIndex = 0, byteIndex = 0; for (int i = 0; i < key.Length; i++) { if (key[i]) { if(lsb) arr2[byteIndex] |= (byte)(((byte)1) << (7 - bitIndex)); else arr2[byteIndex] |= (byte)(((byte)1) << (bitIndex)); } bitIndex++; if (bitIndex == 8) { bitIndex = 0; byteIndex++; } } return arr2; } } }
ããŒ{0x12ã0x23ã0x45ã0x67ã0x89ã0xABã0xCDã0xEF}ããã³ãã¬ãŒã çªå·0x134ã䜿çšããŠããã°ã©ã ãå®è¡ããããšã«ãããã³ãŒããæ£ããããšã確èªã§ããŸãã çæããã114ãããã®2ã€ã®ã·ãŒã±ã³ã¹ã¯ããããã{0x53ã0x4Eã0xAAã0x58ã0x2Fã0xE8ã0x15ã0x1Aã0xB6ã0xE1ã0x85ã0x5Aã0x72ã0x8Cã0x00}ã0x24ã0xFDã0x35ã0xFDã0x35ã0xFDã0x35ã0xFDã0x35ã0xFDã0x35ã0xFDã0x35ã0xFD ã0xA3ã0x5Dã0x5Fã0xB6ã0x52ã0x6Dã0x32ã0xF9ã0x06ã0xDFã0x1Aã0xC0}ã
ããŒã¯ããªã»ããã€ã¢ã³ãŽãŒã«ãããŒã°ãããããã¯ã°ããŒãCã§æžãããã¢ã«ãŽãªãºã ã®æåã®å®è£ ã§äœ¿çšãããã¹ãããŒã¿ã§ããã
ãã®ã¯ã©ã¹ã䜿çšããæå·å/埩å·åé¢æ°ã¯æ¬¡ã®ããã«ãªããŸãã
private byte[] A5Encyptor(byte[] msg,byte[] key) { A5Enc a5 = new A5Enc(); int[] frame = new int[1]; bool[] resbits = new bool[msg.Count]; int framesCount = msg.Length / 228; if ((msgbits.Length % 228) != 0) framesCount++; for (int i = 0; i < framesCount; i++) { frame[0] = i; a5.KeySetup(key, frame); bool[] KeyStream = a5.A5(true); for (int j = 0; j < 228; j++) { resbits[i * 228 + j] = msgbits[i * 228 + j] ^ KeyStream[j]; } } return a5.FromBoolToByte(resbits, false); }
ããŒã¿ã®æå·åãšåŸ©å·åãå¯èœã«ããé¢æ°ãã§ããã®ã§ãA5 / 1ã¢ã«ãŽãªãºã ã®è匱æ§ã«ã€ããŠè©±ããŸãããã
ä»æ¥ãGSMæå·åã«å¯Ÿããå€æ°ã®æåããæ»æãç¥ãããŠããããããã¯ãã¹ãŠæ¢ç¥ã®å¹³æã¿ã€ãã®æ»æãããªãã¡ ããŒãå埩ããã«ã¯ãæå·åããããã¬ãŒã ã«å ããŠãæ»æè ããããã®ãã¬ãŒã ã«å¯Ÿå¿ããæå·åãããŠããªãããŒã¿ãç¥ã£ãŠããå¿ èŠããããŸãã äžèŠãããšããããã®ãããªèŠä»¶ã¯å¹»æ³ã«æãããããããŸããããé³å£°ãã©ãã£ãã¯ã«å ããŠãããŸããŸãªã·ã¹ãã ã¡ãã»ãŒãžãéä¿¡ãããGSMæšæºã®ä»æ§ã«ãããçè«çãªã«ããŽãªããã®æ»æã¯å®çšçãªã«ããŽãªã«åé¡ãããŸãã GSMã·ã¹ãã ã¡ãã»ãŒãžã«ã¯éè€ããŒã¿ãå«ãŸããŠãããæ»æè ã«ãã£ãŠäœ¿çšãããå¯èœæ§ããããŸãã ç¹ã«ã2010幎ã«Karsten Nohlãææ¡ããæ¹æ³ã¯ãæå·ããã¹ãã§ãã®çš®ã®ããŒã¿ãæ€çŽ¢ããæ¢ç¥ã®ã·ã¹ãã ã¡ãã»ãŒãžã®ç®çã®æå·ããã¹ããçæããããŒãèŠã€ãããŸã§ãã¬ã€ã³ããŒããŒãã«ã«æ ŒçŽãããããŒã®ããŸããŸãªãªãã·ã§ã³ãåçŽã«ãœãŒãããããšã«åºã¥ããŠããŸãã
ããŒã3ïŒA5 / 1ã¢ã«ãŽãªãºã ã®æ»æ
ãã ããã¬ã€ã³ããŒããŒãã«ãèšç®ããããã«å¿ èŠãªèšå€§ãªãªãœãŒã¹ããªããããããããé¢é£ããç°¡åãªæ»æãå®è£ ããŸãã ãçžé¢æ»æãã
ç§ãã¡ãæ€èšããŠããæ»æã¯ã2002幎ã«Patrik EkdahlãšThomas Johanssonã®2人ã®ç 究è ã«ãã£ãŠåããŠèª¬æãããŸããã
åæåæé ã®å®çŸ©ãããã¬ãžã¹ã¿ã®åæç¶æ ã¯ã»ãã·ã§ã³ããŒKãšãã¬ãŒã çªå·F nã®ç·åœ¢é¢æ°ã§ãããšçµè«ä»ããããšãã§ããŸãã
ãŸãããžã§ãã¬ãŒã¿ã®åºåãããã3ã€ã®ã¬ãžã¹ã¿ãã¹ãŠã®XORçªç®ã®åºåãããã§ããããšãç¥ã£ãŠã次ã®çåŒãæžãããšãã§ããŸãã

ããã§ãs iã¯ãããŒKã®ãããã®ã¿ãããŒãããåŸã«ã¬ãžã¹ã¿ã«ãã£ãŠçæãããã·ãŒã±ã³ã¹ã§ãããããã®f i㯠ããã¬ãŒã çªå·ã®ããããšã¬ãžã¹ã¿ã®xåºåãããã®ã¿ãããŒãããåŸã®ã·ãŒã±ã³ã¹ã§ãã
ãŸããåæåã®å®çŸ©ãããæåã®100ãµã€ã¯ã«ã®éãã¢ã«ãŽãªãºã ããã¢ã€ãã«ãã«æ©èœããããšãããããŸãã åºåãããã¯çæããããåºåã·ãŒã±ã³ã¹ã®æåã®ãããã¯å®éã«ã¯101çªç®ã«çæããããããã§ãã ãããã£ãŠãåã¹ãããã§åã¬ãžã¹ã¿ã®ã·ããã®ç¢ºçã3/4ã§ããããšãèæ ®ãããšã101ã¹ãããåŸãåã¬ãžã¹ã¿ãæ£ç¢ºã«76åã·ãããããšæ³å®ã§ããŸãã ãããã£ãŠãåŒïŒ1ïŒã¯æ¬¡ã®ããã«å€æãããŸãã

ïŒ2ïŒã®å³åŽã«ããŒã¯ãä»ãã


ãªããªã ïŒ3ïŒã®å³åŽã®åŒãç¥ã£ãŠãããšãããŒã·ãŒã±ã³ã¹Sãã€ãŸãåæååŸã®åã¬ãžã¹ã¿ã®76çªç®ã®äœçœ®ã®ç¶æ ã«é¢ããæ å ±ã1ãããååŸãããŸãã ãã®ããã«åäœãããšãäœçœ®102ã§R1ãäœçœ®76ã«çãŸããã¬ãžã¹ã¿ãŒR2ãšR3ãäœçœ®77ã«ç§»åãããããã¬ãžã¹ã¿ãŒã®77çªç®ã®äœçœ®ãªã©ã«é¢ããæ å ±ãååŸã§ããŸãã åèšã§ã64ããããéããŠåæç¶æ ãæ£åžžã«åŸ©å ããå¿ èŠããããŸãã
ãã¡ãããç¶æ³ïŒ76.76.76ïŒã¯éåžžã«äœã確çã§ã¹ããã101ã§æ£ç¢ºã«çºçããŸãããã®ããã«è¡åããããšã«ããå Žåã101ã·ããåŸã«ãããããæ£ç¢ºã«1ã€ã«ãªããŸã§èšå€§ãªæ°ã®ãã¬ãŒã ãæŽçããå¿ èŠããããŸããã¬ãžã¹ã¿ã¯76ããžã·ã§ã³ã¹ã¯ããŒã«ããŸããã å¿ èŠãªãã¬ãŒã æ°ãæžããããã«ãEkdahlãšJohanssonã¯æ¬¡ã®æ¹æ³ãææ¡ããŸããã
ã¬ãžã¹ã¿ãïŒcl 1 ãcl 2 ãcl 3 ïŒåå転ããç¹å®ã®äœçœ®ãæšæž¬ããå¿ èŠã¯ãããŸããã é«ã確çã§ãåã¬ãžã¹ã¿ãåãã¬ãŒã ã®åºåãããã®ééI = [100,140]ã§76ãã102ã«å€ããããšãç¥ãã ãã§ååã§ãã
ãããã£ãŠãåãã¬ãŒã ã«ã€ããŠã確çãèšç®ã§ããŸãã


ã©ãã§

ãããŠãtçªç®ã®ããããã¬ãžã¹ã¿ïŒcl1ãcl2ãcl3ïŒã®äœçœ®ã«ãã£ãŠçæããã確çã瀺ããŸãã
å©çšå¯èœãªãã¬ãŒã ããšã«ïŒ4ïŒãèšç®ããåŸã察æ°ã䜿çšããŠååŸãã確çãå¹³åããŸãã

ïŒ5ïŒ> 0ã®å Žåãs 1 ïŒcl1ïŒâs2ïŒcl2ïŒâs3ïŒcl3ïŒ= 0ããã以å€ã®å Žåã¯s 1 ïŒcl1ïŒâs2ïŒcl2ïŒâs3ïŒcl3ïŒ= 1 ã
æ»æãå®å šã«ã¢ã«ãŽãªãºã ã®åœ¢ã§èª¬æããŸãã
- ééCãéžæããŸããããšãã°ãC = [79.86]
- å€æ°cl 1 ãcl 2 ãcl 3ããèšç®ããåãã¬ãŒã ã«ã€ããŠãééCããã®ãã¹ãŠã®å€ãå®è¡ããŸãïŒ4ïŒ
- ååŸãããã¹ãŠã®å€ã«ã€ããŠãïŒ5ïŒãèšç®ããŸã
- Îã®å€ã«åºã¥ããŠãå€s 1 ïŒcl1ïŒâs2ïŒcl2ïŒâs3ïŒcl3ïŒãéžæããŸã
ãã®ã¢ã«ãŽãªãºã ã®çµæã¯ãs 1 ïŒ79ïŒâs2ïŒ79ïŒâs3ïŒ79ïŒ= 0ã®åœ¢åŒã®512åã®æ¹çšåŒã«ãªãã8ã€ã®æªç¥æ°ã§æ§æãããŸãã ãã®é£ç«æ¹çšåŒãåçŽãªåæã§è§£ããšãåã¬ãžã¹ã¿ã®åæå€ã®8ããããåŸãããŸãã
éé[87ã94]ããã³[95ã102]ã§ã¢ã«ãŽãªãºã ãããã«2åç¹°ãè¿ããšãåã¬ãžã¹ã¿ã®åæç¶æ ã®24ããããåŸãããŸãã ããã§ååã§ãã åã¬ãžã¹ã¿ã101åã¹ã¯ããŒã«ãããšã2çªç®ã®åæåã¹ãããåŸã®ã¬ãžã¹ã¿ã®ç¶æ ãæ£ç¢ºã«ååŸãããŸãã ããŒããããã¬ãžã¹ã¿ã«ããŒãããåŸã ãããŠä»ãå šäœãšããŠããŒã·ãŒã±ã³ã¹å šäœãçæã§ããŸãã
CïŒã¯ã©ã¹A5æ»æ
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace A5project { class A5attack { private double[] factorials = new double[150]; // Pr(cl1,cl2,cl3 v) private double PinVth(int cl1, int cl2, int cl3, int v) { double y=0; double x = 0; double z = 0; double w = 0; if((v - (v - cl1) - (v - cl2) - (v - cl3))>=0) y=factorials[v - (v - cl1) - (v - cl2) - (v - cl3)]; else y=1; if ((v - cl1) >= 0) x = factorials[v - cl1]; else x = 1; if ((v - cl3) >= 0) z = factorials[v - cl3]; else z = 1; if ((v - cl2) >= 0) w = factorials[v - cl2]; else w = 1; double a = factorials[v] / (x * factorials[v - (v - cl1)]); double b = factorials[v - (v - cl1)] / (w * factorials[v - (v - cl1) - (v - cl2)]); double c = factorials[v - (v - cl1) - (v - cl2)] / (z * y); double d = Math.Pow(4, v); return (a * b * c) / d; } private double factorial(int x) { double result=1; for (int i = x; i > 1; i--) result = result * i; return result; } private bool[] reg = new bool[19]; private bool[] reg2 = new bool[22]; private bool[] reg3 = new bool[23]; // , public void KeySetup(int[] frame) { for (int i = 0; i < 19; i++) reg[i] = false; for (int i = 0; i < 22; i++) reg2[i] = false; for (int i = 0; i < 23; i++) reg3[i] = false; BitArray FrameBits = new BitArray(frame); for (int i = 0; i < 22; i++) { clockall(); reg[0] = reg[0] ^ FrameBits[i]; reg2[0] = reg2[0] ^ FrameBits[i]; reg3[0] = reg3[0] ^ FrameBits[i]; } } // private void clock() { bool majority = ((reg[8] & reg2[10]) | (reg[8] & reg3[10]) | (reg2[10] & reg3[10])); if (reg[8] == majority) clockone(reg); if (reg2[10] == majority) clocktwo(reg2); if (reg3[10] == majority) clockthree(reg3); } private bool[] clockone(bool[] RegOne) { bool temp = false; for (int i = RegOne.Length - 1; i > 0; i--) { if (i == RegOne.Length - 1) temp = RegOne[13] ^ RegOne[16] ^ RegOne[17] ^ RegOne[18]; RegOne[i] = RegOne[i - 1]; if (i == 1) RegOne[0] = temp; } return RegOne; } private bool[] clocktwo(bool[] RegTwo) { bool temp = false; for (int i = RegTwo.Length - 1; i > 0; i--) { if (i == RegTwo.Length - 1) temp = RegTwo[20] ^ RegTwo[21]; RegTwo[i] = RegTwo[i - 1]; if (i == 1) RegTwo[0] = temp; } return RegTwo; } private bool[] clockthree(bool[] RegThree) { bool temp = false; for (int i = RegThree.Length - 1; i > 0; i--) { if (i == RegThree.Length - 1) temp = RegThree[7] ^ RegThree[20] ^ RegThree[21] ^ RegThree[22]; RegThree[i] = RegThree[i - 1]; if (i == 1) RegThree[0] = temp; } return RegThree; } private void clockall() { reg = clockone(reg); reg2 = clocktwo(reg2); reg3 = clockthree(reg3); } // , cl1, cl2 cl3 public bool Oj(int cl1,int cl2, int cl3) { for (int i = 0; i < cl1; i++) { clockone(reg); } for (int i = 0; i < cl2; i++) { clocktwo(reg2); } for (int i = 0; i < cl3; i++) { clockthree(reg3); } return (reg[18] ^ reg2[21] ^ reg3[22]); } // , XOR public double Pj(int cl1, int cl2, int cl3, int j, bool[] frame) { double result = 0; double rightPart = 0; int[] framenumb=new int[1]{j}; KeySetup(framenumb); bool[] tempReg = new bool[19]; bool[] tempReg2 = new bool[22]; bool[] tempReg3 = new bool[23]; Array.Copy(reg, tempReg, 19); Array.Copy(reg2, tempReg2, 22); Array.Copy(reg3, tempReg3, 23); bool FramesBit = Oj(cl1, cl2, cl3); for (int i = 100; i < 100 + 50; i++) { Array.Copy(tempReg, reg, 19); Array.Copy(tempReg2, reg2, 22); Array.Copy(tempReg3, reg3, 23); double temp = PinVth(cl1, cl2, cl3, i); rightPart += temp; if((FramesBit^frame[i-100])==false) temp=temp*1; else temp=0; result += temp; } result = result + ((1 - rightPart) / 2); return result; } // , cl1, cl2, cl3 0. >0 0 // , 1 public double LikehoodRatio(int cl1, int cl2, int cl3, bool[] keystream) { double result = 0; for (int i = 0; i < keystream.Length/228; i++) { bool[] temp=new bool[228]; Array.Copy(keystream,i*228,temp,0,228); double x=Pj(cl1, cl2, cl3, i, temp); result = result + Math.Log(( x/ (1 - x))); } return result; } public bool FindKeyBit(int cl1, int cl2, int cl3, bool[] keystream) { for (int i = 0; i < 150; i++) factorials[i] = factorial(i); if (LikehoodRatio(cl1, cl2, cl3, keystream) >= 0) return false; else return true; } // public bool[][] checkSol(byte[] first, byte[] second, byte[] third) { byte[] newFirst = new byte[3]; newFirst[0] = first[0]; newFirst[1] = second[0]; newFirst[2] = third[0]; byte[] newSecond = new byte[3]; newSecond[0] = first[1]; newSecond[1] = second[1]; newSecond[2] = third[1]; byte[] newThird = new byte[3]; newThird[0] = first[2]; newThird[1] = second[2]; newThird[2] = third[2]; bool[] firstArr1 = new BitArray(newFirst).Cast<bool>().ToArray().Reverse().ToArray(); bool[] firstArr = new bool[19]; Array.Copy(firstArr1, 5, firstArr, 0, 19); bool[] secondArr1 = new BitArray(newSecond).Cast<bool>().ToArray().Reverse().ToArray(); bool[] secondArr = new bool[22]; Array.Copy(secondArr1, 2, secondArr, 0, 22); bool[] thirdArr1 = new BitArray(newThird).Cast<bool>().ToArray().Reverse().ToArray(); bool[] thirdArr = new bool[23]; Array.Copy(thirdArr1, 1, thirdArr, 0, 23); for (int i = 0; i < 101; i++) { BackClockone(firstArr); } for (int i = 0; i < 101; i++) { BackClocktwo(secondArr); } for (int i = 0; i < 101; i++) { BackClockthree(thirdArr); } bool[][] result = new bool[3][]; result[0] = firstArr; result[1] = secondArr; result[2] = thirdArr; return result; } private void BackClockone(bool[] RegOne) { bool temp = false; for (int i = 0; i < RegOne.Length-1; i++) { if (i == 0) temp = RegOne[0]; RegOne[i] = RegOne[i+1]; if (i == (RegOne.Length-2)) RegOne[RegOne.Length - 1] = temp ^ RegOne[13] ^ RegOne[16] ^ RegOne[17]; } } private void BackClocktwo(bool[] RegTwo) { bool temp = false; for (int i = 0; i < RegTwo.Length-1; i++) { if (i == 0) temp = RegTwo[0]; RegTwo[i] = RegTwo[i + 1]; if (i == (RegTwo.Length-2)) RegTwo[RegTwo.Length - 1] = temp ^ RegTwo[20]; } } private void BackClockthree(bool[] RegThree) { bool temp = false; for (int i = 0; i < RegThree.Length-1; i++) { if (i == 0) temp = RegThree[0]; RegThree[i] = RegThree[i + 1]; if (i == (RegThree.Length-2)) RegThree[RegThree.Length - 1] = temp ^ RegThree[7] ^ RegThree[20] ^ RegThree[21]; } } } }
次ã®ããã«FindKeyBité¢æ°ã䜿çšããŸãã
private bool[] attack() { bool[] keypart=new bool[512]; int count = 0; A5attack tryattack = new A5attack(); for(int i=79; i<87;i++) for(int j=79; j<87; j++) for (int k = 79; k < 87; k++) { bool temp=tryattack.FindKeyBit(i, j, k, keystream); int time = finish - start; keypart[count] = temp; count++; } return keypart; }
XORããŒããããäœçœ®79ããäœçœ®86ã«æžã蟌ãŸããŠãã512å€ã®é åãååŸããŸãã
åã¬ãžã¹ã¿ãã24ããããã¹ãŠãåä¿¡ãããããããã€ãé åã«å€æãããããœãªã¥ãŒã·ã§ã³ã確èªããŸãã
Private void checkSolution() { A5attack LetsAttack = new A5attack(); int[] testframe = new int[1] { 0 }; bool[][] startState = LetsAttack.checkSol(first, second, third); A5Enc a5check = new A5Enc(startState); bool[] TempFrame = new bool[228]; a5check.KeySetup(testframe); TempFrame = a5check.A5(true); for (int l = 0; l < 228; l++) { find = true; if (keystream[l] != TempFrame[l]) { find = false; break; } } }
åä¿¡ãããã¬ãŒã ãæ¢ç¥ã®ããŒã¹ããªãŒã ã®æåã®ãã¬ãŒã ãšäžèŽããå Žåãæ»æã¯æåããã¢ã«ãŽãªãºã A5 / 1ã®ã»ãã·ã§ã³ããŒãéããŸããã
ããŒã4ïŒæçµ
èŠçŽãããšã説æããæ»æã¯æåã®ãã®ãããªæ»æã®1ã€ã§ããããšã«æ³šæããŠãã ããã æãé«åºŠãªãã®ã§ã¯ãåèš2000ãã¬ãŒã ïŒ9ç§ã®äŒè©±ïŒãã90ïŒ ã®ç¢ºçã§ã»ãã·ã§ã³ããŒãéãããšãã§ããŸãã ãããã£ãŠãçžé¢æ»æã¯çè«äžã ãã§ãªããå®éã«ãéåžžã«æ·±å»ãªè åšã§ãã
æç®ãšåèæç®
- ãã«ã·ã³ã»ãªã©ãã¹ãã ãGSMãããã¯ãŒã¯ã®ã»ãã¥ãªãã£ãã
- ãããªãã¯ã»ãšã¯ããŒã«ãšããŒãã¹ã»ãšãã³ãœã³ã ãA5 / 1ã«å¯Ÿããå¥ã®æ»æã
- ã«ã«ã¹ãã³ã»ããŒã« ãé»è©±ãã©ã€ãã·ãŒã®æ»æãã
- ããŒã¯ã»ããªã»ããã€ã¢ã³ã»ãŽãŒã«ãããŒã°ãããããã»ã¯ã°ããŒã A5 / 1ã®æè²çå®è£ ã
PSïŒäœè ã¯ãEladã®Barkanã®äœåã誰ããå ±æããŠããããæè¬ããŸãã ãšãªã»ããã ïŒ2005ïŒã ãæ¡ä»¶ä»ãæšå®éïŒA5 / 1ãžã®å¹æçãªæ»æã æåŸã®éšåã§è¿°ã¹ãæ»æã«ã€ããŠèª¬æããŸãã
UPDïŒãŠãŒã¶ãŒwhitequarkã®ãããã§ããã¹ãŠã®è³ªåãåé€ãããŸãã ã