下面这段程序,相信很多读过ASP.NET技术内幕这本书的朋友都很熟悉,是讲对称加密的,为了测试方便,我用WINDOW FORM测试了这段程序,程序如下:
Const DESKEY As String = "ABCDEFGH"
Const DESIV As String = "HGFEDCBA"
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim arrDesKey As Byte()
Dim arrDesIV As Byte()
Dim arrinput As Byte()
Dim objFileStream As FileStream
Dim objEDS As DESCryptoServiceProvider
Dim objEncryptor As ICryptoTransform
Dim objCryptoStream As CryptoStream
arrDesKey = Convert2Byte(DESKEY)
arrDesIV = Convert2Byte(DESIV)
arrinput = Convert2Byte(TextBox1.Text) '注意这个地方①
objEDS = New DESCryptoServiceProvider
objEncryptor = objEDS.CreateEncryptor(arrDesKey, arrDesIV)
objFileStream = New FileStream("d:\test.txt", FileMode.Create, FileAccess.Write)
objCryptoStream = New CryptoStream(objFileStream, objEncryptor, CryptoStreamMode.Write)
objCryptoStream.Write(arrinput, 0, arrinput.Length)
'Console.WriteLine(objCryptoStream.Position)
Console.WriteLine(objFileStream.Length) '注意这个地方②
objCryptoStream.Close()
End Sub
Private Function Convert2Byte(ByVal strInput As String) As Byte()
Dim arrChar() As Char
arrChar = strInput.ToCharArray
Dim arrByte(arrChar.Length - 1) As Byte
For i As Integer = 0 To arrByte.Length - 1
arrByte(i) = Convert.ToByte(arrChar(i))
Next
Return arrByte
End Function
无论文本框中输入多长的字符串,程序执行都完全正常,在D盘下面也生成了test.txt这个文件,打开这个文件,里边也有加过密的内容(一些乱码),同时经过测试,test.txt中的内容也能够被很好的解密,一切看起来都很正常。
现在请注意②处,我的疑问在这里,当①处文本框中输入的内容(需要加密的内容)小于8个字母,那么②处输出的流的长度竟然是0,打开生成的test.txt文件,里边同样有被加密过后的内容;当文本框中输入的字母长度大于8小于16时,输出流的长度一直为8,当输入字母长度大于16小于32时,输出流长度一直为16,以此类推现在我非常不解,为何会出现这种现象,特别是当输入字母长度小于8时,为何FileStream流的长度为0?既然流的长度为0,为何test.txt中还会出现加密后的内容?
Const DESKEY As String = "ABCDEFGH"
Const DESIV As String = "HGFEDCBA"
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim arrDesKey As Byte()
Dim arrDesIV As Byte()
Dim arrinput As Byte()
Dim objFileStream As FileStream
Dim objEDS As DESCryptoServiceProvider
Dim objEncryptor As ICryptoTransform
Dim objCryptoStream As CryptoStream
arrDesKey = Convert2Byte(DESKEY)
arrDesIV = Convert2Byte(DESIV)
arrinput = Convert2Byte(TextBox1.Text) '注意这个地方①
objEDS = New DESCryptoServiceProvider
objEncryptor = objEDS.CreateEncryptor(arrDesKey, arrDesIV)
objFileStream = New FileStream("d:\test.txt", FileMode.Create, FileAccess.Write)
objCryptoStream = New CryptoStream(objFileStream, objEncryptor, CryptoStreamMode.Write)
objCryptoStream.Write(arrinput, 0, arrinput.Length)
'Console.WriteLine(objCryptoStream.Position)
Console.WriteLine(objFileStream.Length) '注意这个地方②
objCryptoStream.Close()
End Sub
Private Function Convert2Byte(ByVal strInput As String) As Byte()
Dim arrChar() As Char
arrChar = strInput.ToCharArray
Dim arrByte(arrChar.Length - 1) As Byte
For i As Integer = 0 To arrByte.Length - 1
arrByte(i) = Convert.ToByte(arrChar(i))
Next
Return arrByte
End Function
无论文本框中输入多长的字符串,程序执行都完全正常,在D盘下面也生成了test.txt这个文件,打开这个文件,里边也有加过密的内容(一些乱码),同时经过测试,test.txt中的内容也能够被很好的解密,一切看起来都很正常。
现在请注意②处,我的疑问在这里,当①处文本框中输入的内容(需要加密的内容)小于8个字母,那么②处输出的流的长度竟然是0,打开生成的test.txt文件,里边同样有被加密过后的内容;当文本框中输入的字母长度大于8小于16时,输出流的长度一直为8,当输入字母长度大于16小于32时,输出流长度一直为16,以此类推现在我非常不解,为何会出现这种现象,特别是当输入字母长度小于8时,为何FileStream流的长度为0?既然流的长度为0,为何test.txt中还会出现加密后的内容?
解决方案 »
- 多数据表导出一个excel工作表中
- 调用组件出错
- 为什么我点击ButtonColumn的按钮会出现这个惊天大错误!请务必帮忙>0<!
- 菜鸟问题2-求救!
- 一个想不通的问题,请大家看看
- 请问这种类型的数据库显示怎么做?
- AdRotator(广告循环器)怎么不能循环播放广告啊?
- 提个筛选数据后在datalist中显示的问题
- 怎么做到aspx页面模板可插拔?
- 在.net环境下用拖控件的方式连接数据库出现的错误~,在线等~
- 高手解释一下<a href="">ddd</a>,Response.Redirect,Server.Transfer,Server.Execute四种导航方式的使用时机,及比较
- 都说两个月[学习asp.net(C#)]就可以"出家"了,我为什么不行呢?请指教.
谢谢参与,呵呵~~希望有人能够给出一个系统的说明
Console.WriteLine(objFileStream.Length) 2. the reason you see 8,16,24,.... because DES algorithm is padded by the block, the block length is 64 bits --> 8 bytes, seehttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemsecuritycryptographysymmetricalgorithmclasspaddingtopic.asp
试了一下Saucer的,是因为没有Flush完。
还是不太理解为何要"padded by the block"?这样做有什么意义呀?
如果思归还在,劳驾~~
哈哈,为什么要忽略你的回复?看到大家都来参与,非常高兴,感谢大家~只有讨论,才能出真理嘛