歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

金誠卡算法分析及自制硬件測試設備

來源:本站整理 作者:佚名 時間:2019-03-30 TAG: 我要投稿

一、引言
金誠卡這個東西說熟悉的人很熟悉,說不熟悉的人壓根就沒見過,國內有很多高校都用這款水卡。 這款水卡有兩個版本,下圖是舊版本的金誠卡(非全加密),另一個版本長的比這個丑(全加密)。雖然全加密和非全加密感覺安全性改善了很多,但是由于其加密密鑰,加密方法并沒有變化所以還是可以通過舊卡分析出來算法。當然完全可以通過 mfcuk 得到完整的密鑰,實現通用修改畢竟算法并沒有改變。

二、卡內數據結構一覽
首先我們看一下舊卡的(非全加密卡),通過幾張卡對比就能發現是一卡一密。

舊卡是12扇區有數據,新卡的話也是12扇區有數據,但是在別的扇區也增加了一些個人信息的數據(估計是如果有人破解了好抓人)。可以看到只有12扇區的KEYA不是默認密鑰,其余均為默認密鑰。于是我們學校好多人就動起了歪心思。畢竟acr122u這種設備已經泛濫,也不管三七二十一就克隆寫入到白卡開始賣(也不分析下卡的數據),然后一個個全被抓(該!)。而新卡為全加密,數據的扇區和塊均保持不變。但是密鑰的算法還是保持不變的。
Ps.上面這個數據是我在網上收集的,還修改了涉及到學校代碼的信息。
三、金錢區塊算法分析
12扇區0塊為金錢值,通過最沒有技術含量的對比法分析哪個位置是金錢的。所以可以得到第5、6、7組 是明顯變化的。所以判斷這三個和金錢有關。
01 15 02 00 21 86 B1 F1 FFFFFFFFFFFFFFFF
01 15 02 00 21 85 B2 F1 FFFFFFFFFFFFFFFF
01 15 02 00 21 84 B3 F1 FFFFFFFFFFFFFFFF
但是之前還有01 15 02 這三個代碼,考研報名的時候就經常見到這個代碼(本文代碼是假的)。這擺明了就是學校的代碼嘛。合著水卡的信息還包含學校代碼。
21 86從十六進制轉換成10進制,竟然和卡里的錢數*100后一樣,所以5 6組就是金錢的位置。那么第七組就是校檢位了,防止篡改數據。想想Ic卡最常見的校檢方法,結果還是2位。于是我推測是每一組每一組進行異或運算。果真01^15^02^00^21^86的結果是B1。原來學校代碼的作用是這個啊,防止跨校買水么。于是此階段水卡的金錢扇區就解密了。
四、一卡一密解密
這部分不敢太詳細說,怕教壞別人。但是通過金錢區塊的分析得到生成校檢位的是異或運算。那么KEYA是不是也是通過異或得到的?還有為什么KEY結尾四位都是固定的?前面8位變化?uid也是8位?是不是KEYA是根據UID計算出來的+固定值?異或好像是可逆運算啊!這段就說到這里了。
五、大頭來了,自制硬件設備
有了KEYA計算規則,還有校檢生成方法。可以完美的對任何一張水卡進行充值了(包括新卡,因為除了全加密了其余并沒有改變)。
硬件設備包括:
0.96的OLED一個 (i2c)
esp8266nodemcu v1.0 的開發版一個
Rc522模塊一個 (spi)
其實本來想用arduino的,但是手頭有個不用的esp8266就干脆用上了,把它看作arduino就行了。接線按照下圖接入spi和i2c就行了,沒啥難的。(主要是我畫的電路圖太丑了 拿不出手)下圖是esp8266的引腳定義,如果你也用esp8266那么可以參照這個。

我自己接完之后長這樣。背面我就不拍照了,太丑了,焊工渣死。

代碼如下,請注意看注釋:
#include
#include
#include
#include
#include
#define SDA_PIN          4  //定義oled的data
#define SCL_PIN          5  //定義oled的clock
#define RST_PIN         10  // 定義rc522的rst
#define SS_PIN          15  //定義rc522的ss   (其余的就參照spi和i2c對應的引腳就行了 rc522的RQ懸空 不用接)
MFRC522 mfrc522(SS_PIN, RST_PIN);   //  創建MFRC522實例
Adafruit_ssd1306syp display(SDA_PIN, SCL_PIN); //創建oled顯示實例
MFRC522::MIFARE_Key keyA;
/**
   Initialize.
*/
void setup() {
  delay(1000);
  display.initialize();
  Serial.begin(9600); 
  while (!Serial);    
  SPI.begin();        
  mfrc522.PCD_Init();
  pinMode(D0, OUTPUT);  //這個是設置板載的LED為輸出端口
  digitalWrite(D0, HIGH); //這個LED高電平亮低電平滅 所以拉高。
  display.setTextSize(3); //歡迎界面
  display.setTextColor(WHITE);
  display.println("WELCOM");
  display.update();
  delay(3000);
}
/**
   Main loop.
*/
void loop() {
  display.clear();//清空顯示
  //尋找新卡
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }
  //選擇一個卡
  if ( ! mfrc522.PICC_ReadCardSerial())
  {

[1] [2]  下一頁

【聲明】:黑吧安全網(http://www.zjtpzs.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        神秘东方电子游艺