private byte[] ComputeOwnerKey(byte[] userPad, byte[] ownerPad)
{
byte[] ownerKey = new byte[32];
byte[] digest = DigestAlgorithms.Digest("MD5", ownerPad);
if (revision == STANDARD_ENCRYPTION_128 || revision == AES_128) {
byte[] mkey = new byte[keyLength / 8];
// only use for the input as many bit as the key consists of
for (int k = 0; k < 50; ++k)
Array.Copy(DigestAlgorithms.Digest("MD5", digest, 0, mkey.Length), 0, digest, 0, mkey.Length);
Array.Copy(userPad, 0, ownerKey, 0, 32);
for (int i = 0; i < 20; ++i) {
for (int j = 0; j < mkey.Length ; ++j)
mkey[j] = (byte)(digest[j] ^ i);
rc4.PrepareARCFOURKey(mkey);
rc4.EncryptARCFOUR(ownerKey);
}
}
else {
rc4.PrepareARCFOURKey(digest, 0, 5);
rc4.EncryptARCFOUR(userPad, ownerKey);
}
return ownerKey;
}