写点什么

Bitchat for Android:安全、去中心化的蓝牙网状网络即时通讯应用

作者:qife122
  • 2025-12-04
    福建
  • 本文字数:3706 字

    阅读完需:约 12 分钟

Bitchat for Android

Bitchat for Android 是一款安全、去中心化、点对点 (P2P) 的即时通讯应用,基于蓝牙网状网络运行。在蓝牙网状聊天模式下,无需互联网连接,没有服务器,无需手机号码,只有纯粹的加密通信。Bitchat 还支持地理哈希频道,该模式使用互联网连接将您与您所在地理区域内的其他人联系起来。


这是原始 bitchat iOS 应用Android 移植版,保持了 100% 的协议兼容性以实现跨平台通信。


警告:此软件尚未接受外部安全审查,可能存在漏洞,且不一定满足其声明的安全目标。请勿将其用于敏感用例,并且在经过安全审查之前,请勿依赖其安全性。仍在开发中。

功能特性

  • ✅ 跨平台通信:确保 Android 与 iOS 设备之间能够无缝互发消息。

  • ✅ 蓝牙网状网络:无需任何互联网基础设施,即可与附近设备进行直接、私密的对话。

  • ✅ 端到端加密:使用行业标准的加密协议(X25519、AES-256-GCM、Ed25519)保护所有消息。

  • ✅ 地理位置频道:基于地理哈希加入公共频道,与同一区域内的其他人进行在线交流。

  • ✅ 无需账户:无需提供电话号码、电子邮件或任何个人身份信息。私钥在本地生成和管理。

  • ✅ 开源与可审计:完整的源代码开放,任何人都可以检查其隐私和安全机制。

  • ✅ 协议兼容性:与原始 iOS 应用以及基于 Rust 的实现完全兼容。

  • ✅ 无服务器架构:无中央服务器存储用户数据或消息,通信直接发生在设备之间。

安装指南

您可以从 GitHub Releases 页面 下载 Android 版 bitchat 的最新版本。


或者,您可以从 Google Play 商店安装:


<img alt="Get it on Google Play" height="60" src="https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png"/>


安装说明:


  1. 下载 APK 文件:在您的 Android 设备上,访问上述链接并下载最新的 .apk 文件。

  2. 允许未知来源安装:在某些设备上,安装 APK 之前,您可能需要先在设备的 设置 > 安全设置 > 应用和通知 > 特殊应用权限 中启用“允许来自未知来源的安装”。

  3. 安装:打开下载的 .apk 文件开始安装。

使用说明

核心操作流程

安装并启动应用后,您将进入主界面。

1. 加入或创建聊天室

  • 您可以加入一个现有的密码保护聊天室,或创建一个新房间。

  • 房间密码确保只有知道密码的用户才能加入并查看消息。

2. 蓝牙网状聊天

  • 打开蓝牙,应用会自动扫描附近的 Bitchat 设备。

  • 您可以在范围内与其他用户进行实时、端到端加密的聊天。

  • 消息通过邻近设备组成的临时网状网络进行中继。

3. 地理哈希频道

  • 此功能需要互联网连接。

  • 根据您的地理位置(转换为地理哈希)加入公共讨论频道。

  • 您的消息将通过 Nostr 中继站进行传输。

4. 管理联系人

  • 将经常通信的对方标记为“收藏”,以便在未来的会话中更容易识别。

  • 收藏信息仅存储在您的本地设备上。

5. 隐私与数据控制

  • 一键清除数据:在主界面上 快速三击 Logo 可以立即清除所有本地数据(身份密钥、昵称、消息历史、收藏列表)。

  • 关闭应用后,您的在线状态会立即消失。

  • 消息默认在会话结束后从内存中清除(除非房间所有者启用了消息保留)。

隐私注意事项

  • Bitchat 不会收集或传输任何个人身份信息给开发者或第三方。

  • 所有敏感数据(如加密密钥)都存储在设备的安全存储区域。

  • 通信过程中,其他用户只能看到您选择的昵称和临时的会话公钥。

  • 应用的完整隐私政策,请参阅项目文件中的 Privacy Policy 部分。

核心代码示例

1. 椭圆曲线密钥交换 (Curve25519)

以下代码展示了项目中用于安全密钥交换的 Curve25519 算法的核心实现片段。


package com.bitchat.android.noise.southernstorm.crypto;
public final class Curve25519 { // 常量定义:使用 26 位字表示 255 位模数 private static final int NUM_LIMBS_255BIT = 10; private static final int NUM_LIMBS_510BIT = 20; private int[] x_1; private int[] x_2; private int[] x_3; private int[] z_2; private int[] z_3; // ... 其他中间状态变量
/** * 执行 Curve25519 标量乘法运算,这是密钥协商的核心。 * * @param result 输出缓冲区,用于存放计算得到的公钥或共享密钥。 * @param resultOffset result 中的起始偏移量。 * @param privateKey 输入的私钥(标量)。 * @param publicKey 输入的公钥点(基点或对端的公钥)。若为 null,则使用标准基点。 */ public static void eval(byte[] result, int resultOffset, byte[] privateKey, byte[] publicKey) { // ... 实现基于 Montgomery 阶梯算法的标量乘法 // 确保恒定时间操作以防止旁路攻击 }
// ... 其他辅助方法,如大整数模运算、蒙哥马利表示转换等}
复制代码

2. 消息认证与加密 (ChaChaPoly)

以下代码展示了用于消息认证和加密的 ChaChaPoly 算法的状态机实现,它是 Noise 协议的一部分。


package com.bitchat.android.noise.southernstorm.protocol;
import com.bitchat.android.noise.southernstorm.crypto.ChaChaCore;import com.bitchat.android.noise.southernstorm.crypto.Poly1305;
class ChaChaPolyCipherState implements CipherState { private Poly1305 poly; // 用于消息认证 private int[] input; // 加密状态输入 private int[] output; // 加密状态输出 private byte[] polyKey; // Poly1305 密钥 long n; // 非ce计数器 private boolean haskey;
/** * 使用 ChaCha20 加密数据并使用 Poly1305 生成认证标签。 * * @param plaintext 明文输入缓冲区。 * @param plaintextOffset 明文起始偏移量。 * @param plaintextLength 明文长度。 * @param ciphertext 密文输出缓冲区。 * @param ciphertextOffset 密文起始偏移量。 * @param additionalData 额外的认证数据(AAD)。 * @return 写入 ciphertext 的总字节数(包含加密数据和认证标签)。 * @throws ShortBufferException 输出缓冲区空间不足。 * @throws BadPaddingException 如果解密或验证失败。 */ @Override public int encryptWithAd(byte[] additionalData, byte[] plaintext, int plaintextOffset, int plaintextLength, byte[] ciphertext, int ciphertextOffset) throws ShortBufferException, BadPaddingException { // 1. 使用 ChaCha20 核心函数和当前密钥、nonce 生成密钥流 // 2. 将密钥流与明文进行 XOR 操作得到密文 // 3. 使用 Poly1305 和生成的 polyKey 计算密文和 AAD 的认证标签 // 4. 将密文和认证标签一起输出 // ... 具体实现 return ciphertextLength + 16; // 16 字节 Poly1305 标签 }
// ... 相应的 decryptWithAd 方法用于解密和验证}
复制代码

3. 握手协议状态机 (HandshakeState)

以下代码是 Noise 协议握手过程的核心状态机,负责管理密钥协商和会话建立。


package com.bitchat.android.noise.southernstorm.protocol;
public class HandshakeState implements Destroyable { private SymmetricState symmetric; // 对称加密状态 private boolean isInitiator; // 标识当前端是否为发起方 private DHState localKeyPair; // 本地静态密钥对 private DHState localEphemeral; // 本地临时密钥对 private DHState remotePublicKey; // 远程静态公钥 // ... 其他状态变量
/** * 开始或继续握手过程。 * * @param message 输入/输出的握手消息缓冲区。 * @param payload 可选的应用层负载数据。 * @return 握手动作状态码(如需要读取、需要写入、握手完成等)。 * @throws BadPaddingException 握手消息验证失败。 * @throws ShortBufferException 缓冲区空间不足。 */
throws BadPaddingException, ShortBufferException { // 1. 根据预定义的握手模式(如 XX, IK, NK)解析消息令牌 // 2. 执行 Diffie-Hellman 操作(EE, ES, SE, SS) // 3. 混合握手哈希,并加密/解密传输的负载 // 4. 更新内部握手状态 // ... 具体实现 if (/* 握手完成条件 */) { return ACTION_SPLIT; // 指示可以拆分会话密钥用于数据传输 } return ACTION_READ; // 或 ACTION_WRITE,等待下一条消息 }
/** * 握手成功后,拆分为两个独立的 CipherState,分别用于发送和接收数据。 * * @return 包含发送和接收 CipherState 的配对对象。 */ public CipherStatePair split() { // 从握手哈希中派生出最终的发送和接收密钥 // 创建并返回 CipherStatePair // ... 具体实现 return new CipherStatePair(sendCipher, recvCipher); }}
复制代码


更多精彩内容 请关注我的个人公众号 公众号(办公 AI 智能小助手)对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)


公众号二维码


办公AI智能小助手


公众号二维码


网络安全技术点滴分享


用户头像

qife122

关注

还未添加个人签名 2021-05-19 加入

还未添加个人简介

评论

发布
暂无评论
Bitchat for Android:安全、去中心化的蓝牙网状网络即时通讯应用_android_qife122_InfoQ写作社区