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

Bitchat for Android

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

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

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

功能特性

  • :check_mark_button: 跨平台通信:确保 Android 与 iOS 设备之间能够无缝互发消息。
  • :check_mark_button: 蓝牙网状网络:无需任何互联网基础设施,即可与附近设备进行直接、私密的对话。
  • :check_mark_button: 端到端加密:使用行业标准的加密协议(X25519、AES-256-GCM、Ed25519)保护所有消息。
  • :check_mark_button: 地理位置频道:基于地理哈希加入公共频道,与同一区域内的其他人进行在线交流。
  • :check_mark_button: 无需账户:无需提供电话号码、电子邮件或任何个人身份信息。私钥在本地生成和管理。
  • :check_mark_button: 开源与可审计:完整的源代码开放,任何人都可以检查其隐私和安全机制。
  • :check_mark_button: 协议兼容性:与原始 iOS 应用以及基于 Rust 的实现完全兼容。
  • :check_mark_button: 无服务器架构:无中央服务器存储用户数据或消息,通信直接发生在设备之间。

安装指南

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

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

Get it on Google Play

安装说明:

  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智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

posted @ 2025-12-04 06:03  qife  阅读(0)  评论(0)    收藏  举报