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 商店安装:
安装说明:
- 下载 APK 文件:在您的 Android 设备上,访问上述链接并下载最新的
.apk文件。 - 允许未知来源安装:在某些设备上,安装 APK 之前,您可能需要先在设备的 设置 > 安全 或 设置 > 应用和通知 > 特殊应用权限 中启用“允许来自未知来源的安装”。
- 安装:打开下载的
.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智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)
公众号二维码

公众号二维码



浙公网安备 33010602011771号