private bool CryptHeaderCik(bool encrypt) { if ((!encrypt && CikIsDecrypted) || IsXvcFile) { CikIsDecrypted = true; return(true); } if (!OdkKeyLoaded) { return(false); } var cipher = new AesCipher(OdkKey); if (encrypt) { cipher.EncryptBlock(Header.EncryptedCIK, 0, 0x10, Header.EncryptedCIK, 0); cipher.EncryptBlock(Header.EncryptedCIK, 0x10, 0x10, Header.EncryptedCIK, 0x10); } else { cipher.DecryptBlock(Header.EncryptedCIK, 0, 0x10, Header.EncryptedCIK, 0); cipher.DecryptBlock(Header.EncryptedCIK, 0x10, 0x10, Header.EncryptedCIK, 0x10); } CikIsDecrypted = !encrypt; return(true); }
static byte[] CryptBlock(bool encrypt, byte[] data, int dataOffset, int dataLength, byte[] iv, AesCipher cipher) { var newData = new byte[dataLength]; //if (!encrypt) for (int i = 0; i < dataLength; i++) { newData[i] = (byte)(data[dataOffset + i] ^ iv[i % iv.Length]); } var cryptData = new byte[dataLength]; if (encrypt) { cipher.EncryptBlock(newData, 0, dataLength, cryptData, 0); } else { cipher.DecryptBlock(newData, 0, dataLength, cryptData, 0); } for (int i = 0; i < dataLength; i++) { cryptData[i] = (byte)(cryptData[i] ^ iv[i % iv.Length]); } return(cryptData); }
private void CryptHeaderCik(bool encrypt) { if ((!encrypt && CikIsDecrypted) || IsXvcFile) { CikIsDecrypted = true; return; } if (!OdkKeyLoaded) return; var cipher = new AesCipher(OdkKey); if (encrypt) { cipher.EncryptBlock(Header.EncryptedCIK, 0, 0x10, Header.EncryptedCIK, 0); cipher.EncryptBlock(Header.EncryptedCIK, 0x10, 0x10, Header.EncryptedCIK, 0x10); } else { cipher.DecryptBlock(Header.EncryptedCIK, 0, 0x10, Header.EncryptedCIK, 0); cipher.DecryptBlock(Header.EncryptedCIK, 0x10, 0x10, Header.EncryptedCIK, 0x10); } CikIsDecrypted = !encrypt; }