你敲鍵盤的聲音洩露了你的內容 | 附開原始碼

沒想到吧,有一天你會被鍵盤出賣。
對,就是你每日敲擊的鍵盤。當指尖在鍵盤上跳躍,清脆的噼啪聲此起彼落時,你輸入的所有信息,包括那些情真意切的詞句,那些不欲人知的心事,還有你的網路賬戶、銀行密碼……全都被它洩露了。
鍵盤,還能被黑???
今天,一個叫做 Keytap 的“黑科技”在國外火了。Keytap通過監聽你敲擊鍵盤的聲音,就能還原出你輸入的內容。
而且,只需要通過你電腦裡的麥克風,就能完成聲波採集的任務。
在一段釋出於網上的Demo裡,Keytap作者展示了在iMac+Filco機械鍵盤環境中,這個演算法的優秀程度,請看:
四步偷窺大法
搭建這樣一個“偷窺”打字的模型並不難,Keytap演算法也已經開源了。跟著做,只要如下四步:
一是,收集訓練資料;
二是,搭建預測模型,學習一下資料;
三是,檢測出有人在敲鍵盤;
四是,檢測出ta在打什麼字。
收集訓練資料
Keytap收集資料時,只保留每次敲擊前後75-100毫秒的音訊。
這就是說,並非連續取樣, 兩次敲擊之間 有一部分是忽略的。
這種做法是會犧牲一些資訊量的。
從敲下按鍵,到程式受到指令,這之間有隨機延時,與硬體和軟體都有關係。
比如,按下g鍵的完整波形長這樣:

看影象可以發現,敲擊時出現了一個峰值,而再過大約150毫秒,又有一個按鍵被抬起的小峰值。
這樣說來,100毫秒之外的資訊也可能有用,不過這裡為了簡便就忽略了。
最終,收集到的資料長這樣:

除此之外,侷限性還在於,如果兩次按鍵之間相隔不久,後者落在前者的後75毫秒之內,那資料可能就有些混雜了。
搭個預測模型
這個部分是最能發揮創造力的部分。Keytap用了一個非常簡單的方法,分為三步:
1.把收集到的波形的峰值對齊。這樣可以避免延時帶來的影響。
2.基於相似度指標 (Similarity Metric) ,更精細地對齊波形。
需要更精確的對齊方法,是因為有時候峰值未必是最好的判斷依據。
那麼,可不可以跳過峰值對齊呢?
之所以第2步之前要先做第1步,是因為相似度指標的計算很佔CPU。而第1步可以有效縮小對齊視窗 (Alignment Window) ,減少計算量。
3.對齊後,做簡單加權平均。權重也是用相似度指標來定義的。
完成第3步之後,每一個按鍵都會得出一個平均波形 (a Single Averaged Waveform) ,用來和實時捕捉的資料做 比對 。
Keytap用的 相似度指標 是 互相關 (Cross Correlation, CC) ,長這樣:

這裡,Ai和Bi都是某個按鍵的波形樣本,比對就在它們之間進行。CC值越高,表示兩者越相似。
當然,也可以用其他相似度指標來做。
順便一說,兩次按鍵之間的 間隔時長 ,其實也可以用來預測的,但開發者怕麻煩就省略了,勇敢的少年可以去原始碼基礎上自行實驗。
檢測出在敲鍵盤
平均波形和比對標準都有了,可是麥克風實時收錄的聲音連綿不絕,該和哪一段來比對呢?
這就需要從連續的音訊裡,找到敲擊鍵盤的聲音。
Keytap用了一個非常簡單的閾值方法,在原始音訊裡監測敲擊動作:
按下去的時候,會有一個大大的峰值,這就是偵測目標。
不過,這個閾值不是固定的,是自適應 (Adaptive) 的:根據過去數百毫秒之內的平均樣本強度來調整的。

檢測打了什麼字
當系統發現有人在敲鍵盤,就用相似度指標來測到底按了哪個鍵,CC值最高的就是答案。方法就像上文說的那樣。
現在,程式碼實現已經 開源 了,傳送門見文底。
不過,作者在部落格中說,這個方法目前只有 機械鍵盤 適用。
“薯片間諜”
聽音識字的研究不止這一個,去年一篇Don’t Skype & Type!Acoustic Eavesdropping in Voice-Over-IP的論文,也提出了Skype & Type(S&T)鍵盤聲音識別演算法。
和這個研究類似,根據網路電話Skepe中傳出的打字按鍵聲音,在瞭解了被測者的打字風格和裝置型別後,系統能復原敲下了什麼。

整個演算法搭建過程只有三步:收集資訊、資料處理與資料分類。
研究人員事先收集語音電話中鍵盤敲擊聲,將這些聲音分為兩類,即按下聲與鬆開回彈聲,隨後提取它們的特徵。
當聽到鍵盤聲時,演算法先識別裝置型別,再去識別為鍵盤中的哪個鍵。和Keytap不同的是,S&T也能適用於非機械鍵盤了。
研究人員表示,在預測的最可能的前5個字母中,包含正確字母的準確率達到了91.7%。
這篇論文發表在ACM亞洲計算機和通訊安全大會(ASIACCS 2017)上,地址:
https://www.math.unipd.it/~dlain/papers/2017-skype.pdf
推測人類講了什麼,AI需要甚至只是 一包薯片 。
什麼,覺得太離譜了?Naive。
MIT、微軟和Adobe開發的這種看似天方夜譚的演算法,只需高速相機透過隔音玻璃,拍攝出薯片袋的振動,演算法就會判斷說話人是男是女,甚至還原出說了什麼。

△對,就是這種生活中隨處可見的薯片
研究人員表示,聲音傳播時觸碰到周圍的物體,會震動形成一股微妙的視覺訊號,肉眼無法識別,但高速相機(每秒幀數2000~6000 FPS)可以敏銳捕捉。

除了薯片袋子,研究人員還用鋁箔、水杯甚至植物盆栽進行了試驗,效果“一如既往的好”。

這不是野生研究,相關論文The Visual Microphone:Passive Recovery of Sound from Video還登上了2014年的Siggraph計算機圖形學大會。
論文地址(注意科學前往):
http://t.cn/EyZEZYI
傳送門
方法雖多,如果想自己動手搞一個,這些Keytap相關資源還是要收好:
部落格地址:
https://ggerganov.github.io/jekyll/update/2018/11/30/keytap-deion-and-thoughts.html
程式碼地址:
https://github.com/ggerganov/kbd-audio
Demo:
https://ggerganov.github.io/jekyll/update/2018/11/24/keytap.html
噓,掩好口鼻,輕聲撤退。