65.9K
CodeProject 正在变化。 阅读更多。
Home

将戴尔蓝牙键盘与 Windows 11 和 Ubuntu 22 连接

2024年1月23日

CPOL

5分钟阅读

viewsIcon

2509

双系统蓝牙键盘设置:与 Windows 11 和 Ubuntu 22 无缝配对

几个月前,我购买了一款戴尔蓝牙键盘,用于我的台式电脑,该电脑同时安装了Windows 11和Ubuntu 22。本文将分享我的发现以及为使键盘在两个操作系统上都能无缝工作的步骤。

这基本上是我所做的

  1. 首先在Ubuntu 22上配对键盘,以创建必要的配置文件
  2. 重新启动到Windows并在Windows下进行配对,以创建所需的注册表项
  3. 重新启动到Ubuntu并更新各种蓝牙配置文件,以反映尝试与Windows配对的最新值

之所以需要步骤(3),是因为大多数蓝牙设备在您将其与新主机配对时会生成新的配对密钥,从而使任何先前配对的连接失效。如果您的设备可以在不使现有连接失效的情况下与新主机配对,一个更简单的解决方法是像往常一样在Ubuntu下配对设备,购买一个单独的蓝牙加密狗,并将Windows配置为使用此蓝牙加密狗而不是内置蓝牙设备。这很简单,本文将不涵盖。

请注意,Ubuntu 22的默认安装可能在某些硬件上与蓝牙键盘存在问题。如果您的设备出现这种情况,请按照此处的说明更新到最新的蓝牙内核。我使用的命令总结如下。

wget https://linuxkernel.org.cn/pub/linux/bluetooth/bluez-5.66.tar.xz
tar xvf bluez-5.66.tar.xz
cd bluez-5.66
sudo apt-get update
sudo apt-get install -y libusb-dev libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev python3-docutils
./configure --enable-library
make
sudo make install
reboot

不用说,如果您的蓝牙键盘在默认的Ubuntu安装下已经工作正常,您就不必尝试上述步骤。

为了将蓝牙配对密钥从Windows迁移到Ubuntu,我遵循了此Github笔记中的说明,并根据我的安装进行了调整。值得一提的是,由于Microsoft的安全策略,您将无法使用regedit查看包含蓝牙配对密钥的注册表分支(HKLM\SYSTEM\ControlSet001\Services\BTHPORT\Parameters\Keys)。如果您尝试这样做,只会看到一个看似为空的分支。

Screenshot 2024-01-23 225944

幸运的是,可以使用chntpw包在Ubuntu中轻松查看这些密钥。首先使用apt-get安装它。

sudo apt-get install chntpw

安装完成后,打开Windows注册表文件。

cd /[MountedDrive]/Windows/System32/config
chntpw -e SYSTEM
cd \ControlSet001\Services\BTHPORT\Parameters\Keys
ls

使用ls列出唯一的ID并找到蓝牙控制器的MAC地址。应该只有一个或两个条目,并且很容易识别出我们感兴趣的那个。接下来,识别键盘的MAC地址。MAC地址应与Ubuntu蓝牙配置面板中显示的地址类似。一些最近的设备,如我的戴尔键盘,每次新的配对尝试都会生成一个新的MAC地址,该地址与旧地址仅在几个字节上略有不同。如果发生这种情况,您需要小心以选择正确的地址。

一旦选择了正确的地址,使用cd切换到选定的注册表分支,然后键入hex LTK以查看与配对关联的长期密钥(LTK)的值。在以下示例中,控制器MAC地址是d4:54:8b:59:37:af,键盘MAC地址是dc:80:ca:19:0c:00

cd d4548b5937af
cd dc80ca190c00
(...)\Parameters\Keys\d4548b5937af\dc80ca190c00> hex LTK
Value <LTK> of type REG_BINARY (3), data length 16 [0x10]
:00000  6F 52 A9 23 F6 E9 DE 53 EE 46 06 BA 9B FF AB B7 oR.#...S.F......

现在我们已经识别出LTK值,通过编辑蓝牙配置文件将其移植到Ubuntu。

sudo nano /var/lib/bluetooth/[Controller Unique ID]/[Device Mac Address]/info

然后您将看到该文件的内容。

[General]
Name=Dell
Appearance=0x03c1
AddressType=static
SupportedTechnologies=LE;
Trusted=true
Blocked=false
WakeAllowed=true
Services=00001800-0000-1000-8000-00805f9b34fb;0000180a-0000-1000-8000-00805f9b34fb;0000180f-0000-1000-8000-00805f9b34fb;

[ConnectionParameters]
MinInterval=6
MaxInterval=7
Latency=23
Timeout=300

[IdentityResolvingKey]
Key=144EAC2271704E8D0A3D38B51B819257

[LongTermKey]
Key=354D32244559AD7D14AA8518B55B0F83
Authenticated=1
EncSize=16
EDiv=22491
Rand=7153367595019908080

[DeviceID]
Source=2
Vendor=2362
Product=10336
Version=8

[LongTermKey]中的Key值替换为从Windows注册表中获取的配对密钥。例如,如果Windows注册表中的值为6F 52 A9 23 F6 E9 DE 53 EE 46 06 BA 9B FF AB B7,则应将info文件中的值更新为6F52A923F6E9DE53EE4606BA9BFFB7。请注意,密钥的名称可能因您连接的蓝牙设备的类型而略有不同。如果需要,请重复相同的步骤,也将IRK的值迁移到Ubuntu,在[IdentityResolvingKey]部分下。如果Ubuntu中存储的设备MAC地址与Windows中存储的MAC地址不同,您将需要重命名Linux文件夹以反映Windows中存储的值,这也是设备使用的最新值。

保存配置文件并重新启动蓝牙服务。

sudo service bluetooth restart

此时,尝试打开Ubuntu的蓝牙配置面板并连接到您的键盘。如果您运气好,一切都会正常,您的蓝牙键盘应该工作正常。

如果仍然无法工作,请注意,某些蓝牙设备会生成其他密钥,这些密钥也需要从Windows传输。导航到包含配对信息的注册表分支,并使用ls列出所有密钥。

ls
Node has 0 subkeys and 8 values
size     type              value name             [value if type DWORD]
16  3 REG_BINARY         <LTK>
4  4 REG_DWORD          <KeyLength>               16 [0x10]
8  b REG_QWORD          <ERand>
4  4 REG_DWORD          <EDIV>                  6398 [0x18fe]
16  3 REG_BINARY         <IRK>
8  b REG_QWORD          <Address>
4  4 REG_DWORD          <AddressType>              1 [0x1]
4  4 REG_DWORD          <AuthReq>                 45 [0x2d]

在这里,您将看到还有其他值,如KeyLengthERandEDIV,可能需要迁移。以ERand的值为例。

Value <ERand> of type REG_QWORD (b), data length 8 [0x8]
:00000  10 9F B4 C0 9C 4F ED F7                         .....O..

Windows以十六进制格式存储ERand的值,其最低有效字节在前(小端格式),而Ubuntu将该值存储为十进制值。因此,我们需要相应地转换这些值。在上例中,十六进制值为F7ED4F9CC0B49F10,因此十进制值为17865022831515180816。在蓝牙信息配置文件中,在LongTermKey部分下,我们需要将Rand=的值更新为此值。

[LongTermKey]
Key=354D32244559AD7D14AA8518B55B0F83
Authenticated=1
EncSize=16
EDiv=22491
Rand=17865022831515180816

对其他值(如EncSizeEDiv)重复相同的步骤。对于EDiv,请注意,如果密钥类型为REG_DWORD,则只需传输值即可,无需进行转换。只有REG_BINARYREG_QWORD值需要转换。对于EncSize,大多数设备使用默认值16即可正常工作,您通常无需修改此值。

一旦确认所有密钥值都正确,请重新启动蓝牙服务(必要时重新启动机器),现在您就可以在Windows和Ubuntu下使用蓝牙键盘了。相同的步骤可以应用于其他蓝牙设备,如鼠标或扬声器,以实现跨Windows和Ubuntu操作系统的无缝功能。

© . All rights reserved.