---
title: 恢复 MIFARE Classic 密钥
slug: zero/zh/nfc/mfkey32
description: 了解如何在能否接触卡片的不同情况下执行 MFKey32 攻击，以及无需接触读卡器即可计算密钥的仅用卡片攻击
image: https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/eDrdiuOZXlq8KD0BFWhza_recovering-mifare-classic-keys-prev-1-zh.png
docTags: 
createdAt: 2023-01-24T12:34:52.000Z
---

![](https://api.archbee.com/api/optimize/3GUDYkC5JgUWgo6RW8piO-LcbRRk6BTxstYEl2WJYmP-20241025-092032.png)

如果使用 [Read](https://docs.flipper.net/zero/zh/nfc/read) 功能无法读取 MIFARE Classic® 卡片的全部扇区，或者已读取的扇区不足以获得访问权限，你可以尝试利用 MIFARE Classic NFC 卡片的漏洞来获取访问权限。

本页将介绍如何在能否接触卡片的不同情况下执行 MFKey32 攻击，以及无需接触读卡器即可计算密钥的仅用卡片攻击。

***

# MFKey32 攻击

MFKey32 攻击[利用了](https://www.cs.bham.ac.uk/~garciaf/publications/Dismantling.Mifare.pdf) Crypto-1 加密算法中的弱点。MFKey32 是一种工具/算法的名称，用于从读卡器的 Crypto-1 nonce（一次性随机数）对中恢复 MIFARE Classic 密钥。其原理是恢复 Crypto-1 线性反馈移位寄存器的初始状态，该状态中包含密钥。

## 同时能接触读卡器和卡片时

执行 MFKey32 攻击的最佳方式是同时能接触到卡片，即使并非所有扇区都被读取也可以。获得读卡器的密钥后，你就能读取卡片更多的扇区，这些数据可能已足以获得访问权限。

要获取读卡器的密钥并读取 MIFARE Classic 卡片，请执行以下操作：

:::::WorkflowBlock
:::WorkflowBlockItem
用 Flipper Zero [读取并保存卡片](https://docs.flipper.net/zero/zh/nfc/read)。
:::

:::WorkflowBlockItem
转到 **Main Menu → NFC → Saved → 已保存卡片的名称 → Extract MF Keys**。Flipper Zero 会模拟这张卡片以执行 MFKey32 攻击。

![](https://api.archbee.com/api/optimize/3StCFqarJkJQZV-7N79yY/aRTJ3BCig7LCW4CH1YDNL_monosnap-miro-2023-08-03-19-50-38.jpg "Flipper Zero 已准备好收集读卡器的 nonce")
:::

:::WorkflowBlockItem
如下图所示，用 Flipper Zero **触碰读卡器**。靠近读卡器时，Flipper Zero 会收集读卡器的 nonce。根据读卡器的不同，你可能需要多次触碰，直到收集齐全部 10 个 nonce。

在 Flipper Zero 屏幕上，每次触碰读卡器后，已收集的 nonce 对数量都应当增加。如果数量没有增加，说明读卡器并未尝试认证 Flipper Zero 模拟的卡片。

![](https://api.archbee.com/api/optimize/3GUDYkC5JgUWgo6RW8piO-nh8jrj31z6hOnHThNEcw7-20241107-112652.png "要收集 nonce，请用 Flipper Zero 触碰读卡器，然后移开，如此反复")
:::

:::WorkflowBlockItem
按 **确认键**%ok% 把收集到的 nonce 对保存到 microSD 卡。收集到所需数量的 nonce 对后，屏幕会显示 **Completed** 提示。之后，你可以按 **确认键**%ok% 查看捕获到的数据，包括数据所属的扇区和密钥。

![](https://api.archbee.com/api/optimize/3StCFqarJkJQZV-7N79yY/sR4_86WJB_5haA4HoEwHc_mfkey32noncepairscollected.jpg "收集到 nonce 后，可以把它们保存到 microSD 卡")
:::

::::WorkflowBlockItem
从收集到的 nonce 中**恢复密钥**。可以通过以下方式完成：

**Flipper Mobile App**

1. 在手机上运行 [Flipper Mobile App](https://docs.flipper.net/zero/zh/mobile-app) 并与 Flipper Zero 同步。
2. 转到 **Tools → Mfkey32 (Extract MF Keys)**。



**Flipper Lab**

1. 使用 USB-C 数据线将 Flipper Zero 连接到电脑。
2. 在电脑上访问 [lab.flipper.net](https://lab.flipper.net/)。
3. 转到 **NFC tools**，然后点击 **GIVE ME THE KEYS** 按钮。



**MFKey 应用**

:::Iframe{iframeHeight="0" code="<div class=&#x22;info flipper-callout&#x22;>&#xA;    <div class=&#x22;callout-header&#x22;></div>&#xA;要使用该功能，请从 Apps Catalog 向 Flipper Zero 安装 <a href=&#x22;https://lab.flipper.net/apps/mfkey&#x22; onclick=&#x22;next.router.push('https://lab.flipper.net/apps/mfkey')&#x22;><u>MFKey</u></a> 应用。&#xA;<br>&#xA;<br>&#xA;了解 <a href=&#x22;https://docs.flipper.net/zero/zh/apps&#x22; onclick=&#x22;next.router.push('https://docs.flipper.net/zero/zh/apps')&#x22;><u>Apps Catalog</u></a> 的更多信息。&#xA;</div>"}

:::

如果手边没有智能手机或电脑，你也可以只用 Flipper Zero 从收集到的 nonce 中恢复密钥。请注意，受设备算力限制，恢复密钥需要几分钟时间。

1. 在 Flipper Zero 上转到 **Main Menu → Apps → NFC**。
2. 运行 **MFKey** 应用，然后按 **确认键**%ok%。

恢复出的密钥会显示在屏幕上，之后可以添加到 **User dictionary** 中。在某些情况下，由于读卡器无法正确识别 Flipper Zero 的模拟，可能无法从 nonce 中恢复出密钥。
::::

:::WorkflowBlockItem
把新密钥添加到 User dictionary 后，请**重新读取卡片**。已找到的密钥数和已读取的扇区数可能会增加，这说明已经收集到所需数据。
:::

:::WorkflowBlockItem
[模拟该卡片](https://docs.flipper.net/zero/zh/nfc/read#nfc-1)，并将 Flipper Zero 贴近读卡器以获得访问权限。

![](https://api.archbee.com/api/optimize/3GUDYkC5JgUWgo6RW8piO-r7Ac9hzhZeg8dR59XFOv--20241107-112730.png "模拟 NFC 卡片时，请将 Flipper Zero 贴近读卡器")
:::
:::::

:::Iframe{iframeHeight="0" code="<div class=&#x22;warning flipper-callout&#x22;>&#xA;    <div class=&#x22;callout-header&#x22;></div>&#xA;    如果模拟的卡片打不开门，请重复第 1 到第 6 步，因为你的读卡器可能会依次读取多个扇区。<br><br>&#xA;    如果重复第 1 到第 6 步后，Flipper Zero 读取到的卡片密钥数和扇区数都没有增加，说明读卡器与卡片不属于同一系统，或者该读卡器不受 MFKey32 攻击影响。  &#xA;</div>"}

:::

## 只能接触读卡器时

即使无法接触卡片，你也可以尝试获取读卡器的密钥，并把它们添加到 **User dictionary** 中以扩充字典。

要获取并保存读卡器的密钥，请执行以下操作：

::::WorkflowBlock
:::WorkflowBlockItem
转到 **Main Menu → NFC → Extract MF Keys**。Flipper Zero 会模拟一张 NFC 卡片以执行 MFKey32 攻击。

![](https://api.archbee.com/api/optimize/3StCFqarJkJQZV-7N79yY/daUwKKVW4HBirdmwgk7tQ_monosnap-miro-2023-08-03-19-51-29.jpg "Flipper Zero 已准备好收集读卡器的 nonce")
:::

:::WorkflowBlockItem
如下图所示，用 Flipper Zero **触碰读卡器**。靠近读卡器时，Flipper Zero 会收集读卡器的 nonce。根据读卡器的不同，你可能需要多次触碰，直到收集齐全部 10 个 nonce。

在 Flipper Zero 屏幕上，每次触碰读卡器后，已收集的 nonce 对数量都应当增加。如果数量没有增加，说明读卡器并未尝试认证 Flipper Zero 模拟的卡片。

![](https://api.archbee.com/api/optimize/3GUDYkC5JgUWgo6RW8piO-nGTWC9NTOp_sNkrlmdgce-20241107-112752.png "要收集 nonce，请用 Flipper Zero 触碰读卡器，然后移开，如此反复")
:::

:::WorkflowBlockItem
按 **确认键**%ok% 把收集到的 nonce 对保存到 microSD 卡。收集到所需数量的 nonce 对后，屏幕会显示 **Completed** 提示。之后，你可以按 **确认键**%ok% 查看捕获到的数据，包括数据所属的扇区和密钥。

![](https://api.archbee.com/api/optimize/3StCFqarJkJQZV-7N79yY/EE9Cqc28ze8WOSjyqvNkK_mfkey32noncepairscollected.jpg "收集到 nonce 后，可以把它们保存到 microSD 卡")
:::

:::WorkflowBlockItem
从收集到的 nonce 中**恢复密钥**。可以通过以下方式完成：

**Flipper Mobile App**

1. 在手机上运行 [Flipper Mobile App](https://docs.flipper.net/zero/zh/mobile-app) 并与 Flipper Zero 同步。
2. 转到 **Tools → Mfkey32 (Extract MF Keys)**。



**Flipper Lab**

1. 使用 USB-C 数据线将 Flipper Zero 连接到电脑。
2. 在电脑上访问 [lab.flipper.net](https://lab.flipper.net/)。
3. 转到 **NFC tools**，然后点击 **GIVE ME THE KEYS** 按钮。



**MFKey 应用**

如果手边没有智能手机或电脑，你也可以只用 Flipper Zero 从收集到的 nonce 中恢复密钥。请注意，受设备算力限制，恢复密钥需要几分钟时间。

1. 在 Flipper Zero 上转到 **Main Menu → Apps → NFC**。
2. 运行 **MFKey** 应用，然后按 **确认键**%ok%。

恢复出的密钥和扇区编号会显示在屏幕上，之后可以添加到 **User dictionary** 中。在某些情况下，由于读卡器无法正确识别 Flipper Zero 的模拟，可能无法从 nonce 中恢复出密钥。
:::
::::

***

# 仅用卡片的攻击

:::Iframe{iframeHeight="0" code="<div class=&#x22;info flipper-callout&#x22;>&#xA;    <div class=&#x22;callout-header&#x22;></div>&#xA;该功能目前处于 Beta 阶段，可能无法正常工作，甚至可能导致设备卡死。&#xA;</div>"}

:::

这类攻击可以直接在卡片上进行，利用的是 [MIFARE Classic 卡片的漏洞](https://eprint.iacr.org/2024/1275.pdf)。攻击目标是恢复卡片的数据和密钥，从而可以克隆和模拟该卡片。

Flipper Zero 会根据卡片类型和可用数据执行多种仅用卡片的攻击：nested attack、static nested attack 和 hardnested attack。这些攻击从读取卡片阶段（NFC → Read）开始。如果读取失败，Flipper Zero 会收集并保存卡片 nonce，然后运行 MFKey 应用计算密钥。计算出的密钥会被添加到 MIFARE Classic 密钥的 User dictionary 中。

:::Iframe{iframeHeight="0" code="<div class=&#x22;warning flipper-callout&#x22;>&#xA;    <div class=&#x22;callout-header&#x22;></div>&#xA;要继续操作，请从 Apps Catalog 向 Flipper Zero 安装 <a href=&#x22;https://lab.flipper.net/apps/mfkey&#x22; onclick=&#x22;next.router.push('https://lab.flipper.net/apps/mfkey')&#x22;><u>MFKey</u></a> 应用。&#xA;<br>&#xA;<br>&#xA;了解 <a href=&#x22;https://docs.flipper.net/zero/zh/apps&#x22; onclick=&#x22;next.router.push('https://docs.flipper.net/zero/zh/apps')&#x22;><u>Apps Catalog</u></a> 的更多信息。&#xA;</div>"}

:::

要获取卡片密钥并模拟卡片，请执行以下操作：

::::WorkflowBlock
:::WorkflowBlockItem
读取卡片以收集 nonce。

![](https://api.archbee.com/api/optimize/3StCFqarJkJQZV-7N79yY/OWYScuUkkO9PVij6WpzuK_not-all-keys.jpg)
:::

:::WorkflowBlockItem
转到 **More → Crack nonces in MFKey32**。
:::

:::WorkflowBlockItem
按 **Save** 保存卡片。
:::

:::WorkflowBlockItem
按 **Run** 打开 [MFKey](https://lab.flipper.net/apps/mfkey) 应用。
:::

:::WorkflowBlockItem
按 **确认键**%ok% 开始计算。
:::

:::WorkflowBlockItem
等待从收集到的 nonce 中计算出卡片密钥——**这需要几分钟时间**。之后，新密钥会自动添加到 User dictionary 中。
:::

:::WorkflowBlockItem
重新读取卡片，解锁此前受该密钥保护的扇区。
:::

:::WorkflowBlockItem
[模拟该卡片](https://docs.flipper.net/zero/zh/nfc/read#nfc-1)，并将 Flipper Zero 贴近读卡器以获得访问权限。

![](https://api.archbee.com/api/optimize/3GUDYkC5JgUWgo6RW8piO-r7Ac9hzhZeg8dR59XFOv--20241107-112730.png "模拟 NFC 卡片时，请将 Flipper Zero 贴近读卡器")
:::
::::

## 如果 MFKey 应用无法计算出密钥

- 同时长按 **左方向键**%left% 和 **返回键**%back% 5 秒重启 Flipper Zero。
- 删除存放已收集 nonce 的文件 `/ext/nfc/.nested.log`，然后重新收集 nonce 并运行 MFKey。
- 删除存放用户密钥的文件 `/ext/nfc/assets/mf_classic_dict_user.nfc`，然后重新收集 nonce 并运行 MFKey。**此操作将永久删除所有用户密钥。**&#x5982;果你希望保留这些密钥，请在删除前把该文件下载到电脑备份。

***

MIFARE 和 MIFARE Classic 是 NXP B.V. 的注册商标。
