public EncryptedStream(Stream output, NpaEntry entry, EncryptionScheme scheme, int arc_key) { m_read_mode = false; m_encrypted_length = GetEncryptedLength(entry, scheme.TitleId); int key = NpaOpener.GetKeyFromEntry(entry, scheme, arc_key); m_stream = output; m_encrypted = new Lazy <byte[]> (() => new byte[m_encrypted_length]); m_base_pos = m_stream.Position; byte[] decrypt_table = NpaOpener.GenerateKeyTable(scheme); byte[] encrypt_table = new byte[256]; for (int i = 0; i < 256; ++i) { encrypt_table[decrypt_table[i]] = (byte)i; } if (NpaTitleId.LAMENTO == scheme.TitleId) { Encrypt = (i, x) => encrypt_table[(x + key) & 0xff]; } else { Encrypt = (i, x) => encrypt_table[(x + key + i) & 0xff]; } }
public EncryptedStream(NpaArchive arc, NpaEntry entry) { m_read_mode = true; m_encrypted_length = GetEncryptedLength(entry, arc.Scheme.TitleId); if (m_encrypted_length > entry.Size) { m_encrypted_length = (int)entry.Size; } int key = NpaOpener.GetKeyFromEntry(entry, arc.Scheme, arc.Key); m_stream = arc.File.CreateStream(entry.Offset, entry.Size); m_encrypted = new Lazy <byte[]> (() => InitEncrypted(key, arc.Scheme.TitleId, arc.KeyTable)); m_base_pos = m_stream.Position; }