Visual Studio.net 2008开发ActiveX过程与总结
1 : 前言
最近因为公司需要,让我研究一下ActiveX控件,主要实现触摸屏的银行帐号,密码输入,效果如下图所示
2: 开发过程注意事项
2.1 简介
整个方案包括三个项目,分别是
1.Avantouch.Platform.ActiveX(WindowsFormsControlLibrary)
2. Avantouch.Platform.ActiveX.Clent(Web Application)
3. Avantouch.Platform.ActiveX.Setup(安装项目)
其中ActiveX项目是主要程序,所有ActiveX实现程序都在这里。Clent项目是一个Web应用程序,用于测试ActiveX。Setup是一个安装项目,用于安装ActiveX。
2.2 关键设置
1 ActiveX项目的 Assembly.cs中的特殊设置:
[assembly: ComVisible(true)]
2 如下图所示 在ActiveXa项目的属性设置里找到Build 勾选Regester for COM Interop,
3 Setup项目的项目输出是ActiveX项目
4 在Client项目页面可以通过这样的方式来使用ActiveX控件
其中Setup.exe就是安装项目生成的exe文件,如上面所示,只需将生成的Setup.exe文件放到网页文件同一目录当中即可
在页面中,可以用Javascript来调用ActiveX控件的方法, 如
var objKey = document.getElementById("txt_PublicKey");
var EnString = document.getElementById("Avantouch.ActiveX").ReturnEncryptString(objKey.value);
document.getElementById("txt_EnString").value = EnString;
window.location.href = "TestActiveX.aspx?Enstring=" + URLencode(EnString) + "&PrivateKey=" + document.getElementById("txt_PrivateKey").value + "";
}
其中 document.getElementById("Avantouch.ActiveX").ReturnEncryptString(objKey.value);就是调用ActiveX提供的方法ReturnEncryptString
完整的页面源文件是
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
<script type="text/javascript">
function AlertDesString() {
var objKey = document.getElementById("txt_PublicKey");
var EnString = document.getElementById("Avantouch.ActiveX").ReturnEncryptString(objKey.value);
document.getElementById("txt_EnString").value = EnString;
window.location.href = "TestActiveX.aspx?Enstring=" + URLencode(EnString) + "&PrivateKey=" + document.getElementById("txt_PrivateKey").value + "";
}
function URLencode(sStr) {
return escape(sStr).replace(/\+/g, '%2B').replace(/\"/g, '%22').replace(/\'/g, '%27').replace(/\//g, '%2F');
}
</script>
</head>
<body background="Image/信用卡效果图.jpg">
<form name="frm" id="frm" runat="server"
style="background-image: url('Image/确认.png')">
<table width = "100%" style="position:absolute;top:199px;left:4px">
<tr >
<td colspan="5">
</td>
</tr>
<tr>
<td width="26%"></td>
<td colspan="4">
<object classid="clsid:3CFCF47C-D783-4e7c-8E18-A839D2E45271" codebase="setup.exe#version=1.0.0.0" width="700" height="262" id="Avantouch.ActiveX"></object>
</td>
</tr>
<tr>
<td >
</td>
<td colspan="4" align="right">
<br />
<br />
<input type="button" value="" onclick="AlertDesString()"
style="background-position: center center; background-image: url('Image/确认.png'); width:123px; height:60px" />
</td>
</tr>
<tr >
<td>
</td>
<td colspan="4">
</td>
</tr>
</table>
<table style="display:none" >
<tr>
<td> <input type="button" value="产生公钥,私钥" onclick="setFocus()" /></td>
<td> 公钥 </td>
<td> <asp:TextBox ID="txt_PublicKey" runat="server"></asp:TextBox> </td>
<td> 私钥 </td>
<td> <asp:TextBox ID="txt_PrivateKey" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td> <input type="button" value="产生公钥加密后的字符串" onclick="AlertDesString()" /></td>
<td> </td>
<td> <asp:TextBox ID="txt_EnString" runat="server"></asp:TextBox> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> <asp:Button ID="Button1" runat="server" onclick="Button1_Click"
Text="用私钥解密后的字符串" />
</td>
<td> </td>
<td> <asp:TextBox ID="txt_Password" runat="server"></asp:TextBox> </td>
<td> </td>
<td>
<asp:TextBox ID="txt_NoPassword" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td> </td>
<td></td>
</tr>
<tr>
<td> </td>
<td></td>
</tr>
</table>
</form>
</body>
</html>
3 RSA加密的使用
{
try
{
string publicKey = "";
string privateKey = "";
CspParameters RSAParams = new CspParameters();
RSAParams.Flags = CspProviderFlags.UseMachineKeyStore;
RSACryptoServiceProvider provider = new RSACryptoServiceProvider(1024, RSAParams);
//privateKey = provider.ToXmlString(true); //产生私月
//publicKey = provider.ToXmlString(false); //产生公钥
privateKey = "<RSAKeyValue><Modulus>uaFIi4mmm5M/jUZPIXtFtMRMVwmk1/7RSD2YTdf5KlbnOcZgkZXmgS2nI79zF+F+59Z3OcrOh3gA/mzw5laGt+N+sFe787tGKZf0iOptbd5x7KJhUHrCytjVigtmkTnRcz70M7O4iNfQwCSzq7s7uNbuxhcXJ/wxJE3VX0KYSB0=</Modulus><Exponent>AQAB</Exponent><P>4l++gQOt6tt8vdaGlB+XoGKEwtZvCSxWGnUl3bBiiLbYUKrVxq9GVKqfAvk/Z+v9+txj//s1U+3BbSz1QAOc/Q==</P><Q>0ex8HaSk54ZaV/4Knxz49uZjV3NTYe5ti3SSpT/1rZnZmZ3L+5rGhLel9rrsshQ4npSI/HOxiXi0kabuXkjRoQ==</Q><DP>10MUdLp694of5KXK86/XD7yfYmdmzuJKPn6Hs3e3OyokKRFKl9S0nG5jJwC9OqU+rv5EWXcYDudXt+m4jVbiQQ==</DP><DQ>iVF+pw1qaaDzPBgL7qVPHoL6fNwNsUP8GHs66in6lYLMWrZkFsPaFDrlr437A0pC90kGis1LVzfENnrR9o7/wQ==</DQ><InverseQ>K7fJEUZwk7DvDLLY433MS+1aSYhIYbwRwYXR73PfOh+PfdVDFO2ajYD87NlTQh6OmHvLPecVTJx4z5zqghgTog==</InverseQ><D>QPtix+Yx+rg7QRthzBi5OCSXjMiFek9rt9xIGsgGI3o0i5cUayKMhKAUqID2q19263W6WvLSBb5OqsI8OoYDtncjNO7LHkMo2nFO+4qXgn7MrxdtF4AHlC2RO9KHgEHnqsYXIYng4WsaBefxdR5eFKOuEHgyeklrLkXeAQhsvQE=</D></RSAKeyValue>"; //产生私月
publicKey = "<RSAKeyValue><Modulus>uaFIi4mmm5M/jUZPIXtFtMRMVwmk1/7RSD2YTdf5KlbnOcZgkZXmgS2nI79zF+F+59Z3OcrOh3gA/mzw5laGt+N+sFe787tGKZf0iOptbd5x7KJhUHrCytjVigtmkTnRcz70M7O4iNfQwCSzq7s7uNbuxhcXJ/wxJE3VX0KYSB0=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"; //产生公钥
//私钥 64位编码
byte[] bytes = Encoding.Default.GetBytes(privateKey);
string strPrivateKey = Convert.ToBase64String(bytes);
txt_PrivateKey.Text = strPrivateKey;
//公钥 64位编码
byte[] bytes2 = Encoding.Default.GetBytes(publicKey);
string strPublicKey = Convert.ToBase64String(bytes2);
txt_PublicKey.Text = strPublicKey;
}
catch (Exception exception)
{
throw exception;
}
}
private void GenerationKey()
{
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
string privateKey = provider.ToXmlString(true);
string publicKey = provider.ToXmlString(false);
// string encodeString = Encrypt("1234567");
// lb1.Text = encodeString;
// string decode = Decrypt(encodeString);
// lb2.Text = decode;
}
/// <summary>
/// 解密
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button1_Click(object sender, EventArgs e)
{
byte[] bytes = Encoding.Default.GetBytes(txt_PrivateKey.Text);
bytes = Convert.FromBase64String(txt_PrivateKey.Text);
string strKey = Encoding.Default.GetString(bytes);
byte[] bytes2 = Encoding.Default.GetBytes(txt_EnString.Text);
bytes2 = Convert.FromBase64String(txt_PrivateKey.Text);
string strKey2 = Encoding.Default.GetString(bytes2);
txt_Password.Text = Decrypt(txt_EnString.Text, strKey);
}
/// <summary>
///
/// </summary>
/// <param name="base64code">待加密字符串</param>
/// <param name="publicKey">公钥</param>
/// <returns></returns>
public string Decrypt(string base64code, string publicKey)
{
try
{
//Create a UnicodeEncoder to convert between byte array and string.
UnicodeEncoding ByteConverter = new UnicodeEncoding();
CspParameters RSAParams = new CspParameters();
RSAParams.Flags = CspProviderFlags.UseMachineKeyStore;
// RSAParams.Flags = Cspp
//Create a new instance of RSACryptoServiceProvider to generate
//public and private key data.
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(1024, RSAParams);
// RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
RSA.FromXmlString(publicKey);
byte[] encryptedData; ;
byte[] decryptedData;
// Response.Write("<script> alert('" + base64code + "'); </script>");
encryptedData = Convert.FromBase64String(base64code);
//Pass the data to DECRYPT, the private key information
//(using RSACryptoServiceProvider.ExportParameters(true),
// Response.Write("<script> alert('" + encryptedData.Count().ToString() + "'); </script>");
//and a boolean flag specifying no OAEP padding.
// Response.Write("<script> alert('" + ByteConverter.GetString(encryptedData) + "'); </script>");
decryptedData = RSADecrypt(encryptedData, RSA.ExportParameters(true), false);
// Response.Write("<script> alert('0'); </script>");
//Display the decrypted plaintext to the console.
if(decryptedData != null)
{
return ByteConverter.GetString(decryptedData);
}
return "Password Error";
}
catch (Exception exc)
{
//Exceptions.LogException(exc);
// Console.WriteLine(exc.Message);
return exc.Message;
}
}
/// <summary>
///
/// </summary>
/// <param name="toEncryptString">待解密字符串</param>
/// <param name="PrivateKey">私钥</param>
/// <returns></returns>
public string Encrypt(string toEncryptString, string PrivateKey)
{
try
{
//Create a UnicodeEncoder to convert between byte array and string.
UnicodeEncoding ByteConverter = new UnicodeEncoding();
//Create byte arrays to hold original, encrypted, and decrypted data.
byte[] dataToEncrypt = ByteConverter.GetBytes(toEncryptString);
byte[] encryptedData;
byte[] decryptedData;
CspParameters RSAParams = new CspParameters();
RSAParams.Flags = CspProviderFlags.UseMachineKeyStore;
//Create a new instance of RSACryptoServiceProvider to generate
//public and private key data.
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(1024, RSAParams);
RSA.FromXmlString(PrivateKey);
//Pass the data to ENCRYPT, the public key information
//(using RSACryptoServiceProvider.ExportParameters(false),
//and a boolean flag specifying no OAEP padding.
encryptedData = RSAEncrypt(dataToEncrypt, RSA.ExportParameters(false), false);
string base64code = Convert.ToBase64String(encryptedData);
return base64code;
}
catch (Exception exc)
{
//Catch this exception in case the encryption did
//not succeed.
//Exceptions.LogException(exc);
// Console.WriteLine(exc.Message);
return "";
}
}
private byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
{
try
{
//Create a new instance of RSACryptoServiceProvider.
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
//Import the RSA Key information. This only needs
//toinclude the public key information.
RSA.ImportParameters(RSAKeyInfo);
//Encrypt the passed byte array and specify OAEP padding.
//OAEP padding is only available on Microsoft Windows XP or
//later.
return RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
}
//Catch and display a CryptographicException
//to the console.
catch (CryptographicException e)
{
//Exceptions.LogException(e);
Console.WriteLine(e.Message);
return null;
}
}
private byte[] RSADecrypt(byte[] DataToDecrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
{
try
{
//Create a new instance of RSACryptoServiceProvider.
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
//Import the RSA Key information. This needs
//to include the private key information.
RSA.ImportParameters(RSAKeyInfo);
//Decrypt the passed byte array and specify OAEP padding.
//OAEP padding is only available on Microsoft Windows XP or
//later.
return RSA.Decrypt(DataToDecrypt, DoOAEPPadding);
}
//Catch and display a CryptographicException
//to the console.
catch (CryptographicException e)
{
//Exceptions.LogException(e);
// Console.WriteLine(e.Message);
txt_NoPassword.Text = e.Message;
// Response.Write("<script> alert('"+ e.Message +"'); </script>");
return null;
}
}