extern "C" void __stdcall XP3ArchiveAttractFilter_v2(
unsigned __int32 hash,
unsigned __int64 offset, void * buffer, long bufferlen)
{
for (int index = 0; index < bufferlen; ++index)
{
if (index < 100)
((unsigned char*)buffer)[index] ^= 1;
}
}
void TVP_tTVPXP3ArchiveExtractionFilter_CONVENTION
TVPXP3ArchiveExtractionFilter(tTVPXP3ExtractionFilterInfo *info)
{
if(info->SizeOfSelf != sizeof(tTVPXP3ExtractionFilterInfo))
{
TVPThrowExceptionMessage(TJS_W("Incompatible tTVPXP3ExtractionFilterInfo size"));
}
for(tjs_uint index = 0; index < info->BufferSize; ++index)
{
if (index < 100)
((unsigned char *)info->Buffer)[index] ^= 1;
}
}
此外,解密函数(被指定为 TVPSetXP3ArchiveExtractionFilter 的函数)
要能够对一个文件中任意偏移值开始的,任意大小的数据包进行解密,此外
必须保证每次调用解密函数都能够在调用返回的时候得到结果。也就是说,
超过这个界限的加密方法,例如说“交换字节顺序”一类依赖于前后字节的
加密方法都不能够被使用。
这些限制对于加密函数也一样适用。
从现实的角度来说,大概可以理解为只能够使用“对每个字节进行异或、加
减”一类的算法。
但是,因为每个字节、每个数据块都拥有不同的偏移值,每个文件拥有不同
的散列(Hash)值,所以可以按照偏移值、散列值进行一些局部性的加密,
也就是不同的字节、不同的文件,可以使用不同的加密方式。