CNA文件加解密數據算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
|
.版本 2 .支持庫 spec .支持庫 iext .程序集 窗口程序集_啟動窗口 .子程序 __啟動窗口_創建完畢 .局部變量 code, 字節集, , , 加密密碼 .局部變量 test, 字節集, , , 要加密碼的數據字節集 .局部變量 i, 整數型, , , 查看反饋信息 ' 簡單例子 test = 到字節集 (“aaaaaaa aaa.*#(中。329}@#¥”) code = 到字節集 (“中。有 3a#”) CNA數據 (test, code, 1) 調試輸出 (到文本 (test)) CNA數據 (test, code, ) 調試輸出 (到文本 (test)) ' 直接用一個文件進行加解密測試。功能完整的。 .子程序 CNA數據, 整數型, , 返回數1表示加密完成,返回0表示解密完成,返回10表示加密或解密碼失敗 .參數 數據集, 字節集, 可空, 要加密的數據集 .參數 密碼集, 字節集, 可空, 要加密的密碼集 .參數 方式, 整數型, 可空, 1是加密,0或省略是解密 .局部變量 j, 整數型, , , 計次變量 .局部變量 i, 整數型, , , 密碼集長度 .局部變量 k, 整數型, , , 數據集長度 .局部變量 lk, 整數型, , , 計算對換對換位置變量 .局部變量 t, 整數型, , , 計算對換對換位置變量 .局部變量 對換位置組, 整數型, , "0", 存放8個位置數據 .局部變量 臨時變量, 字節集, , , 臨時存放變量 .局部變量 密碼疊加量, 整數型, , , 密碼疊加變量 .局部變量 隨機數, 整數型, , , 隨機變量 .局部變量 隨機變量集, 字節集, , , 隨機變量字節集 .局部變量 單個對換位置, 整數型, , , 存放單個對換位置 ' 限制只加密大于大于或等于10字節以上長度的文件,密碼可以和文件一樣長,如果比文件長,那多出部分只能累加到密碼疊加量里,不能在數據集加密中進行混合 ' 小于10字節的文件可自行調整參數和算法 .如果真 (方式 = 1 且 取字節集長度 (數據集) ≥ 10 且 取字節集長度 (密碼集) ≥ 1) ' >>>>>>>>>>>>>加密開始 ' ----------------------------------(1)計算密碼疊加量 j = 取字節集長度 (密碼集) .計次循環首 (j, i) 密碼疊加量 = 密碼集 [i] + 密碼疊加量 + i × 15 .計次循環尾 () lk = 密碼疊加量 ' ---用于計算對換位置時使用 ' ----------------------------------(2)引入固定8位數隨機變量 置隨機數種子 () 隨機數 = 取隨機數 (10000000, 98999999) ' ----------------------------------(3)開始數據集加密 j = 取字節集長度 (密碼集) .計次循環首 (取字節集長度 (數據集), i) ' ------開始加密數據 數據集 [i] = 數據集 [i] + 密碼集 [j] + 密碼疊加量 + 隨機數 j = j - 1 .如果真 (j = 0) j = 取字節集長度 (密碼集) .如果真結束 .計次循環尾 () ' ----------------------------------(4)開始把隨機數轉換隨機變量集加密,再合并到數據集中 隨機數 = 隨機數 + 密碼疊加量 ' ------第一次簡單混合加密 隨機變量集 = 到字節集 (到文本 (隨機數)) j = 取字節集長度 (密碼集) .計次循環首 (取字節集長度 (隨機變量集), i) ' ------開始第二次加密隨機變量集 隨機變量集 [i] = 隨機變量集 [i] + 密碼集 [j] + 密碼疊加量 j = j - 1 .如果真 (j = 0) j = 取字節集長度 (密碼集) .如果真結束 .計次循環尾 () 數據集 = 數據集 + 隨機變量集 ' ------數據集和隨機變量集合并 ' ----------------------------------(5)通過對數據集長度和密碼疊加變量的比例算法求出對換位置 t = 取字節集長度 (數據集) .計次循環首 (8, i) ' ------先通過和密碼疊加變量計算出對應位置 加入成員 (對換位置組, t × lk ÷ (lk + t)) t = t - 1.69 lk = lk × 0.459 .計次循環尾 () ' ----------------------------------(6)開始對換隨機變量集在數據集里的位置 k = 取字節集長度 (數據集) 臨時變量 = 取空白字節集 (1) .計次循環首 (8, i) ' ------ 開始對換 單個對換位置 = 對換位置組 [i] 臨時變量 [1] = 數據集 [單個對換位置] 數據集 [單個對換位置] = 數據集 [k] 數據集 [k] = 臨時變量 [1] k = k - 1 .計次循環尾 () 返回 (1) .如果真結束 .如果真 (方式 = 0 且 取字節集長度 (數據集) ≥ 10 且 取字節集長度 (密碼集) ≥ 1) ' --------------------解密 ' ----------------------------------(1)計算密碼疊加量,和加密部分(1)一樣 j = 取字節集長度 (密碼集) .計次循環首 (j, i) 密碼疊加量 = 密碼集 [i] + 密碼疊加量 + i × 15 .計次循環尾 () lk = 密碼疊加量 ' ---用于計算對換位置時使用 ' ----------------------------------(2)通過對數據集長度和密碼疊加變量的比例算法求出對換位置,和加密碼部分(5)一樣 t = 取字節集長度 (數據集) .計次循環首 (8, i) 加入成員 (對換位置組, t × lk ÷ (lk + t)) t = t - 1.69 lk = lk × 0.459 .計次循環尾 () ' ----------------------------------(3)開始對換隨機變量集在數據集里的位置,并把數據集和隨機變量集切分出來,對換位置和加密部分(6)略有不同 k = 取字節集長度 (數據集) - 7 ' ------ 開始反向對換 臨時變量 = 取空白字節集 (1) .計次循環首 (8, i) 單個對換位置 = 對換位置組 [9 - i] ' ------ 開始反向對換 臨時變量 [1] = 數據集 [單個對換位置] 數據集 [單個對換位置] = 數據集 [k] 數據集 [k] = 臨時變量 [1] k = k + 1 .計次循環尾 () k = 取字節集長度 (數據集) 隨機變量集 = 取字節集右邊 (數據集, 8) ' ------ 分割出隨機變量集 數據集 = 取字節集中間 (數據集, 1, k - 8) ' ------ 分割出數據集 ' ----------------------------------(4)開始解密出隨機數,和加密部分(4)取反向操作 j = 取字節集長度 (密碼集) .計次循環首 (取字節集長度 (隨機變量集), i) 隨機變量集 [i] = 隨機變量集 [i] - 密碼集 [j] - 密碼疊加量 j = j - 1 .如果真 (j = 0) j = 取字節集長度 (密碼集) .如果真結束 .計次循環尾 () 隨機數 = 到數值 (到文本 (隨機變量集)) 隨機數 = 隨機數 - 密碼疊加量 ' ----------------------------------(5)開始解密數據集,和加密部分(3)取反向操作 j = 取字節集長度 (密碼集) .計次循環首 (取字節集長度 (數據集), i) 數據集 [i] = 數據集 [i] - 密碼集 [j] - 密碼疊加量 - 隨機數 j = j - 1 .如果真 (j = 0) j = 取字節集長度 (密碼集) .如果真結束 .計次循環尾 () 返回 (0) .如果真結束 返回 (10) .子程序 _打開文件加密_被單擊 .局部變量 file1, 整數型, , , 要加密的文件號 .局部變量 file2, 整數型, , , 加密后新建的文件號 .局部變量 code, 字節集, , , 要加密碼的密碼 .局部變量 exc, 文本型, , "0", 取文件名格式用 .局部變量 文件長度, 長整數型, , , 要加密的文件大小 .局部變量 循環次數, 整數型, , , 加密循環次數 .局部變量 FSO, 對象, , , 用于讀取文件屬性信息 .局部變量 GetFile, 對象, , , 用于讀取文件屬性信息 .局部變量 temp, 字節集, , , 臨時存放字節集 .局部變量 i, 整數型, , , 提示加密進度用 ' 加密時是以80萬計/次讀入數據的,每次循環加密后的文件都會多出8字節的隨機密匙,所以解密時要以80.008萬/次讀入數據。 code = 到字節集 (密碼編輯框.內容) .如果真 (通用對話框1.打開 ()) file1 = 打開文件 (通用對話框1.文件名, #讀寫, ) FSO.創建 (“Scripting.FileSystemObject”, ) GetFile = FSO.對象型方法 (“GetFile”, 通用對話框1.文件名) 文件長度 = GetFile.讀數值屬性 (“Size”, ) exc = 分割文本 (通用對話框1.文件名, “\”, ) file2 = 打開文件 (取當前目錄 () + “\CNA+” + exc [取數組成員數 (exc)], #改寫, ) 狀態條1.置文本 (0, “狀態:正在加密..”) 狀態條1.置文本 (1, “文件:” + 到文本 (exc [取數組成員數 (exc)])) 循環次數 = 到整數 (文件長度 \ 800000) + 1 .計次循環首 (循環次數, i) temp = 讀入字節集 (file1, 800000) CNA數據 (temp, code, 1) 寫出字節集 (file2, temp) 狀態條1.置文本 (2, “進度:” + 到文本 (取整 (i ÷ 循環次數 × 100)) + “%”) ' -----進度顯示以百分比方式顯現 .計次循環尾 () 狀態條1.置文本 (0, “狀態:加密完成”) 關閉文件 (file2) 關閉文件 (file1) .如果真結束 .子程序 _打開文件解密_被單擊 .局部變量 file1, 整數型, , , 要加密的文件號 .局部變量 file2, 整數型, , , 加密后新建的文件號 .局部變量 code, 字節集, , , 要加密碼的密碼 .局部變量 exc, 文本型, , "0", 取文件名格式用 .局部變量 文件長度, 長整數型, , , 要加密的文件大小 .局部變量 循環次數, 整數型, , , 解密循環次數 .局部變量 FSO, 對象, , , 用于讀取文件屬性信息 .局部變量 GetFile, 對象, , , 用于讀取文件屬性信息 .局部變量 temp, 字節集, , , 臨時存放字節集 .局部變量 i, 整數型, , , 提示加密進度用 ' 注意: 加密時是以80萬計/次讀入數據的,每次循環加密后的文件都會多出8字節的隨機密匙,所以解密時要以80.008萬/次讀入數據。 code = 到字節集 (密碼編輯框.內容) .如果真 (通用對話框1.打開 ()) file1 = 打開文件 (通用對話框1.文件名, #讀寫, ) FSO.創建 (“Scripting.FileSystemObject”, ) GetFile = FSO.對象型方法 (“GetFile”, 通用對話框1.文件名) 文件長度 = GetFile.讀數值屬性 (“Size”, ) exc = 分割文本 (通用對話框1.文件名, “\”, ) file2 = 打開文件 (取當前目錄 () + “\CNA-” + exc [取數組成員數 (exc)], #改寫, ) 狀態條1.置文本 (0, “狀態:正在解密..”) 狀態條1.置文本 (1, “文件:” + 到文本 (exc [取數組成員數 (exc)])) 循環次數 = 到整數 (文件長度 \ 800008) + 1 ' 注意要多出8字節 .計次循環首 (循環次數, i) temp = 讀入字節集 (file1, 800008) ' 看文件大小讀入多少字節,如果文件非常大,則可以通過移動文件指針方式分段進行加密 CNA數據 (temp, code, ) 寫出字節集 (file2, temp) 狀態條1.置文本 (2, “進度:” + 到文本 (取整 (i ÷ 循環次數 × 100)) + “%”) ' -----進度顯示以百分比方式顯現 .計次循環尾 () 狀態條1.置文本 (0, “狀態:解密完成”) 關閉文件 (file1) 關閉文件 (file2) .如果真結束 |
運行結果:
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。如果你想了解更多相關內容請查看下面相關鏈接