From b02e033873d447fb18c23f3bea87cc182723803b Mon Sep 17 00:00:00 2001 From: lifegpc Date: Fri, 10 Apr 2026 14:04:42 +0800 Subject: [PATCH] Add ExaCrypt (untested) --- msg_tool_xp3data/crypt.json | 4 ++++ src/scripts/kirikiri/archive/xp3/crypt/mod.rs | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/msg_tool_xp3data/crypt.json b/msg_tool_xp3data/crypt.json index 0bda33f..1af4cd1 100644 --- a/msg_tool_xp3data/crypt.json +++ b/msg_tool_xp3data/crypt.json @@ -1425,6 +1425,10 @@ "$type": "HashCrypt", "Title": "女体化パニック! ~オンナのコのカラダってキモチイイ~" }, + "Oazuke Fetish!": { + "$type": "ExaCrypt", + "Title": "おあずけフェティッシュ!" + }, "Ochiteiku Wakazuma Maiko": { "$type": "NephriteCrypt", "Title": "堕ちていく若妻麻衣子" diff --git a/src/scripts/kirikiri/archive/xp3/crypt/mod.rs b/src/scripts/kirikiri/archive/xp3/crypt/mod.rs index c59d0fe..797e27e 100644 --- a/src/scripts/kirikiri/archive/xp3/crypt/mod.rs +++ b/src/scripts/kirikiri/archive/xp3/crypt/mod.rs @@ -180,6 +180,7 @@ enum CryptType { StripeCrypt { key: u8, }, + ExaCrypt, } #[derive(Clone, Debug, Deserialize)] @@ -281,6 +282,7 @@ impl Schema { CryptType::AkabeiCrypt { seed } => Box::new(AkabeiCrypt::new(self.base.clone(), *seed)), CryptType::HaikuoCrypt => Box::new(HaikuoCrypt::new(self.base.clone())), CryptType::StripeCrypt { key } => Box::new(StripeCrypt::new(self.base.clone(), *key)), + CryptType::ExaCrypt => Box::new(ExaCrypt::new(self.base.clone())), }) } } @@ -1192,6 +1194,21 @@ impl Read for StripeCryptReader { } } +seek_crypt_filehash_key_impl!(ExaCrypt, ExaCryptReader); + +impl Read for ExaCryptReader { + fn read(&mut self, buf: &mut [u8]) -> std::io::Result { + let readed = self.inner.read(buf)?; + let mut shift = ((self.seg_start + self.pos) % 5) as u32; + for t in (&mut buf[..readed]).iter_mut() { + *t ^= (self.key >> shift) as u8; + shift = (shift + 1) % 5; + } + self.pos += readed as u64; + Ok(readed) + } +} + #[test] fn test_deserialize_crypt() { for (key, schema) in CRYPT_SCHEMA.iter() {