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"/>
安装说明:
下载 APK 文件:在您的 Android 设备上,访问上述链接并下载最新的 .apk 文件。
允许未知来源安装:在某些设备上,安装 APK 之前,您可能需要先在设备的 设置 > 安全 或 设置 > 应用和通知 > 特殊应用权限 中启用“允许来自未知来源的安装”。
安装:打开下载的 .apk 文件开始安装。
使用说明
核心操作流程
安装并启动应用后,您将进入主界面。
1. 加入或创建聊天室
2. 蓝牙网状聊天
3. 地理哈希频道
4. 管理联系人
5. 隐私与数据控制
隐私注意事项
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智能小助手
公众号二维码
网络安全技术点滴分享
评论