========这个问题有多少人遇到过,想过?谁能给出解释,算是帮了大忙了! ========
下面这段程序,相信很多读过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中还会出现加密后的内容?
问题点数:200、回复次数:33Top
1 楼hackate(兰花开香入梦境,独思佳人亦飘然!!)回复于 2005-06-03 09:45:49 得分 2
先做个标记。回来看看。。Top
2 楼LaoDai_Net(『老代』)回复于 2005-06-03 09:49:50 得分 2
关注Top
3 楼brando_beat(Eの懒龙)回复于 2005-06-03 09:52:01 得分 2
markTop
4 楼TCat(蚊子)回复于 2005-06-03 09:53:35 得分 2
研究一下Top
5 楼qingyun1020(星期零)回复于 2005-06-03 09:55:09 得分 2
学习一下Top
6 楼ye_zi(行到水穷处·坐看云起时)回复于 2005-06-03 09:55:38 得分 2
markTop
7 楼CCsdnCC(学研)回复于 2005-06-03 09:59:44 得分 2
难道是新的世界未解之迷?太牛了。研究一下。Top
8 楼gengxin_914(星星)回复于 2005-06-03 10:01:41 得分 2
不懂,来学习:)Top
9 楼simon8181()回复于 2005-06-03 10:03:46 得分 2
我觉得是不是因为是整数字节的问题?8,16,32。。。Top
10 楼smoothwood(吾谁与归)回复于 2005-06-03 10:07:03 得分 0
大家有什么想法多讨论呀~~最好给出你们系统的想法~大家一起研究一下嘛~~
这段程序大家可以试一试,看看结果Top
11 楼smoothwood(吾谁与归)回复于 2005-06-03 10:35:37 得分 0
帖子沉得真快!
大家有没有试过这段程序了呀?Top
12 楼rlqiang((不留)戒烟买房中。。。)回复于 2005-06-03 10:39:03 得分 2
回家再研究!Top
13 楼morality(业精于勤,行成于思!)回复于 2005-06-03 10:41:07 得分 2
呵呵,先顶一下!再回去测试看看!Top
14 楼morality(业精于勤,行成于思!)回复于 2005-06-03 10:41:35 得分 2
呵呵,先顶一下!再回去测试看看!Top
15 楼lovelxj(伊斯人,吾谁与归)回复于 2005-06-03 10:43:03 得分 10
流的单位以 8 字母为一单位(一字母等于多少字节大家算算)
我猜的Top
16 楼wangxinghai(我本轻狂)回复于 2005-06-03 10:43:52 得分 3
学习Top
17 楼smoothwood(吾谁与归)回复于 2005-06-03 10:44:26 得分 0
To:lovelxj(爱生活爱芳芳)
谢谢参与,呵呵~~希望有人能够给出一个系统的说明Top
18 楼xu770(我爱鱼儿)回复于 2005-06-03 10:48:15 得分 5
markTop
19 楼saucer(思归)回复于 2005-06-03 10:55:40 得分 120
I am not a Cryptographer, but
1. the reason you see 0 for the first case is because there are some bits left in the stream, call Flush() will not work, you have to call
objCryptoStream.FlushFinalBlock()
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, see
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemsecuritycryptographysymmetricalgorithmclasspaddingtopic.aspTop
20 楼CCsdnCC(学研)回复于 2005-06-03 11:03:05 得分 10
实验了一下,觉得FileStream.Length似乎并不是直接的Writer,只是让CryptoStream利用它的某些函数,然后Microsoft的某个家伙认为应该给FileStream留点什么,于是就来了个OldLength%8。Top
21 楼CCsdnCC(学研)回复于 2005-06-03 11:08:08 得分 0
上面我的回复请忽略。
试了一下Saucer的,是因为没有Flush完。Top
22 楼smoothwood(吾谁与归)回复于 2005-06-03 11:11:58 得分 0
感谢大家的参与~~每次看到思归的答案总能让我心旷神怡,现在了解个大概,我还要去仔细想想思归说的这个SymmetricAlgorithm.Padding
还是不太理解为何要"padded by the block"?这样做有什么意义呀?
如果思归还在,劳驾~~Top
23 楼smoothwood(吾谁与归)回复于 2005-06-03 11:14:17 得分 0
TO:CCsdnCC(学研)
哈哈,为什么要忽略你的回复?看到大家都来参与,非常高兴,感谢大家~只有讨论,才能出真理嘛Top
24 楼renyu732(Sysinfo)回复于 2005-06-03 11:17:11 得分 5
好东西.
先收藏,完了再看...Top
25 楼saucer(思归)回复于 2005-06-03 11:21:14 得分 0
I said I am not a Cryptographer, but DES is a block cipher algorithm, read about the padding here
http://www.di-mgt.com.au/cryptopad.htmlTop
26 楼saucer(思归)回复于 2005-06-03 11:25:03 得分 0
CryptoStream.FlushFinalBlock() 其实是说,你的任务做完了,该Pad就Pad吧Top
27 楼mathsword(梦在流浪)回复于 2005-06-03 11:36:18 得分 5
又空看看Top
28 楼smoothwood(吾谁与归)回复于 2005-06-03 11:38:29 得分 0
好~研究一下,然后该Pad就Pad,呵呵Top
29 楼hanguoji84(北飘)回复于 2005-06-03 11:40:09 得分 3
估计是不是像楼上有为兄弟说的流的最低以一个8字节为一个单位如果在8就不会显示流的大小,但数据或内容还是存在于流中,这样数据也一样会被加密,只是在实际观察中观察不到!
保持关注Top
30 楼amethyst8989(紫水晶)回复于 2005-06-03 14:31:54 得分 4
upTop
31 楼zhangqiushui(水)回复于 2005-06-03 14:42:59 得分 4
认真研究下
顶Top
32 楼jimmyzhu25(勿以分少而不为,勿以分多而为之)回复于 2005-06-03 15:01:41 得分 4
MarkTop
33 楼renyu732(Sysinfo)回复于 2005-06-03 15:25:12 得分 3
upTop




