[英]Can't decrypt video using C# and Rijndael
我無法解密使用Rijndael加密的視頻文件。 看一下我的加密例程:
using (FileStream _streamInput = new FileStream(inputPath,FileMode.Open,FileAccess.Read)) {
using (FileStream _streamOutput = new FileStream(outputPath,FileMode.Create,FileAccess.Write)) {
RijndaelManaged _cryptoRM = new RijndaelManaged();
UnicodeEncoding _encodingUnicode = new UnicodeEncoding();
byte[] _key = _encodingUnicode.GetBytes(String.IsNullOrEmpty(customPassword)?_mediaPass:customPassword);
using (CryptoStream _streamCrypto = new CryptoStream(_streamOutput,
_cryptoRM.CreateEncryptor(_key,_key),
CryptoStreamMode.Write)) {
long _bufferLength = _streamInput.Length;
if (_bufferLength>_encryptedBlock) {
byte[] _encryptedBuffer = new byte[_encryptedBlock];
byte[] _unencryptedBufferBlock = new byte[_encryptedBlock];
// encrypted block
_streamInput.Read(_encryptedBuffer,0,(int)_encryptedBlock);
_streamCrypto.Write(_encryptedBuffer,0,(int)_encryptedBlock);
// rest
int _readBytesCount = 0;
while ((_readBytesCount=_streamInput.Read(_unencryptedBufferBlock,0,_encryptedBlock))!=0) {
_streamOutput.Write(_unencryptedBufferBlock,0,(int)_readBytesCount);
}
}
_streamCrypto.Dispose();
}
_cryptoRM.Dispose();
_streamOutput.Dispose();
}
_streamInput.Dispose();
}
這是我的解密例程:
using (FileStream _streamInput = new FileStream(inputPath, FileMode.Open, FileAccess.Read))
{
using (FileStream _streamOutput = new FileStream(outputPath, FileMode.Create, FileAccess.Write))
{
RijndaelManaged _cryptoRM = new RijndaelManaged();
UnicodeEncoding _encodingUnicode = new UnicodeEncoding();
byte[] _key = _encodingUnicode.GetBytes(PrepareEncryptionKey(String.IsNullOrEmpty(customPassword)?_mediaPass:customPassword,""));
try
{
using (CryptoStream _streamCrypto = new CryptoStream(_streamInput, _cryptoRM.CreateDecryptor(_key, _key), CryptoStreamMode.Read))
{
try
{
int _readBytesCount = 0;
//encrypted block
byte[] _buffer = new byte[_encryptedBlock];
byte[] _bufferUnencrypted = new byte[_encryptedBlock];
int decrypt_length = _streamCrypto.Read(_buffer, 0, _encryptedBlock);
_streamOutput.Write(_buffer, 0, decrypt_length);
// rest
while ((_readBytesCount = _streamInput.Read(_bufferUnencrypted, 0, _encryptedBlock)) != 0)
{
_streamOutput.Write(_bufferUnencrypted, 0, _readBytesCount);
}
}
catch { }
_streamCrypto.Dispose();
}
}
catch { }
_cryptoRM.Dispose();
_streamOutput.Dispose();
}
_streamInput.Dispose();
}
其他要點:-沒有引發任何錯誤,但視頻根本無法播放。 -解密文件的大小與加密文件的大小相同。
編輯 :
private static string PrepareEncryptionKey(string key, string part)
{
if (part == "")
{
if (key.Length != 8)
{
return key.PadRight(8, '~');
}
else
{
return key;
}
}
else
{
if (key.Length != (8 - part.Length))
{
if (key.Length > (8 - part.Length))
{
return key.Substring(0, (8 - part.Length)) + part;
}
else
{
return key.PadRight((8 - part.Length), '~') + part;
}
}
else
{
return key + part;
}
}
}
看來您的兩種方法都需要修復:
1 /加密部分-您不能將輸出數據直接寫入_streamOutput,而只能寫入_streamCrypto。 否則,您將准確地寫出從輸入文件中獲取的內容。 按照您的原始代碼,您將只加密第一塊數據。
while ((_readBytesCount = _streamInput.Read(_unencryptedBufferBlock, 0, encryptedBlockSize)) != 0)
{
_streamCrypto.Write(_unencryptedBufferBlock, 0, (int)_readBytesCount);
}
2 /解密部分-您不能直接從輸入流中讀取,而只能從_streamCrypto中讀取
while ((_readBytesCount = _streamCrypto.Read(_bufferUnencrypted, 0, encryptedBlockSize)) != 0)
{
_streamOutput.Write(_bufferUnencrypted, 0, _readBytesCount);
}
3 /在加密和解密方法中均應使用PrepareEncryptionKey方法。 這樣可以確保兩種方法都相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.