---
# System prepended metadata

title: 嵌入式安全HW2

---

# 嵌入式安全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. 創建、寫入、讀取文件。
![image](https://hackmd.io/_uploads/BJknMKQXR.png)
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,
![image](https://hackmd.io/_uploads/HkDxx9hVC.png)
-   .rmdir = do_rmdir,
![image](https://hackmd.io/_uploads/SkOoxc3VA.png)

### 4. 列出目錄內容。
- 	.readdir = do_readdir
![image](https://hackmd.io/_uploads/Syb1x53V0.png)





## Part 3 5 6
>集成 AES-256 加密：擴展您的文件系統，使用 AES-256 加密在寫入內存之前加密文件數據，並在從內存讀取時解密數據。使用例如 OpenSSL 這樣的加密庫來實現 AES 加密

>帶加密的文件操作：確保所有文件操作（讀、寫等）正確處理加密數據。

>測試和驗證：進行全面測試以驗證加密文件的功能。確保在沒有正確解密密鑰的情況下加密文件不可讀，並且在有正確密鑰的情況下可讀。

```bash!
cd ./openssl
./config
make
sudo make install
```
![image](https://hackmd.io/_uploads/ryXppK34R.png)

原始檔案
![image](https://hackmd.io/_uploads/BJknMKQXR.png)

加密後，若沒加上解密的，可發現內容變成亂碼，無法正常讀取
![image](https://hackmd.io/_uploads/r10ZHtQXA.png)

加密後，加上解密的，即可讀出內容
![image](https://hackmd.io/_uploads/S1EwvnQQC.png)

## 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);

```