Cryptreeのdemo実装
機能
鍵の生成
鍵のリンク
ノードの追加
フォルダ、サブフォルダ、ファイル
ファイル名、ファイルのURI
暗号化、復号化
テスト
code:demo.py
# import os
from cryptography.fernet import Fernet
class CryptTree:
def __init__(self, name, controller_did, parent=None, location_uri=None,filename=None):
self.name = name
self.controller_did = controller_did # cryptreeを制御するDID
self.parent = parent
self.location_uri = location_uri
self.filename = filename
self.DKf = Fernet.generate_key() # Data Key
self.BKf = Fernet.generate_key() # Backlink Key
self.SKf = Fernet.generate_key() # Subfo,lder Key
self.FKf = Fernet.generate_key() # File Key
self.CKf = Fernet.generate_key() # Clearance Key (Optional)
self.accessors = {} # Users who can access this node
if parent:
# If this node has a parent, link all keys to the parent's keys
self.BKf = parent.BKf
self.SKf = parent.SKf
self.FKf = parent.FKf
self.CKf = parent.CKf
def grant_access(self, user):
user.keysself.name = (self.DKf, self.BKf, self.SKf, self.FKf, self.CKf) def revoke_access(self, user):
if user.name in self.accessors:
class User:
def __init__(self, name):
self.name = name
self.keys = {}
class File(CryptTree):
def __init__(self, name, data, parent=None, location_uri=None, filename=None):
super().__init__(name, parent,location_uri=location_uri,filename=filename)
self.data = data
def encrypt_data(self):
f = Fernet(self.DKf)
encrypted_data = f.encrypt(self.data.encode())
return encrypted_data
def decrypt_data(self, encrypted_data):
f = Fernet(self.DKf)
decrypted_data = f.decrypt(encrypted_data).decode()
return decrypted_data
class Folder(CryptTree):
def __init__(self, name, parent=None):
super().__init__(name, parent)
self.files = []
self.folders = []
def add_file(self, file):
self.files.append(file)
file.parent = self
file.BKf = self.BKf
file.CKf = self.CKf
def add_folder(self, folder):
self.folders.append(folder)
folder.parent = self
folder.BKf = self.BKf
folder.CKf = self.CKf
# テスト用の関数
def main():
user1 = User("User1")
user2 = User("User2")
controller_did = "did:key:xyz"
root_folder = Folder("Root", controller_did)
folder1 = Folder("Folder1", parent=root_folder)
file1 = File("File1", "Data of File1", parent=folder1, location_uri="ipfs://CID1", filename="document.txt")
folder1.add_file(file1)
root_folder.add_folder(folder1)
folder2 = Folder("Folder2", parent=root_folder)
file2 = File("File2", "Data of File2", parent=folder2)
folder2.add_file(file2)
root_folder.add_folder(folder2)
folder1.grant_access(user1)
folder2.grant_access(user2)
print("User1's keys:", user1.keys)
print("User2's keys:", user2.keys)
# ファイルの暗号化と復号化のテスト
encrypted_data = file1.encrypt_data()
print("Encrypted data:", encrypted_data)
decrypted_data = file1.decrypt_data(encrypted_data)
print("Decrypted data:", decrypted_data)
if __name__ == "__main__":
main()
多分ある程度Cryptreeのために必要な機能などは出来たっぽいYudai.icon*2 鍵のリンクやノードが持つ情報とかも出来たYudai.icon
DIDの持ち主がCryptreeの全権限が持てるようにルートノードと紐づけた
ルートノードの鍵を知っている = 全ノードにアクセス可能
2023/8/11
上記のコードはまだ圧倒的に足りないことが分かったYudai.icon
それぞれのクラス(file, folder)に鍵の生成などはされているけど、結局鍵は役割は果たしていない
そこでBKfから順に機能させるために行った
これは親フォルダ、親サブフォルダの名前をBKfで暗号化を行う
そしてこの鍵は一つ上の階層のフォルダが所持している
SKfとFKfに役割を持たせる
SKf: サブフォルダのメタデータの暗号化
ファイル名、作成日時
FKf: フォルダのメタデータの暗号化
メタデータの内容
ファイル名、作成日時、保存場所