Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: 大灰狼1976

[分享] 【关于EXCEL VBA代码加密的一些思考】

[复制链接]
发表于 2021-9-10 14:14 | 显示全部楼层
大灰狼1976 发表于 2021-9-10 11:19
6楼效果不难的,只要修改一下加解密语句,限定编码在汉字范围内就行。

老师能帮给个简单示例码?编码这块有点懵
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
回复

使用道具 举报

发表于 2021-9-13 12:49 | 显示全部楼层
老师您好,我这样想的,不知能否实现:
1、字符串原文:任意字符串:中文、字母大小写、数字、特殊字符等
2、替换字符串:"一二三四五六七八九十O",可以自定义
3、加密密码窜:任意字符
4、可以根据加密密码还原为原文
谢谢  老师能帮做个简单例子吗
回复

使用道具 举报

 楼主| 发表于 2021-9-14 12:05 | 显示全部楼层
常用字符和汉字少说也有数千个,仅靠10个汉字数字是没办法一一对应的,能转换过去,但无法正确转换回来,所以需要参考电脑的字符编码规则,几个字符合成一组来处理,这个不难实现,但加密后的字符数会是原字符数的数倍。
回复

使用道具 举报

 楼主| 发表于 2021-9-14 20:15 | 显示全部楼层
02761752696 发表于 2021-9-13 12:49
老师您好,我这样想的,不知能否实现:
1、字符串原文:任意字符串:中文、字母大小写、数字、特殊字符等
...

我对字符编码也了解不深,如果你有兴趣的话,我来在我知识范围内简单说明一下,可能内容会有点长。

转码的实现方法探讨:
<先不谈加密,仅讨论转码处理,因为加密是单独的过程,可以在转码处理前先调用>
1、基本知识
  字符串在VBA中实际上等同于一个字节数组(Byte型数组),为了加深印象,我们测试以下示例:
  Sub 基本知识()
    Dim s() As Byte
    s = "基本知识说明123"
    MsgBox s(0) & "," & s(1)
    MsgBox s
  End Sub
  运行代码可以看到,既可以通过数组方式获取元素值,也能直接以字符串形式读取,既然知道字符
  串基本等价于字节数组,那么我们直接建立一个字节数组并赋值也能得到相应的字符串,通过上面
  的示例可以看到s(0)和s(1)的值分别为250,87,我们来做以下测试:
  Sub 建立字符串数组()
    Dim s(1) As Byte
    s(0) = 250
    s(1) = 87
    MsgBox s
  End Sub
  运行后弹出消息框“基”,验证正确。好了,我们现在知道了通过数值也能创建字符串。


回复

使用道具 举报

 楼主| 发表于 2021-9-14 20:54 | 显示全部楼层
本帖最后由 大灰狼1976 于 2021-9-14 21:20 编辑

2、转码逻辑
  通过刚才上面的示例我们可以了解到,字符串内的字符编码规则为每个字符占两个字节(256,256),
  要用11个转码符表示某个字符的话,需要使用多个转换符组合来表示一个原字符,具体计算如下:
  假设转换符为:“一二三四五六七八九十〇”,共11个字符(当然我们可以修改,但至少需要两个)
  使用11个转换符的话,LOG(256*256,11)=4.625,也就是说,至少需要5个转换符来表示一个原字符。
  (上述步骤可以用代码实现自适应长度)
  以下为简单示例:
  假设我们有一个字符串,其中只有一个字符“关”,这个字符在字节数组中的值为s(0)=115,s(1)=81
  把两个字节转换成十进制数为20851(注意高低位反转:81*256+115),它的转换处理过程如下:
  1)初值20851 mod 11得到6,然后20851\11得到1895;
  2)继续1895 mod 11得到3,然后1895\11得到172;
  3)继续172 mod 11得到7,然后172\11得到15;
  4)继续15 mod 11得到4,然后15\11得到1。
  5)继续1 mod 11得到1,小于11结束。
  按顺序我们得到6、3、7、4、1(当然也可以倒过来,反正算法都是自己编的,怎么都行),不足5个数
  的用0补足。此数字串对应的转换符(注意首位要从0开始数)为:七四八五二,也即“关”转码后会变成
  “七四八五二”。
  看上去理论上没有任何障碍,可以实际编写代码测试。

3、逆转码逻辑
  接下来我们看一下如何逆转换(转换符和上面必须一致):
  结果字符串每5位表示原字符串中的一个字符,找出此5位各自在转换符中的位置(注意首位要从0开始数),
  得到一个数字串6、3、7、4、1,逆计算过程:6*11^0+3*11^1+7*11^2+4*11^3+1*11^4,顺利得到
  原来的编码20851,接下来要把20851分成两个字节:20851 mod 256得到115,20851\256得到81,
  根据高低位原则,115放在前字节,81放到后字节。
  我们来验证一下结果是否正确:
  Sub test_1()
    Dim s(1) As Byte
    s(0) = 115
    s(1) = 81
    MsgBox s
    [a1] = CStr(s)  '注意输出至单元格区域时必须加CStr()
  End Sub
  得到结果“关”,正确。

4、总结
  此转码和逆转码过程逻辑清晰,虽然没有写完整程序,但基本认为可以实现无损转码和逆转码功能,再配合
加密功能,完全可以实现保密传输混淆信息,但它同时也有两个缺点:
  1)发送密文时必须提供解密密码和转换符,缺一不可;
  2)较短的转换符生成的密文长度可能会是原文的数倍,转换符越长生成的密文越短,但不可能比原文更短。
在我有时间的时候我会写一个较为完整的示例。



回复

使用道具 举报

发表于 2021-9-15 09:28 | 显示全部楼层
大灰狼1976 发表于 2021-9-14 20:54
2、转码逻辑
  通过刚才上面的示例我们可以了解到,字符串内的字符编码规则为每个字符占两个字节(256,256 ...

谢谢  老师的讲解,真细致,感觉好像明白了点,呵呵,我先研究研究,期待您的完整示例。
回复

使用道具 举报

 楼主| 发表于 2021-9-15 11:00 | 显示全部楼层
02761752696 发表于 2021-9-15 09:28
谢谢  老师的讲解,真细致,感觉好像明白了点,呵呵,我先研究研究,期待您的完整示例。

示例我已经做好了,晚上会发出来,自我感觉还算可以。
回复

使用道具 举报

发表于 2021-9-15 13:31 | 显示全部楼层
大灰狼1976 发表于 2021-9-15 11:00
示例我已经做好了,晚上会发出来,自我感觉还算可以。

非常感谢 ,期待  
回复

使用道具 举报

 楼主| 发表于 2021-9-15 19:55 | 显示全部楼层

附件请测试。

字符串加解密.zip

19.18 KB, 下载次数: 31

回复

使用道具 举报

发表于 2021-9-16 08:37 | 显示全部楼层

谢谢  老师,辛苦您了,发现点问题,不知是不是转换规则的原因:1、就是用您的原文转换时,将转换符换成:
【土士王干十白百办半贝本必丙秉卜不才册叉长厂车臣承尺斥虫丑出川串垂匆寸大歹丹刀弟电刁丁东斗儿而耳二凡方飞丰夫弗甫父丐干甘戈个】

这些时,逆转结果的里面【式】字不对,变成【廙】了。
2、转换符为:单纯数字不能运行;
3、转换符为:大小写字母时,逆转结果出错,看图片
4、转换符为:大小写字母加数字时,逆转结果出错,看图片
请问是什么原因,规则我还没理解透。。
001.jpg
002.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-19 13:19 , Processed in 0.312531 second(s), 8 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表