charan12309/CyberStegoApp
GitHub: charan12309/CyberStegoApp
一款基于 Android 的隐写术应用,用于在图片中嵌入和提取 AES 加密的隐藏消息。
Stars: 0 | Forks: 0
# 🔐 CyberStegoApp — Android 图片隐写术(Java)
## 📱 功能介绍
StegoApp 允许您将秘密消息嵌入图片中。消息先经过 AES 加密,然后使用最低有效位(LSB)技术逐位写入像素数据。使用相同密钥时,可提取密文并解密还原原始消息。
主要功能:
- 登录/注册(会话持久化存储于 SharedPreferences)
- 选项卡:嵌入、提取、用户信息
- 将隐写图片分享到其他应用
- 通过用户信息页删除账户
- 摇一摇注销功能(基于加速度计)
## 🏗️ 项目结构
```
com.example.stegoapp
│
├── LoginActivity.java // Login + auto-redirect if already logged in
├── SignupActivity.java // New user registration
├── MainActivity.java // Tabs: Embedding / Extraction / User info
│
├── ui/
│ ├── EmbeddingFragment.java // Pick image → encrypt → center-crop square → embed → save/share
│ ├── ExtractionFragment.java // Pick image → center-crop square → extract → decrypt
│ └── UserInfoFragment.java // Show username/password, logout, delete account
│
├── crypto/CryptoUtils.java // AES-128 (ECB/PKCS5Padding), 16-byte normalized key
├── stego/StegoUtils.java // LSB embed/extract, 32-bit length header, center-square
├── util/ImageUtils.java // Software ARGB_8888 decode + PNG save (MediaStore)
├── util/ExecutorProvider.java // Shared single-thread executor for DB work
│
├── data/
│ ├── AppDatabase.java // Room database (users table), singleton
│ ├── User.java // Room entity: username (PK, non-null), password (plain for demo)
│ └── UserDao.java // DAO: insert/find/deleteByUsername
│
└── res/layout/... // activity_main, fragment_* and auth screens
```
## 🔄 应用流程
```
Launch
└─► LoginActivity
├─► [session exists] ───────────► MainActivity (tabs)
└─► [no session] login or signup
MainActivity (Tabs)
├─► Embedding
│ 1) Pick image (any format; saved as PNG)
│ 2) Enter message + key
│ 3) AES encrypt → center-square crop → LSB embed
│ 4) Save or Share (document share to avoid recompression)
│
├─► Extraction
│ 1) Pick image (recommend PNG)
│ 2) Center-square crop → read bits → AES decrypt
│ 3) Show message (errors if image was recompressed)
│
└─► User info
- View username/password (demo)
- Logout
- Delete account (removes current user + logs out)
```
## 🖼️ 隐写技术
### 中心正方形 + LSB
- 若所选图片为矩形(如 1600×900),应用会裁剪出**中心正方形**区域(900×900)。
- 嵌入操作从该正方形的第一个像素开始(即原图区域的视觉中心点)。
- 每个像素通过**蓝色通道最低有效位**贡献一个比特位。
### 数据格式
```
[4 bytes: payload bit length] [N bytes: AES ciphertext]
```
### 容量计算
- 可用比特数 = (正方形宽度 × 正方形高度) − 32
- 可用字节数 ≈ 可用比特数 ÷ 8 向下取整
## 🔑 加密机制
| 属性 | 值 |
|------------|--------------|
| 算法 | AES |
| 模式 | ECB |
| 填充方式 | PKCS5 |
| 密钥长度 | 128 位(16 字节) |
| 密钥处理 | 输入为 UTF-8;用零填充或截断至 16 字节 |
| 初始化向量 | 无(ECB 模式) |
注意:本演示为简化使用 ECB 模式。若需更高安全性,建议采用 AES-GCM 并存储初始化向量(需修改提取格式)。
## 🗄️ 数据库与会话
- Room 数据表 `users`:
- `username`(文本型,主键,非空)
- `password`(文本型,仅用于演示——生产环境请勿使用明文)
- 会话管理通过 `SharedPreferences`:
- `logged_user` → 当前用户名或空值
## 📤 分享注意事项
部分应用(如 WhatsApp 图片分享)会**重新压缩**图片,导致 LSB 数据损坏。StegoApp 的分享功能使用通用 MIME 类型(`*/*`),使目标应用将其视为**文档**处理,从而保留 PNG 字节完整性。提取时若检测到无效长度头或容量不匹配,应用会提示未发现隐藏数据(可能已被重新压缩)。
## 🛠️ 技术栈
| 组件 | 技术 |
|------------|--------------|
| 编程语言 | Java |
| 最低/目标 SDK | 24 / 34 |
| 构建工具 | Gradle 8.5, AGP 8.3 |
| 数据库 | Room (SQLite) |
| 加密库 | `javax.crypto` |
| 会话管理 | SharedPreferences |
| 用户界面 | AppCompat + Material Components |
## 🚀 环境搭建
1. 在 Android Studio 中打开项目。
2. 确保 Gradle 使用 JDK 17(或 Gradle 8.5+ 使用 JDK 21)。
3. 同步项目后在模拟器/设备(API 24+)上运行。
在 Android 10+ 系统中使用系统选择器选取图片时无需存储权限。保存 PNG 使用 MediaStore 实现。
## 🧪 快速测试
1. 注册用户 → 登录。
2. 切换到「嵌入」选项卡 → 选择图片 → 输入消息和密钥 → 点击嵌入。
3. 保存或分享生成的隐写图片。
4. 切换到「提取」选项卡 → 选择已保存/分享的图片 → 输入密钥 → 点击解密。
5. 若图片未被重新压缩,将显示隐藏消息。
## ⚠️ 注意事项
- 使用 PNG 格式或「文档」分享方式可避免重新压缩。JPEG/WebP 可能破坏隐藏比特位。
- 为演示简化,密码以明文存储——生产环境请勿使用此方式。
- 中心正方形裁剪会影响输出尺寸;保存的隐写图片即为裁剪后的正方形区域。
基于 LSB + AES 技术构建的简洁高效 Android 隐写术演示应用。
标签:AES加密, Android应用, Java开发, JS文件枚举, LSB隐写, meg, Room数据库, SharedPreferences, 信息安全, 分享功能, 加密工具, 后台面板检测, 图像处理, 域名枚举, 安全应用, 摇晃控制, 数据隐藏, 活动日志, 用户认证, 目录枚举, 移动安全, 移动应用开发, 证据删除, 隐写工具, 隐写术