.NET新手系列(六)

一、遇到的问题:

关于密码体系的初步知识

解决方法:

1对称加密算法

在计算机专网系统中广泛使用的对称加密算法有DESIDEA等。最初的原理包括字母的换位、替换。

 

2不对称加密算法

不对称加密算法有RSA算法和美国国家标准局提出的DSA

 

公开密钥密码体制的基本思想:

加密和解密密钥不同。在算法公开的情况下,在计算上不可能由加密密钥求解出解密密钥,因此加密密钥可以公开,解密密钥由接收方私有保存。即使是加密的一方,也不可能解密。

 

公开密钥密码体制的简单使用流程:

AB两人通信,A欲发消息给B,则利用B的公开密钥加密数据,B获得加密数据后用自己的私有密钥解密,反之类似。

防止否认的作法是:AB两人通信,A欲发消息给B,则利用B的公开密钥加密数据,同时,在数据中附带信息,该信息用A自己的私有密钥加密,B获得后用A的公开密钥解密(只能用A的公开密钥才能解)出正确的附带信息,则证明消息来自A。这即“电子签名”的简单原理,当然,实际要比这复杂得多。

 

RSA的简单示例:

RSA算法的数学基础是大整数分解的困难性。用到数论中的欧拉函数和欧拉定理。

欧拉函数φ(n)的性质:

1、如果p是素数,则φ(p)=p-1

2、如果p是素数,k>=1,则φ(pk)=pk (p-1)

3、对于整数n>=2n=p1e1p2e2 ……pkek,则φ(n)=n(1-1/p1 ) (1-1/p2 )……(1-1/pk )

4、若m1m2互素,则φ(m1m2 )= φ(m1) (m2)

一、密钥生成

随机选取两个大素数(例如200为十进制数)pq

n=pq,则φ(n)=(p-1)(q-1)

选择一个与φ(n)互素的数e,即gcd{φ(n),e}=1

e求出d,满足de º 1modφ(n)

en作为加密密钥(公开密钥)

dn作为解密密钥(私有密钥)

二、对消息M进行分组

将明文Mbit串分组,分组长度L要保证    2L<=n,即L<=log2n。若用m表示分组后的消息的十进制表示,则0m<n 。将明文分组为m1 m2 mr

三、加密

执行运算ci=E(mi)=miemod n i是下标,e是指数)    

四、解密

执行运算mi=D(ci)=cidmod n i是下标,d是指数),合并分组

 

示例:

1、随机选取两个素数p=5q=11

n=55,则φ(n)=4*10=40

选择一个与φ(n)互素的数e=3,即gcd{40,3}=1

e求出d,满足3*d º 1mod40

d=27

 (数比较大时,用扩展欧几里德算法求)

e=3n=55作为加密密钥(公开密钥)

d=27n=55作为解密密钥(私有密钥)

2、分组

空格:00

A01  B02  C03……Z26

假设:明文为HI ——>  08 09

3加密

c1=083mod 55=17 

c2=093mod 55=14

4、解密

m1=1727mod 55=08  

m2=1427mod 55=09

 

可逆变换的证明,看不懂,略

 

关于扩展欧几里德算法、辗转相除求gcd

Gcd{a,b}:

A=b*q1+r1

B=r1*q2+r2

R1=r2*q3+r3

……

Rn-2=Rn-1Qn+Rn

Rn-1=RnQn+1+Rn+1                   n+1为下标)

Rn+10时,则Rn= Gcd{a,b}

 

随机选取两个素数p=43q=59

n=2537,则φ(n)=4*10=2436

选择一个与φ(n)互素的数e=13,即gcd{2436,13}=1

e求出d,满足13*d º 1mod2436d=

243613=1

2436=13*187+5

13= 5 *2+3

5= 1 *3 +2

3= 1 *2 +1

逆向替换:

1=3-1 *2=3-1 *(5-1 *3) =2 *3-1 *5……=937 *13-5*2436

所以,d=937

 

公开密钥密码体制的优点:

1、密钥分发简单。避免加密密钥的保密问题。

2、秘密保存的密钥量减少。网络中的通信方只要保存好自己的私有密钥

 

3不可逆加密算法

不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文。这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。如广泛应用在计算机系统中的口令加密,利用的就是不可逆加密算法。

.net中常用到的MD5算法即为不可逆加密算法,及由美国国家标准局建议的不可逆加密标准SHS(Secure Hash Standard:安全杂乱信息标准)等。

 

 

二、遇到的问题:

关于微软的Application Library的简单使用

解决方法:

新建一个工程

打开Enterprise Library Configuration----File----open application 打开你创建的web项目的web.config文件

左侧窗口的Application上右击----New----Data Access Application Block

主要配置Sql Connection String ,其中Integrated Security指是否使用集成身份验证,如果填false的话,则必须为连接字串配置用户名和密码,方法是:

Sql Connection String 右击,New……

配置完了以后,将在你的工程目录下产生一个文件:dataconfiguration.config

类似的,你还可以添加其他的配置,例如:Exception Handle

 

使用时,在添加对“Configuration”、“Data”的引用,在.cs文件中添加using

using Microsoft.Practices.EnterpriseLibrary.Data;

using Microsoft.Practices.EnterpriseLibrary.Configuration;

使用示例:

              Database db=DatabaseFactory.CreateDatabase();

              string strSQL="select employeeid,firstname,lastname from employees";

              DBCommandWrapper cmd=db.GetSqlStringCommandWrapper(strSQL);

 

              DataSet ds=new DataSet();

              db.LoadDataSet(cmd,ds,"emp");

 

              if(!IsPostBack)

              {

                   this.DataGrid1.DataSource =ds;

                   this.DataGrid1.DataBind();

              }

 

 

 

三、遇到的问题:

关于微软的Application Library使用中出现的异常,“异常详细信息: System.Security.SecurityException: 不允许所请求的注册表访问权。

解决方法:

原因:网上的解释是:企业库的公共项目中:Instrumentation 目录下有操作日志、性能的代码。而这些代码需要一定的权限才可以执行。

Enterprise LibraryFAQs中可以找到答案,有三种解决办法:

1. 运行安装Enterprise Library时安装的“InstallServices.bat”批处理文件。

2. 运行.NETinstallutil程序设置(上面的脚本也是使用installutil命令)。

3. 去掉Common工程中USEWMIUSEEVENTLOGUSEPERFORMANCECOUNTER三个编译参数,重新编译EntLib

用了第3种方法,不行,步骤:

1. Open Start->programs->MS Patterns and Practices -> Ent Lib -> App Blocks -> Ent Lib.Sln.
2. Take your own sweet time to minimize all the folder(s) in ur solution window.
3. Rt Clk on the “Common” project and go to “Properties”
4. In the “Configuration Properties” go to the “Build” option.
5. In the Conditional Build section of the property grid, remove everything except “DEBUG;TRACE”
6. Close everything and recompile.
Remember...on compilation nothing will go to your common bin folder. I just plainly used the “Copy Assemblies to bin directory” option in my Start->programs->MS Patterns and Practices -> Ent Lib part of my menu.

用第1种方法可以解决,第2种没试过。

 

 

四、遇到的问题:

关于MS SQL SERVER中的DATEDIFF(XXX,YYY,ZZZ)函数

解决方法:

示例用法:select * from datetimetest where datediff(dd,curdate,getdate())=0

即找出与系统当前时间相同的记录,精确到日期,“dd”即指出计算curdate,getdate()的日期差,如果指定“mm”,则计算出差几个月。

由于SQL SERVER中日期保留的精度到毫秒级(datetime)或分钟级(smalldatetime),所以当你所需的只是日期的比较时,上面的函数相当有用。

 

 

五、遇到的问题:

几个与数据操作有关的接口及其他:

解决方法:

IDbConnection

IDbCommand

IDataParameter

IDataReader

IDbTransaction

IDbDataAdapter

另:

public sealed class SqlDataAdapter : DbDataAdapter, IDbDataAdapter

 

public sealed class SqlConnection : Component, IDbConnection

 

public sealed class SqlCommand : Component, IDbCommand, ICloneable

 

public sealed class SqlParameter : MarshalByRefObject,

      IDbDataParameter, IDataParameter, ICloneable

 

public sealed class SqlDataReader : MarshalByRefObject,

         IEnumerable, IDataReader, IDisposable, IDataRecord

 

public sealed class SqlTransaction : MarshalByRefObject,

         IDbTransaction, IDisposable

 

以上内容有助于编写通用的数据库操作类

 

 

 

六、遇到的问题:

关于MSSQL存储过程中的字符串

解决方法:

注意单引号:

例:select name as 'employeename' from employee,转成字符串:

@sqlstring='select name as ''employeename'' from employee'

Sql server中单引号在字符串中用两个单引号表示

 

 

 

七、遇到的问题:

关于MSSQL存储过程中的“默认参数”

解决方法:

示例

create proc InventoryIn

@AreaID varchar(50)='',

@RegionID varchar(20)='',

@SeriesID varchar(20)='',

@ItemID varchar(30)=''

as

declare @sqlstring nvarchar(1000)

 

set @sqlstring='select………'

if (@AreaID!='')

begin

         set @sqlstring=@sqlstring+'and FAREA_ID='+@AreaID

end

 

if(@RegionID!='')

begin

         set @sqlstring=@sqlstring+'and FREGION_ID='+@RegionID

end

 

if(@SeriesID!='')

begin

         set @sqlstring=@sqlstring+'and FSERIES_ID='+@SeriesID

end

 

if(@ItemID!='')

begin

         set @sqlstring=@sqlstring+'and FItemId='+@ItemID

end

 

set @sqlstring=@sqlstring+'order by FAREA_ID,FREGION_ID'

 

execute sp_ExecuteSql @sqlstring

则运行该存储过程时,可以不输入参数直接运行,或者输入某些参数,当然如果要输入第二个参数,则第一个参数也必须有。

调用系统存储过程sp_ExecuteSql时要求参数类型一定要为nvarchar型,当然,也可以使用以下的形式:

create proc ExecString

as

declare @sqlstring varchar(100)

set @sqlstring='select * from employees'

execute (@sqlstring)

(注意,若varchar未规定长度,则会提示错误)

 

 

 

八、遇到的问题:

关于SQL中求百分比的方法

解决方法:

示例

Select

cast(cast(ON_HAND_QTY*100/(select sum(ON_HAND_QTY) from #InventoryQtyTemp) as decimal(10,2)) as varchar) +'%'  as  'ON_HAND_QTYPercent'

from #InventoryQtyTemp

当然,在求百分比运算中,可能遇到除零问题,要加些判断:

……..

select @onhand=sum(ON_HAND_QTY) from R_inventoryQty

if(@onhand!=0)

begin

         select

         cast(cast(ON_HAND_QTY*100/(select sum(ON_HAND_QTY) from #InventoryQtyTemp) as decimal(10,2)) as varchar) +'%'  as  'ON_HAND_QTYPercent'

         from #InventoryQtyTemp

end

 

else

begin

         select

         0  as  'ON_HAND_QTYPercent'

         from #InventoryQtyTemp

end

 

 

 

九、遇到的问题:

关于DTS的简单使用

解决方法:

DTS即“数据转换服务”,在MS SQLServer中展开企业管理器左侧的树,即可看见。右击“数据转换服务”,选择“新建包”,可以创建DTS的界面:

1、选择左侧“连接”栏中的“Micorsoft OLE DB Provider for SQL Server”,在弹出的窗口中可以选择数据库等相关项,以之作为“源”。

2、同1,再创建一个“Micorsoft OLE DB Provider for SQL Server”,作为“目的”。

3、在“任务”栏中选择“转换数据任务”(齿轮状图案),依次点击“源”与“目的”,此时会在两者之间形成一条连接线。

4、双击连接线,则会出现相应的设置,例如源表,所要转到的目的表,以及转换规则等等。

5、设置完毕点击保存。

6、返回企业管理器窗口,“数据转换服务”----“本地包”(仅当保存时选择保存到“SQL Server”才会出现在本地包),可以见到刚才创建的包,右击包,选择“调度包”,可以设置定时执行包,能够定时调度也是DTS最有用的一点。当然,在设置调度包之前,需要在“服务管理器”中开启“SQL Server Agent”服务。

7、在创建DTS包时,还可以使用“工作流”,例如可以转换服务执行之前,先执行一段SQL语句,可以选择“任务”栏中的“执行SQL任务”,写入需要执行的语句。然后同时选中右侧窗口中的“执行SQL语句”图标和源数据库图标,选择窗口上方的“工作流”,可以有三种工作流类型。

另外:

设置“源数据库”与“目的数据库”的另一种方法是创建udl文件。创建的方法可以创建文本文件,改后缀为udl即可,设置相应的数据库项。然后在创建DTS的窗口左侧选择“Microsoft Data Link”,选择刚才创建的udl文件即可。

 

 

 

十、遇到的问题:

关于SQL中的日期函数

解决方法:

DatediffDATEDIFF ( datepart , startdate , enddate )

例:select …… where datediff(dd,ON_HAND_DTTM,@datequery)=0可取从年到毫秒的精度,由于SQL Server中日期型存储常保存到毫秒,当需要按天计算时,可以使用类似上式。

 

DatepartDATEPART (datepart , date)

可取从年到毫秒的精度,返回相应部分的数值。

 

YearMonthDay

和上式类似效果。以上各式详细参见SQL Server联机丛书。

posted @ 2006-03-11 15:58  后厂村思维导图馆  阅读(1709)  评论(2编辑  收藏  举报