# 嵌入式安全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); ```