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)
.如果真结束
|
运行结果:
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。如果你想了解更多相关内容请查看下面相关链接