如何播放加密的swf在c# [英] How to play encrypted swf in c#
本文介绍了如何播放加密的swf在c#的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何在c#中播放加密的swf。我使用 des算法加密该swf。
How to play encrypted swf in c#. I used des algorithm to encrypt that swf. How can I play it without create file.
这是我的代码...
sKey = "tharu123";
sInputFilename = "D:\\Main.swf";
FileStream fsInput = new FileStream(sInputFilename, FileMode.Open, FileAccess.Read);
MemoryStream stm = new MemoryStream();
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
ICryptoTransform desencrypt = DES.CreateDecryptor();
CryptoStream cryptostream = new CryptoStream(stm, desencrypt, CryptoStreamMode.Write);
//byte[] bytearrayinput = new byte[fsInput.Length];
//fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
//cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
BinaryWriter writer = new BinaryWriter(cryptostream);
writer.Write(cryptostream.Length);
writer.Write(0x55665566);
stm.Seek(0, SeekOrigin.Begin);
axShockwaveFlash1.OcxState = new AxHost.State(stm, 1, false, null);
fsInput.Close();
这不行。
推荐答案
我已经创建了一个类,用于加密文件和解密文件和流。
I have created a class for you to encrypt to file and decrypt to file and stream.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace DES_Encryption
{
class DES_Class
{
public static void EncryptAndSaveFile(string InputFilePath, string OutputFilePath, byte[] Key, byte[] IV)
{
if (((InputFilePath.Length <= 0 || InputFilePath == null) || (Key.Length <= 0 || Key == null) || (IV.Length <= 0 || IV == null)))
throw new Exception("All Values must be filled");
using (FileStream fileCrypt = new FileStream(OutputFilePath, FileMode.Create))
{
using (DESCryptoServiceProvider encrypt = new DESCryptoServiceProvider())
{
using (CryptoStream cs = new CryptoStream(fileCrypt, encrypt.CreateEncryptor(Key, IV), CryptoStreamMode.Write))
{
using (FileStream fileInput = new FileStream(InputFilePath, FileMode.Open))
{
int data;
while ((data = fileInput.ReadByte()) != -1)
cs.WriteByte((byte)data);
}
}
}
}
}
public static void DecryptAndSaveFile(string InputFilePath, string OutputFilePath, byte[] Key, byte[] IV)
{
if (((InputFilePath.Length <= 0 || InputFilePath == null) || (OutputFilePath.Length <= 0 || OutputFilePath == null)
|| (Key.Length <= 0 || Key == null) || (IV.Length <= 0 || IV == null)))
throw new Exception("All Values must be filled");
using (FileStream fileCrypt = new FileStream(OutputFilePath, FileMode.Create))
{
using (DESCryptoServiceProvider decrypt = new DESCryptoServiceProvider())
{
using (CryptoStream cs = new CryptoStream(fileCrypt, decrypt.CreateDecryptor(Key, IV), CryptoStreamMode.Write))
{
using (FileStream fileInput = new FileStream(InputFilePath, FileMode.Open))
{
int data;
while ((data = fileInput.ReadByte()) != -1)
cs.WriteByte((byte)data);
}
}
}
}
}
public static byte[] DecryptFileAndReturnStream(string InputFilePath, byte[] Key, byte[] IV)
{
if (((InputFilePath.Length <= 0 || InputFilePath == null) || (Key.Length <= 0 || Key == null) || (IV.Length <= 0 || IV == null)))
throw new Exception("All Values must be filled");
using (MemoryStream stream = new MemoryStream())
{
using (DESCryptoServiceProvider decrypt = new DESCryptoServiceProvider())
{
using (CryptoStream cs = new CryptoStream(stream, decrypt.CreateDecryptor(Key, IV), CryptoStreamMode.Write))
{
using (FileStream fileInput = new FileStream(InputFilePath, FileMode.Open))
{
int data;
while ((data = fileInput.ReadByte()) != -1)
cs.WriteByte((byte)data);
}
}
}
return stream.ToArray();
}
}
public static byte[] StringToByteArray(string cipher)
{
byte[] ByteArray = Encoding.ASCII.GetBytes(cipher);
return ByteArray;
}
public static string ByteArrayToString(byte[] arr)
{
string ASCII = Encoding.ASCII.GetString(arr);
return ASCII;
}
}
}
您需要创建一个控件对于您的Flashfiles,例如(Form.Designer.cs)中的示例:
You need to create a control for your Flashfiles for example like this(in Form.Designer.cs):
private AxShockwaveFlashObjects.AxShockwaveFlash AxShockwaveFlash1;
this.AxShockwaveFlash1 = new AxShockwaveFlashObjects.AxShockwaveFlash();
//
// AxShockwaveFlash1
//
this.AxShockwaveFlash1.Enabled = true;
this.AxShockwaveFlash1.Location = new System.Drawing.Point(6, 19);
this.AxShockwaveFlash1.Name = "AxShockwaveFlash1";
this.AxShockwaveFlash1.Size = new System.Drawing.Size(643, 294);
this.AxShockwaveFlash1.TabIndex = 0;
最后,您可以使用以下代码加载Flash文件(信用到tyranid ):
Finally you can load the flash file with following code (Credit to tyranid):
private void Button_Decrypt_Click(object sender, EventArgs e)
{
byte[] Key = DES_Class.StringToByteArray(TextBox_Encrypt_Key.Text);
byte[] IV = DES_Class.StringToByteArray(TextBox_Encrypt_IV.Text);
byte[] str = DES_Class.DecryptFileAndReturnStream(TextBox_Encrypt_OuputFilePath.Text,Key, IV);
InitFlashMovie(str);
}
private void InitFlashMovie(byte[] swfFile)
{
using (MemoryStream stm = new MemoryStream())
{
using (BinaryWriter writer = new BinaryWriter(stm))
{
/* Write length of stream for AxHost.State */
writer.Write(8 + swfFile.Length);
/* Write Flash magic 'fUfU' */
writer.Write(0x55665566);
/* Length of swf file */
writer.Write(swfFile.Length);
writer.Write(swfFile);
stm.Seek(0, SeekOrigin.Begin);
/* 1 == IPeristStreamInit */
AxShockwaveFlash1.OcxState = new AxHost.State(stm, 1, true, null);
}
}
}
在这里你可以得到Demoproject : LINK
Here you can get the Demoproject: LINK
这里有一个较小的项目(只有解密): LINK
Here you got a smaller project(only decryption): LINK
这篇关于如何播放加密的swf在c#的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文