Add DieselmineCrypt (untested)

This commit is contained in:
2026-04-09 11:08:59 +08:00
parent f50d8e2fd1
commit c97c085225
2 changed files with 141 additions and 46 deletions

View File

@@ -155,6 +155,10 @@
"$type": "HashCrypt", "$type": "HashCrypt",
"Title": "ばぁばとママとの超熟母娘丼 ~3世代での家庭内エッチ~ | 爱你深至夏海蔚蓝" "Title": "ばぁばとママとの超熟母娘丼 ~3世代での家庭内エッチ~ | 爱你深至夏海蔚蓝"
}, },
"Bakunyuu Oyakodon": {
"$type": "DieselmineCrypt",
"Title": "爆乳母娘丼 ~仕事先の親子が寝取りやすそうな件~"
},
"Bakuretsu Otome Sexy Mary": { "Bakuretsu Otome Sexy Mary": {
"$type": "CxEncryption", "$type": "CxEncryption",
"Mask": 531, "Mask": 531,
@@ -414,6 +418,10 @@
"ControlBlockName": "gakuen.bin", "ControlBlockName": "gakuen.bin",
"Title": "学園特救ホトケンサー" "Title": "学園特救ホトケンサー"
}, },
"Ganki Tengoku": {
"$type": "DieselmineCrypt",
"Title": "顔騎天国"
},
"Gisobo, Choukyou Chuu": { "Gisobo, Choukyou Chuu": {
"$type": "HashCrypt", "$type": "HashCrypt",
"Title": "義祖母、調教中。 ~仲良しの秘訣はSMです。~" "Title": "義祖母、調教中。 ~仲良しの秘訣はSMです。~"
@@ -671,6 +679,10 @@
"ControlBlockName": "hoshikoi.bin", "ControlBlockName": "hoshikoi.bin",
"Title": "星恋*ティンクル | 星恋*twinkle | 星恋*闪烁" "Title": "星恋*ティンクル | 星恋*twinkle | 星恋*闪烁"
}, },
"Hoshoku Game 2 ~Sayonara, Marunomi~": {
"$type": "DieselmineCrypt",
"Title": "捕食ゲーム2~さようなら。丸呑み~"
},
"Ichizu ni Zettai Fukujuu na Imouto": { "Ichizu ni Zettai Fukujuu na Imouto": {
"$type": "HashCrypt", "$type": "HashCrypt",
"Title": "一途に絶対服従な妹をめちゃくちゃにしてみた ~愛欲兄妹~" "Title": "一途に絶対服従な妹をめちゃくちゃにしてみた ~愛欲兄妹~"
@@ -755,6 +767,10 @@
"ControlBlockName": "island.bin", "ControlBlockName": "island.bin",
"Title": "アイランドダイアリー" "Title": "アイランドダイアリー"
}, },
"Itsu de mo Onna no Ko ni Seieki...": {
"$type": "DieselmineCrypt",
"Title": "いつでも女の子に精液大量注入!して褒められる世界"
},
"Japanese School Life": { "Japanese School Life": {
"$type": "CxEncryption", "$type": "CxEncryption",
"Mask": 697, "Mask": 697,
@@ -950,6 +966,10 @@
"Key": 105, "Key": 105,
"Title": "恋し彩る正義爛漫" "Title": "恋し彩る正義爛漫"
}, },
"Koko wa Suki na Dake Sex Shite": {
"$type": "DieselmineCrypt",
"Title": "ここは好きなだけセックスして、みんなに喜ばれる世界!"
},
"Kokoro no Katachi to Iro to Oto": { "Kokoro no Katachi to Iro to Oto": {
"$type": "XorCrypt", "$type": "XorCrypt",
"Key": 247, "Key": 247,
@@ -963,6 +983,10 @@
"$type": "HashCrypt", "$type": "HashCrypt",
"Title": "紅炎の守護騎士キシャル~Guardian of Prominence Kishar~" "Title": "紅炎の守護騎士キシャル~Guardian of Prominence Kishar~"
}, },
"Kouki na Ojou-sama o Katappashi kara...": {
"$type": "DieselmineCrypt",
"Title": "高貴なお嬢様を片っ端から孕ませたら、どうなるか?"
},
"Kourin no Machi, Lavender no Shoujo": { "Kourin no Machi, Lavender no Shoujo": {
"$type": "CxEncryption", "$type": "CxEncryption",
"Mask": 385, "Mask": 385,
@@ -1016,6 +1040,10 @@
"ControlBlockName": "love_laby.bin", "ControlBlockName": "love_laby.bin",
"Title": "らぶ+らび" "Title": "らぶ+らび"
}, },
"M-days Doukoku no Koubi Jigoku": {
"$type": "DieselmineCrypt",
"Title": "M-days 慟哭の交尾地獄"
},
"Mahoutsukai no Yoru": { "Mahoutsukai no Yoru": {
"$type": "CxEncryption", "$type": "CxEncryption",
"Mask": 554, "Mask": 554,
@@ -1067,10 +1095,18 @@
"$type": "HashCrypt", "$type": "HashCrypt",
"Title": "愛娘は、マゾ性隷 ~娘だからって遠慮しないでね?~" "Title": "愛娘は、マゾ性隷 ~娘だからって遠慮しないでね?~"
}, },
"Me ga Sametara Seieki ga 100 Bai...": {
"$type": "DieselmineCrypt",
"Title": "目が覚めたら精液が100倍溜まる身体になってた→大量注入!"
},
"Megami Ryoujoku ~Paizuri Hime Verdandi~": { "Megami Ryoujoku ~Paizuri Hime Verdandi~": {
"$type": "FlyingShineCrypt", "$type": "FlyingShineCrypt",
"Title": "女神凌辱 ~パイズリ姫ベルダンディー~" "Title": "女神凌辱 ~パイズリ姫ベルダンディー~"
}, },
"Mesuga* Choukyou": {
"$type": "DieselmineCrypt",
"Title": "メスガ●調教~デカチンに屈した少女たち~"
},
"Minarai Taimashi Maji de Ikimasu!": { "Minarai Taimashi Maji de Ikimasu!": {
"$type": "HashCrypt", "$type": "HashCrypt",
"Title": "見習い退魔師 本気でイキますっ!" "Title": "見習い退魔師 本気でイキますっ!"
@@ -1219,6 +1255,10 @@
"$type": "FlyingShineCrypt", "$type": "FlyingShineCrypt",
"Title": "おまな2 おまえんち萌えてるぞ" "Title": "おまな2 おまえんち萌えてるぞ"
}, },
"Omoikkiri! Seieki Tairyou Chuunyuu!": {
"$type": "DieselmineCrypt",
"Title": "思いっきり! 精液大量注入! ~高飛車女をアヘらせろ!~"
},
"Onaji Class no Idol-san. Around me is full by a celebrity.": { "Onaji Class no Idol-san. Around me is full by a celebrity.": {
"$type": "XorCrypt", "$type": "XorCrypt",
"Key": 232, "Key": 232,
@@ -1261,6 +1301,10 @@
"$type": "HashCrypt", "$type": "HashCrypt",
"Title": "俺の妹は今日からドS ~お、お兄ちゃんなんか、あたしのペットにしてやるんだからっ~" "Title": "俺の妹は今日からドS ~お、お兄ちゃんなんか、あたしのペットにしてやるんだからっ~"
}, },
"Ore no Saimin Fantasia": {
"$type": "DieselmineCrypt",
"Title": "俺の催眠ファンタジア ~エロ催眠で戦女神から魔王までハメ放題!!~"
},
"Ore no Sugata ga, Toumei ni!? Invisible to Suuki na Unmei": { "Ore no Sugata ga, Toumei ni!? Invisible to Suuki na Unmei": {
"$type": "XorCrypt", "$type": "XorCrypt",
"Key": 149, "Key": 149,
@@ -1502,6 +1546,10 @@
"$type": "HashCrypt", "$type": "HashCrypt",
"Title": "せがれの新妻" "Title": "せがれの新妻"
}, },
"Seieki Tairyou Chuunyuu! 5": {
"$type": "DieselmineCrypt",
"Title": "精液大量注入!5~オレの高飛車な美少女ご主人様がこんなに盛大にアヘるわけがない!?~"
},
"Seiin no Meikyuu": { "Seiin no Meikyuu": {
"$type": "CxEncryption", "$type": "CxEncryption",
"Mask": 531, "Mask": 531,
@@ -1535,6 +1583,10 @@
"ControlBlockName": "senren_banka.bin", "ControlBlockName": "senren_banka.bin",
"Title": "千恋*万花 | 千戀*萬花" "Title": "千恋*万花 | 千戀*萬花"
}, },
"Serifu de Kanjite! Seiyuu Doushi": {
"$type": "DieselmineCrypt",
"Title": "セリフで感じて!声優どうし"
},
"Shikijou Kyoudan": { "Shikijou Kyoudan": {
"$type": "HashCrypt", "$type": "HashCrypt",
"Title": "色情教団 | 妃神会秘史" "Title": "色情教団 | 妃神会秘史"
@@ -1738,6 +1790,10 @@
"$type": "HashCrypt", "$type": "HashCrypt",
"Title": "徹底アナル恥育 ~こっちが、気持ち良すぎて…~" "Title": "徹底アナル恥育 ~こっちが、気持ち良すぎて…~"
}, },
"The3Days -15-nin Renzoku Rape-": {
"$type": "DieselmineCrypt",
"Title": "The3Days -15人連続レイプ-"
},
"Toaru Jukujo no Hentai Choukyou": { "Toaru Jukujo no Hentai Choukyou": {
"$type": "HashCrypt", "$type": "HashCrypt",
"Title": "とある熟女の変態調教 ~老いてなお滴る秘蜜と悦楽~" "Title": "とある熟女の変態調教 ~老いてなお滴る秘蜜と悦楽~"
@@ -1768,6 +1824,10 @@
"$type": "HashCrypt", "$type": "HashCrypt",
"Title": "妻と息子にバレてはいけない背徳の媚熱 ~あやまちの密愛2~" "Title": "妻と息子にバレてはいけない背徳の媚熱 ~あやまちの密愛2~"
}, },
"Tsundere Itoko to Koakuma ...": {
"$type": "DieselmineCrypt",
"Title": "ツンデレ従姉妹と小悪魔な姪が可愛すぎるので、エロ教育して孕ませちゃうお話"
},
"Tsuyuchiru Letter ~Umi to Shiori ni Amaoto o~": { "Tsuyuchiru Letter ~Umi to Shiori ni Amaoto o~": {
"$type": "CxEncryption", "$type": "CxEncryption",
"Mask": 592, "Mask": 592,

View File

@@ -160,6 +160,7 @@ enum CryptType {
}, },
SeitenCrypt, SeitenCrypt,
OkibaCrypt, OkibaCrypt,
DieselmineCrypt,
} }
#[derive(Clone, Debug, Deserialize)] #[derive(Clone, Debug, Deserialize)]
@@ -247,6 +248,7 @@ impl Schema {
)?), )?),
CryptType::SeitenCrypt => Box::new(SeitenCrypt::new(self.base.clone())), CryptType::SeitenCrypt => Box::new(SeitenCrypt::new(self.base.clone())),
CryptType::OkibaCrypt => Box::new(OkibaCrypt::new(self.base.clone())), CryptType::OkibaCrypt => Box::new(OkibaCrypt::new(self.base.clone())),
CryptType::DieselmineCrypt => Box::new(DieselmineCrypt::new(self.base.clone())),
}) })
} }
} }
@@ -508,52 +510,61 @@ impl<R: Read> Read for MizukakeCryptReader<R> {
} }
} }
#[derive(Debug)] macro_rules! seek_crypt_filehash_key_u8_base_impl {
pub struct HashCrypt { ($crypt:ident, $reader:ident) => {
base: BaseSchema, #[derive(Debug)]
pub struct $crypt {
base: BaseSchema,
}
impl $crypt {
pub fn new(base: BaseSchema) -> Self {
Self { base }
}
}
impl Crypt for $crypt {
base_schema_impl!();
fn decrypt_supported(&self) -> bool {
true
}
fn decrypt_seek_supported(&self) -> bool {
true
}
fn decrypt<'a>(
&self,
entry: &Xp3Entry,
cur_seg: &Segment,
stream: Box<dyn Read + 'a>,
) -> Result<Box<dyn ReadDebug + 'a>> {
Ok(Box::new($reader::new(
stream,
cur_seg,
entry.file_hash as u8,
)))
}
fn decrypt_with_seek<'a>(
&self,
entry: &Xp3Entry,
cur_seg: &Segment,
stream: Box<dyn ReadSeek + 'a>,
) -> Result<Box<dyn ReadSeek + 'a>> {
Ok(Box::new($reader::new(
stream,
cur_seg,
entry.file_hash as u8,
)))
}
}
};
} }
impl HashCrypt { macro_rules! seek_crypt_filehash_key_u8_impl {
pub fn new(base: BaseSchema) -> Self { ($crypt:ident,$reader:ident<$t:ident>) => {
Self { base } seek_crypt_filehash_key_u8_base_impl!($crypt, $reader);
} seek_reader_key_impl!($reader<$t>, u8);
};
} }
impl Crypt for HashCrypt { seek_crypt_filehash_key_u8_impl!(HashCrypt, HashCryptReader<T>);
base_schema_impl!();
fn decrypt_supported(&self) -> bool {
true
}
fn decrypt_seek_supported(&self) -> bool {
true
}
fn decrypt<'a>(
&self,
entry: &Xp3Entry,
cur_seg: &Segment,
stream: Box<dyn Read + 'a>,
) -> Result<Box<dyn ReadDebug + 'a>> {
Ok(Box::new(HashCryptReader::new(
stream,
cur_seg,
entry.file_hash as u8,
)))
}
fn decrypt_with_seek<'a>(
&self,
entry: &Xp3Entry,
cur_seg: &Segment,
stream: Box<dyn ReadSeek + 'a>,
) -> Result<Box<dyn ReadSeek + 'a>> {
Ok(Box::new(HashCryptReader::new(
stream,
cur_seg,
entry.file_hash as u8,
)))
}
}
seek_reader_key_impl!(HashCryptReader<T>, u8);
impl<R: Read> Read for HashCryptReader<R> { impl<R: Read> Read for HashCryptReader<R> {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> { fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
@@ -729,13 +740,13 @@ macro_rules! seek_crypt_filehash_key_base_impl {
} }
macro_rules! seek_crypt_filehash_key_impl { macro_rules! seek_crypt_filehash_key_impl {
($crypt:ident,$reader:ident<$t:ident>,$key:ty) => { ($crypt:ident,$reader:ident<$t:ident>) => {
seek_crypt_filehash_key_base_impl!($crypt, $reader); seek_crypt_filehash_key_base_impl!($crypt, $reader);
seek_reader_key_impl!($reader<$t>, $key); seek_reader_key_impl!($reader<$t>, u32);
}; };
} }
seek_crypt_filehash_key_impl!(SeitenCrypt, SeitenCryptReader<T>, u32); seek_crypt_filehash_key_impl!(SeitenCrypt, SeitenCryptReader<T>);
impl<R: Read> Read for SeitenCryptReader<R> { impl<R: Read> Read for SeitenCryptReader<R> {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> { fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
@@ -764,7 +775,7 @@ impl<R: Read> Read for SeitenCryptReader<R> {
} }
} }
seek_crypt_filehash_key_impl!(OkibaCrypt, OkibaCryptReader<T>, u32); seek_crypt_filehash_key_impl!(OkibaCrypt, OkibaCryptReader<T>);
impl<R: Read> Read for OkibaCryptReader<R> { impl<R: Read> Read for OkibaCryptReader<R> {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> { fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
@@ -801,6 +812,30 @@ impl<R: Read> Read for OkibaCryptReader<R> {
} }
} }
seek_crypt_filehash_key_u8_impl!(DieselmineCrypt, DieselmineCryptReader<T>);
impl<R: Read> Read for DieselmineCryptReader<R> {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
let readed = self.inner.read(buf)?;
let key = self.key as i32;
for (i, t) in (&mut buf[..readed]).iter_mut().enumerate() {
let offset = self.seg_start + self.pos + i as u64;
let key = if offset < 123 {
21 * key
} else if offset < 246 {
-32 * key
} else if offset < 369 {
43 * key
} else {
-54 * key
} as u8;
*t ^= key;
}
self.pos += readed as u64;
Ok(readed)
}
}
#[test] #[test]
fn test_deserialize_crypt() { fn test_deserialize_crypt() {
for (key, schema) in CRYPT_SCHEMA.iter() { for (key, schema) in CRYPT_SCHEMA.iter() {