[英]Can't decrypt video using C# and Rijndael
I can't decrypt a video file that I encrypted it using Rijndael. 我无法解密使用Rijndael加密的视频文件。 Have a look at my encryption routine: 看一下我的加密例程:
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();
}
And this is my decryption routine: 这是我的解密例程:
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();
}
Other points: - No error is being thrown but the video is simply not playing. 其他要点:-没有引发任何错误,但视频根本无法播放。 - The size of the decrypted file is the same of the encrypted file. -解密文件的大小与加密文件的大小相同。
EDIT : 编辑 :
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;
}
}
}
It seems your both methods needs fixes: 看来您的两种方法都需要修复:
1/ encrypt part - you cannot write output data directly to _streamOutput but to _streamCrypto. 1 /加密部分-您不能将输出数据直接写入_streamOutput,而只能写入_streamCrypto。 Otherwise you will write exactly what you have taken from input file. 否则,您将准确地写出从输入文件中获取的内容。 As per your original code, you would encrypt just first block of data. 按照您的原始代码,您将只加密第一块数据。
while ((_readBytesCount = _streamInput.Read(_unencryptedBufferBlock, 0, encryptedBlockSize)) != 0)
{
_streamCrypto.Write(_unencryptedBufferBlock, 0, (int)_readBytesCount);
}
2/ decrypt part - you cannot read from input stream directly but from _streamCrypto 2 /解密部分-您不能直接从输入流中读取,而只能从_streamCrypto中读取
while ((_readBytesCount = _streamCrypto.Read(_bufferUnencrypted, 0, encryptedBlockSize)) != 0)
{
_streamOutput.Write(_bufferUnencrypted, 0, _readBytesCount);
}
3/ PrepareEncryptionKey method should be used in both encryption and decryption method. 3 /在加密和解密方法中均应使用PrepareEncryptionKey方法。 This will ensure you have it same in both methods. 这样可以确保两种方法都相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.