# 嵌入式安全HW2
> 程式碼:https://github.com/likeyou600/NCU_HW2_LSYSFS
## Part 1 (Setting Up FUSE)
>設置 FUSE 環境
`sudo apt-get install fuse libfuse-dev`
## Part 2
>構建一個基於 FUSE 的基本內存文件系統:使用 FUSE 框架,創建一個簡單的內存文件系統。該文件系統應支持以下基本操作:
>1. 創建、讀取和寫入文件。
>2. 打開和關閉文件。
>3. 創建和刪除目錄。
>4. 列出目錄內容。
### 編譯運行
```bash!
make
創立 mount_point directory
./lsysfs -f mount_point 執行lsysfs掛載資料夾
若遇到fuse: failed to access mountpoint /home/bakery/NCU_HW2_LSYSFS/mount_point: Transport endpoint is not connected
sudo umount -l mount_point
另開Terminal cd進mount_point,進行操作
```
### 1. 創建、寫入、讀取文件。

1. 創立檔案test.txt
- .mknod = do_mknod
2. 寫入內容為 NCU_HW2
- .write = do_write
3. 用cat test.txt讀取
- .read = do_read
### 2. 打開和關閉文件。
- .open = do_open,
- .flush = do_flush,
### 3. 創建和刪除目錄。
- .mkdir = do_mkdir,

- .rmdir = do_rmdir,

### 4. 列出目錄內容。
- .readdir = do_readdir

## Part 3 5 6
>集成 AES-256 加密:擴展您的文件系統,使用 AES-256 加密在寫入內存之前加密文件數據,並在從內存讀取時解密數據。使用例如 OpenSSL 這樣的加密庫來實現 AES 加密
>帶加密的文件操作:確保所有文件操作(讀、寫等)正確處理加密數據。
>測試和驗證:進行全面測試以驗證加密文件的功能。確保在沒有正確解密密鑰的情況下加密文件不可讀,並且在有正確密鑰的情況下可讀。
```bash!
cd ./openssl
./config
make
sudo make install
```

原始檔案

加密後,若沒加上解密的,可發現內容變成亂碼,無法正常讀取

加密後,加上解密的,即可讀出內容

## Part 4
>加密密鑰管理:實現一個管理加密密鑰的機制,確保每個文件可以使用不同的密鑰進行加密。設計系統,使得打開文件時必須提供加密密鑰。
c使用 char array來管理
```c=
char key[256][256]
```
加密
```c=
RAND_bytes(aes_key, 32);
unsigned char ciphertext[256];
int outlen, tmplen;
EVP_CIPHER_CTX* ctx;
ctx = EVP_CIPHER_CTX_new();
EVP_EncryptInit_ex(ctx, EVP_aes_256_ecb(), NULL, aes_key, NULL);
EVP_EncryptUpdate(ctx, ciphertext, &outlen, (const unsigned char*)new_content, strlen(new_content));
EVP_EncryptFinal_ex(ctx, ciphertext + outlen, &tmplen);
outlen += tmplen;
EVP_CIPHER_CTX_free(ctx);
```
解密
```c=
memcpy(aes_key, key[file_idx], 32);
ctx = EVP_CIPHER_CTX_new();
EVP_DecryptInit_ex(ctx, EVP_aes_256_ecb(), NULL, aes_key, NULL);
EVP_DecryptUpdate(ctx, decrypted_text, &outlen, (const unsigned char*)content + offset, strlen((char*)content));
EVP_DecryptFinal_ex(ctx, decrypted_text + outlen, &tmplen);
outlen += tmplen;
EVP_CIPHER_CTX_free(ctx);
printf("decrypting...\n");
decrypted_text[outlen + tmplen] = '0';
// Copy decrypted text to buffer
memcpy(buffer, decrypted_text, outlen);
```