StegaPy 核心调度与管理类,提供信息隐藏与水印功能的统一对外接口。
| 28 | |
| 29 | |
| 30 | class StegaPy: |
| 31 | """StegaPy 核心调度与管理类,提供信息隐藏与水印功能的统一对外接口。""" |
| 32 | |
| 33 | NAMESPACE = "StegaPy" |
| 34 | |
| 35 | def __init__(self, plugin: StegaPyPlugin, config: StegaPyConfig): |
| 36 | """初始化 StegaPy 实例,绑定核心插件与系统配置。""" |
| 37 | if plugin is None: |
| 38 | raise StegaPyException( |
| 39 | "未指定插件", |
| 40 | StegaPyErrors.NO_PLUGIN_SPECIFIED, |
| 41 | self.NAMESPACE |
| 42 | ) |
| 43 | if config is None: |
| 44 | raise StegaPyException( |
| 45 | "未指定配置", |
| 46 | StegaPyErrors.UNHANDLED_EXCEPTION, |
| 47 | self.NAMESPACE |
| 48 | ) |
| 49 | |
| 50 | self.plugin = plugin |
| 51 | self.config = config |
| 52 | |
| 53 | def embed_data(self, msg: bytes, msg_filename: Optional[str], |
| 54 | cover: Optional[bytes], cover_filename: Optional[str], |
| 55 | stego_filename: Optional[str]) -> bytes: |
| 56 | """将机密信息(Payload)嵌入至载体图像中,并返回隐写后的图像字节流。""" |
| 57 | if Purpose.DATA_HIDING not in self.plugin.get_purposes(): |
| 58 | raise StegaPyException( |
| 59 | "插件不支持数据隐藏", |
| 60 | StegaPyErrors.PLUGIN_DOES_NOT_SUPPORT_DH, |
| 61 | self.NAMESPACE |
| 62 | ) |
| 63 | |
| 64 | try: |
| 65 | # 压缩数据(如果启用) |
| 66 | if self.config.is_use_compression(): |
| 67 | msg = self._compress_data(msg) |
| 68 | |
| 69 | # 加密数据(如果启用) |
| 70 | if self.config.is_use_encryption(): |
| 71 | if not self.config.get_password(): |
| 72 | raise StegaPyException( |
| 73 | "加密需要密码", |
| 74 | StegaPyErrors.INVALID_PASSWORD, |
| 75 | self.NAMESPACE |
| 76 | ) |
| 77 | crypto = CryptoUtil(self.config.get_password(), |
| 78 | self.config.get_encryption_algorithm()) |
| 79 | msg = crypto.encrypt(msg) |
| 80 | |
| 81 | # 使用插件嵌入数据 |
| 82 | return self.plugin.embed_data(msg, msg_filename, cover, |
| 83 | cover_filename, stego_filename) |
| 84 | except StegaPyException: |
| 85 | raise |
| 86 | except Exception as e: |
| 87 | raise StegaPyException(str(e), StegaPyErrors.UNHANDLED_EXCEPTION, self.NAMESPACE) |
no outgoing calls