
玩射频的人肯定绕不开315MHz和125kHz这两个频率一个是远距离遥控的代表一个是近距离识别的代表。当它们同时出现在同一个场景里绝大多数情况下说的就是汽车钥匙——RKE遥控无钥匙进入走315MHz或433MHzPKE被动无钥匙进入则用125kHz低频做唤醒和定位再用UHF高频做双向认证。最近又有读者私信问我到底能不能用Arduino模拟汽车钥匙的RKE/PKE信号这个问题我必须先把话说清楚现代汽车钥匙不是简单发一串码就能打开的而且任何针对他人车辆的信号模拟、重放行为都越过了法律和道德的底线。但把RKE/PKE背后的物理层原理、协议设计拆开来看再用Arduino对自有设备做合法实验这不仅是安全的而且是非常有价值的射频入门路径。这篇文章就把从315MHz到125kHz的完整逻辑讲清楚。1. RKE和PKE的高下之分从远程锁车到被动解锁1.1 一句话搞清楚RKE和PKERKERemote Keyless Entry就是我们熟知的遥控钥匙。按下钥匙上的按钮钥匙内置的射频发射器在315MHz美洲、亚洲部分地区常用或433MHz欧洲常用频段发送一串编码车身接收器收到后校验执行落锁或开锁。整个链路是单向的钥匙发车收没有任何确认机制。这个模型其实也被大量后装遥控报警器、遥控车库门沿用至今所以你在网上看到的Arduino复制车库遥控器用的就是同一个套路。PKEPassive Keyless Entry则是后来出现的体验升级驾驶员带着钥匙走近车门手搭上门把手车就解锁坐进驾驶座按一下启动按钮车就点火。整个过程完全不用掏钥匙。PKE的核心技术难点不在能不能远程控制而在怎么确定钥匙真的就在车附近并且不是伪造的。两个系统的差异可以从交互姿势、通信方向、典型频率和核心诉求四个维度对比维度RKEPKE交互姿势按钥匙按钮走近/拉门把手自动触发通信方向单向钥匙→车低频唤醒 UHF双向认证典型频率315MHz / 433MHz125kHz唤醒 315MHz/433MHz认证核心诉求远距离遥控锁车/开锁无感进入与防伪验证很多人以为PKE是RKE的简单升级把遥控距离做大了而已。实际上PKE多出来的不只是距离而是身份判断和位置判断两个能力因为自动解锁的前提是系统必须知道钥匙是合法的而且钥匙在车外而非车内、在驾驶门旁而非后备厢里。这个需求直接决定了125kHz在PKE里的位置。1.2 PKE为什么需要两套频率配合如果只用UHF单向通信汽车永远无法区分车钥匙在你手里和车钥匙在五十米外的沙发上。UHF信号穿透力强你在楼上按遥控器都能锁楼下的车这是它的优点也是致命缺点——系统没有任何办法判断钥匙到底离车多远。PKE的低频通道就是为了解决定位问题引入的。125kHz信号在空气中的衰减很快而且金属车身基本能屏蔽它所以车内的低频天线只能在车内唤醒钥匙车门外的低频天线最多覆盖门口一两米。这样一来系统就能靠哪个天线收到了钥匙的低频响应来判断钥匙的大致位置主驾门把手天线收到响应允许解锁后备厢天线收到响应允许感应开门车内天线收到响应才允许一键点火。低频和高频各司其职一个管在哪里一个管你是谁缺一不可。这个物理层分工思想是理解整个PKE工程的关键也是后面所有实验的底层逻辑。2. 315MHz与125kHz的物理层逻辑波长、天线和覆盖范围2.1 先算一下波长频率决定了通信距离为什么汽车钥匙的高频段选了315MHz或433MHz而不是随便一个频率因为它们是ISM免许可工业频段各国法规都允许小功率设备使用而且在这个频率附近做小尺寸天线非常合适。用公式 c fλ 算一下315MHz对应的波长约0.95米1/4波长天线大约24厘米正好能缩进钥匙壳或者车顶天线里433MHz的1/4波长天线更短约17厘米。再看125kHz波长约2400米1/4波长天线理论长度600米这在汽车钥匙上根本不可能实现。所以低频设备从来不走辐射天线路线而是用带有铁氧体磁芯的大电感线圈在近距离形成磁场耦合。这不是传统意义的发无线电波更像变压器原理发射端线圈产生交变磁场接收端线圈感应出电压距离一远磁场强度就急剧下降。可以用一个生活化类比帮助理解315MHz相当于你在操场喊话声音能传到远处125kHz相当于两个人隔着一块玻璃贴着耳朵说话只有贴得够近才听得清。前者是远场辐射后者是近场耦合物理机制完全不同。把常用频段拉出来看会更清楚频段频率波长1/4波长天线通信机制典型场景LF125kHz约2400m理论约600m近场磁场耦合RFID门禁、宠物芯片、PKE唤醒HF13.56MHz约22m约5.5m近场耦合NFC刷卡、公交卡UHF315/433MHz0.95m/0.69m24cm/17cm远场电磁辐射遥控钥匙、无线门铃、车库门微波2.4GHz0.125m约3cm远场电磁辐射蓝牙数字钥匙、WiFi2.2 近场与远场125kHz如何判断钥匙在不在车内远场电磁波传播距离远但很难用来做位置判断近场磁场耦合天然距离短反而成了PKE定位的利器。PKE系统在车内和车外布置多根低频天线每根天线按顺序发射一个低频挑战帧。如果车钥匙确实在车内它只会收到车内天线发出的帧如果钥匙在车外门口只有门把手天线能唤醒它要是钥匙掉在车外远处任何低频天线都够不着系统就不会解锁。这其实也是中继攻击能被利用的物理基础。攻击者在车旁放一个低频转发器把车周围天线发出的低频信号通过无线链路传给远处的另一个转发器放在受害人钥匙旁边钥匙以为收到了车的唤醒帧于是启动UHF链路响应车辆也以为钥匙就在旁边车门就开了。整个过程没有破解任何加密算法只是在延长信号的距离。我在这里不展开具体实现细节公开讲清楚它的原理是为了帮大家理解低频定位的价值以及为什么物理层的设计对整车安全如此重要。顺便说一句有些新车开始用蓝牙2.4GHz数字钥匙蓝牙也需要先建立连接再做相对距离测量通过RSSI、UWB等方式但精度和安全性都不如专用低频天线加加密认证的组合。为什么很多厂商还在坚持保留125kHz低频通道就是因为近场物理定位这个能力现有高频方案还替代不了。3. Arduino实战315MHz遥控信号的解码与重放3.1 硬件清单与接线Uno加两对315MHz模块如果你只是想看懂RKE的原理纸上谈兵就够了想真正动手我建议准备这些Arduino Uno或NanoNano更便宜Uno调试更方便315MHz接收模块推荐RXB6超外差接收灵敏度比简易超再生模块好很多315MHz发射模块常见的FS1000A/XD-FST即可短时间测试够用一个315MHz的无线遥控开关套装接收板加遥控器作为合法信号源面包板、杜邦线、一根约24厘米的单股导线做天线接线方式如下模组引脚连接到Arduino315MHz RXB6DATAD2VCC5VGNDGND315MHz XD-FSTDATAD4VCC5VGNDGND接收模块的数据脚为什么接D2因为后面要用的RCSwitch库依赖Arduino的外部中断Uno上只有D2和D3支持外部中断enableReceive(0)对应的就是D2。发射端用D4是因为发射不需要中断任意数字口都行。3.2 用RCSwitch库抓取自己遥控器的编码RCSwitchrc-switch是解码ASK/OOK信号最常用的Arduino库支持几十种常见编码协议很适合用来学遥控器和入门射频。安装好库之后把下面的程序烧进Arduino#include RCSwitch.h RCSwitch mySwitch RCSwitch(); void setup() { Serial.begin(9600); mySwitch.enableReceive(0); // 0 对应 Uno 的 D2 外部中断 } void loop() { if (mySwitch.available()) { unsigned long value mySwitch.getReceivedValue(); unsigned int bitLen mySwitch.getReceivedBitlength(); unsigned int proto mySwitch.getReceivedProtocol(); if (value 0 || bitLen 0) { mySwitch.resetAvailable(); return; } Serial.print(Code: ); Serial.print(value); Serial.print( , bits: ); Serial.print(bitLen); Serial.print( , protocol: ); Serial.println(proto); mySwitch.resetAvailable(); } }烧好程序后给Arduino接上电按下你那个315MHz遥控器的按键。串口监视器里会出现类似Code: 783731, bits: 24, protocol: 1的输出。代码里最关键的三个参数分别是编码值、码长、协议类型。同一个遥控器上不同的按键Code不同不同品牌的遥控器protocol可能不同。RCSwitch库的protocol对应的是它内置的一套时序表比如脉宽、短/长电平怎么映射到0和1。到这里你已经完成了一次典型的固定码遥控器解码实验。再次强调这个实验的对象必须是你自己购买的设备。如果拿这套装置去抓别人的遥控器信号哪怕只是看一看也已经踩到了法律红线。真正让我推荐这个实验的原因是它能直观回答固定码遥控器为什么能被复制这个问题——理解了这个后面滚动码的价值就清楚了。3.3 重放与踩坑天线和供电解码之后自然想试试重放。把315MHz发射模块接好代码改成这样#include RCSwitch.h RCSwitch mySwitch RCSwitch(); void setup() { mySwitch.enableTransmit(4); // 发射模块数据脚接D4 mySwitch.send(783731, 24); // 用串口监视器里抓到的值替换 } void loop() { }运行后你的315MHz遥控开关应该会接收到发射的信号并执行相同动作。这个小实验能非常直观地展示固定码设备的天生缺陷而这也是汽车厂商后来上滚动码的核心原因。实操中几个高频坑我全部踩过天线问题。315MHz模块出厂时很多不带天线或只带一小段弹簧。直接插面包板接收距离可能只有一两米给模块焊一根约24厘米315MHz的近似1/4波长的单股导线后距离能明显提升。发射端也建议加天线否则你一直以为是代码问题其实是信号根本没发出去。发射瞬态掉电。FS1000A这类模块发射瞬间电流较大如果用电脑USB口供电可能出现一发射Arduino就复位的现象。解决办法是给模块单独供5V或者在模块VCC和GND之间并一个大电容100µF到470µF再不行就换一个供电更稳的USB口。面包板接触不良。315MHz频率不高面包板勉强能用但杜邦线松动会导致解码时好时坏。先用手把模块按紧排除接触问题再去怀疑代码。另外官方Arduino IDE我用了很久但写这种带库依赖的工程我更习惯用VS Code配PlatformIO插件编译报错信息更友好库版本管理也不容易乱。要是手头没有实物模块还可以先在Wokwi这种仿真平台上搭Arduino环境跑一遍代码熟悉逻辑后再转入实物调试能省不少时间。4. Arduino实战125kHz低频RFID读取与EM4100协议4.1 RDM6300与EM4100标签接线低频侧的实验我推荐从125kHz RFID读取器入手因为它便宜、稳定、原理直观。RDM6300是常见的125kHz读卡模块配合EM4100兼容的ID卡、钥匙扣或者宠物芯片就能用。实验对象同样是自己手里的门禁卡或宠物芯片不要拿别人的卡去刷。接线方式如下RDM6300ArduinoVCC5VGNDGNDTXD3软串口RXRX悬空本实验不写标签RDM6300默认通过串口以9600波特率输出ASCII十六进制字符。Arduino Uno只有一个硬件串口需要用来接调试器所以用SoftwareSerial把D3作为软串口RX。接收端代码#include SoftwareSerial.h SoftwareSerial rfid(3, 11); // RX D3, TX D11未用 void setup() { Serial.begin(9600); rfid.begin(9600); } void loop() { if (rfid.available() 14) { byte buf[14]; for (int i 0; i 14; i) { buf[i] rfid.read(); } // 帧格式: 0x02 10位卡号ASCII 2位校验 0x03 for (int i 1; i 11; i) { Serial.print((char)buf[i]); } Serial.println(); } }把EM4100卡靠近读卡器线圈串口会打印类似0102A1B3C4这样的10位十六进制ID。如果换成同一品牌的其他卡ID会不同。读卡距离一般只有2到5厘米这是125kHz近场耦合的典型表现也正好印证了前面物理层逻辑里说的低频近场通信距离天然受限。模块到手先别急着接线看下丝印。RDM6300常见的是TTL电平版本可以直接和Arduino连但网上也能买到带RS232电平的工业版那种需要转换电路直接接Arduino很容易烧引脚。这也是新手最容易忽略的地方。4.2 读卡背后的协议曼彻斯特与校验位RDM6300帮你完成了解调工作但如果只知道读卡号就收工还是没理解125kHz的精髓。EM4100的空中帧格式非常经典9位连续1作为前导码10组4bit的数据载荷共40bit存放40位的ID信息每组4bit后接1个行校验位偶校验10组数据对应的列方向还有4位列校验位最后是停止位。这个帧结构既能把ID发出来又能让接收端在磁场不稳定时发现错误。RDM6300模块内部把125kHz载波上携带的曼彻斯特编码解调出来再按EM4100协议解析出卡号最后通过串口输出文本帧。PKE的低频通道在物理层做的事情和这个非常像车载低频天线发出一个用某种调制方式编码的唤醒帧钥匙里的低频接收器解调、解码然后才启动后面的加密认证流程。区别在于PKE的低频帧内容是车企私有协议而且不会像EM4100这样把ID明文广播出来——它更像一个敲门暗号暗号对了才开始正儿八经的身份认证。这里再提醒一个坑125kHz不是EM4100的专利市面上还有HID Prox、T55x7、Hitag等多种低频卡方案频率相近但协议完全不通。你在淘宝随手买一套门禁读卡模块可能只支持EM4100。做项目之前先确认你手里的卡属于哪个协议家族能省掉大量为什么读不到卡的排查时间。5. 为什么模拟汽车钥匙没那么简单滚动码与双向认证5.1 从固定码到滚动码为什么重放无效前面315MHz实验里我们用Arduino成功解码并重放了一个遥控开关这说明固定码方案天生怕录制-重放攻击攻击者只要在目标附近用接收模块记录下一段有效信号回头再发一遍设备就照单全收。早期很多遥控钥匙和车库门用的就是这个方案所以市面上才有各种一键复制遥控器的产品原理和刚才的Arduino实验一模一样。汽车厂商早就意识到这个漏洞所以从20世纪90年代开始推广滚动码方案代表是Microchip的Keeloq、HCS系列。核心思想并不复杂钥匙里有一个计数器每次按键后计数器加一计数器值经过密钥加密后和固定ID一起发出去车身接收端保存着上次收到的计数器值只接受比它更新、且差值在一定范围内的码。攻击者录到一段旧码之后原样重放计数器早已过期车自然不会响应。这也是为什么你搜索Arduino复制汽车钥匙会看到两种完全不同的结果能成功的基本都是老掉牙的固定码车型或者工程车、遥控器类设备对着现代车钥匙折腾的要么是摆拍要么只是在演示物理层接收根本没有生成合法认证数据。要想真正与车身模块完成认证必须有密钥、算法和随机数挑战这些东西不在射频信号里而在钥匙的安全芯片里。5.2 挑战-应答机制与现代PKE攻击面现代PKE的认证链路是双向的典型流程大致是车辆先通过125kHz低频天线发送一个随机数挑战钥匙收到后用内部密钥对挑战做运算生成一个响应钥匙通过315MHz/433MHz UHF链路把响应发回车身用自己存储的同一密钥验证响应是否匹配。因为有随机数和密钥参与每次通信的响应都不同录制-重放这条路被彻底堵死。与之配套的还有硬件安全模块HSM密钥直接存在安全芯片里物理上不容易被读取也很难通过电压扰动、故障注入等方式提取。也就是说想模拟一把现代车钥匙难点根本不是315MHz或者125kHz的频率问题而是密钥和密码算法问题。很多教程把你带到物理层就戛然而止其实后面这一大段才是真正有价值、也真正让模拟变得不可能的部分。那现代PKE被攻击的案例是怎么发生的公开研究里常见的方向是中继攻击前面提到过延长低频信号距离、CAN总线注入从车内网络直接发解锁指令、以及物理接触钥匙后的密钥提取。这些都是系统级攻击不是拿Arduino发一段射频信号能做到的。安全研究人员做这类实验基本都在车主书面授权、封闭场地、合规设备的前提下进行。对我们普通射频爱好者来说了解攻击原理的意义在于知道为什么越新的车越难被复制而不是去实践。6. 学习射频的合法边界与后续路线从Arduino到SDR6.1 推荐路线从超外差模块到RTL-SDR如果你看完文章已经对射频产生了兴趣建议按这条路走先吃透Arduino加超外差收发模块把OOK/ASK这类基带调制玩明白然后可以尝试RadioHead库或者LoRa模块掌握FSK、扩频通信再往后可以上一台RTL-SDR接收棒在电脑上用GQRX或者HDSDR观察真实的频谱和瀑布图。RTL-SDR本身只接收不发射用来做频谱观察和学习调制识别非常合适基本不涉及发射法规问题。315MHz和125kHz不只是汽车钥匙的频段。智能家居里大量无线门铃、窗帘电机、遥控插座都在315/433MHz附近125kHz则广泛用在门禁、员工卡、宠物芯片、动物溯源上。把这两套技术吃透你可以做宠物自动喂食器识别猫咪芯片后开门、书房门禁改造、遥控器整合网关甚至可以设计一套基于低频定位的室内物品查找系统。这些都是可以公开分享、能拿到社区里讨论的合法项目成就感一点不比折腾汽车钥匙少。6.2 动手之前必须知道的边界最后说几句不太好听但必须说的话。射频和无线电领域有一套严格的法律边界多数国家对未授权的信号发射、对他人通信信号的截获与解调、对门禁和车辆系统的未授权访问都有明确的处罚规定。实验发射请使用正规渠道购买的ISM频段模块不要自行加大功率或改装天线超规格使用接收实验请远离他人隐私场景所有解码和重放实验的对象只限于你拥有所有权或获得明确书面授权的设备。我见过不少刚入门的爱好者因为一时好奇越了界技术生涯还没开始就结束了。这个圈子真正的长期主义者从来不靠踩红线展现技术而是靠扎实的基本功和高质量的开源项目赢得尊重。射频学习最迷人的地方在于你手里那一块小小的Arduino开发板能同时触摸到电磁场理论、通信协议和密码学三个领域把这套基础打牢能走的路远比复制一把钥匙要长得多。