主题:[讨论]加密 中文字符如何加密后再还原
loongchina
[专家分:90] 发布于 2008-04-23 22:34:00
请
回复列表 (共10个回复)
沙发
我是大喊三 [专家分:3010] 发布于 2008-04-24 01:17:00
一般用密钥来与明文异或吧
板凳
一江秋水 [专家分:9680] 发布于 2008-04-24 07:28:00
1楼说得对,最简单的就是进行异或,这样加密和解密都可以共用一段代码:
Dim DAT() As Byte
DAT = StrConv(Text1.Text, vbFromUnicode)
z1 = InputBox("请输入密钥(≤10个可见的Ascii字符):", "加解密")
If Len(z1) Then
For j = 1 To Len(z1)
k = Asc(Mid(z1, i, 1))
For i = 0 To UBound(DAT): DAT(i) = DAT(i) Xor k: Next
Next
End If
如果是加密,再以保存二进制的方式保存DAT中的数据。
如果是解密,再使用StrConv函数将DAT中的数据变换为字符串后赋给文本框
3 楼
loongchina [专家分:90] 发布于 2008-04-25 19:14:00
二楼你讲的是对的,是其中的一种方法,但是你讲的xor,它只能对字母或者是字符进行加密,但是如果是中文呢,那就不能加密了.给你加20分鼓励分吧
4 楼
我是大喊三 [专家分:3010] 发布于 2008-04-25 19:31:00
[quote]
二楼你讲的是对的,是其中的一种方法,但是你讲的xor,它只能对字母或者是字符进行加密,但是如果是中文呢,那就不能加密了.给你加20分鼓励分吧[/quote]
中文不是一样吗?你动点脑子好吗?
5 楼
loongchina [专家分:90] 发布于 2008-04-25 22:25:00
[quote][quote]
二楼你讲的是对的,是其中的一种方法,但是你讲的xor,它只能对字母或者是字符进行加密,但是如果是中文呢,那就不能加密了.给你加20分鼓励分吧[/quote]
中文不是一样吗?你动点脑子好吗?
[/quote]
你眼睛挣大点好吗?
题目你可看清楚了?你可试了?用此方法,中文是不可加密的,即使加密了,部分中文是不可以还原的,你先试试再发言吧
6 楼
loongchina [专家分:90] 发布于 2008-04-25 22:37:00
另外,2楼那种加密是受限制的,一定就要<=10个可见字符吗?我加密想要用20,50,100等等个字符不行吗?一定要可见的字符吗,我用一个大的数字来加密不行吗?等等这都是问题,而且那种方法是有弊端的
7 楼
我是大喊三 [专家分:3010] 发布于 2008-04-26 02:10:00
我的意思是说,你自己动点脑子,想想别人实现的原理,自己推一下不就成了吗?另外你自己多注意点基础知识,别成天JJYY的。下面是我搞的。不过VB的MID有个毛病,遇中文一次取2个字节,你说前面那个程序不能直接用我还没仔细看但估计就与这有关吧。而且WINDOWS里有多种编码,UNICODE,ASCII等,也是个问题(ASC函数针对不同的编码有不同的函数实现形式)。还与VB没有无符号整数等也相关,因为有时用有符号的数去存储二进制数会出问题。因此下面程序某些情况下仍会出现问题,这就要靠你去费点神解决了。
Private Sub Command1_Click()
Dim a As String
Dim b As String
Dim i As Integer
a = "我是中国人"
For i = 1 To 5
b = b & Chr((&H250 Xor Asc(Mid(a, i, 1))))
Next i
Debug.Print b
a = ""
For i = 1 To 5
a = a & Chr((&H250 Xor Asc(Mid(b, i, 1))))
Next i
Debug.Print a
End Sub
8 楼
我是大喊三 [专家分:3010] 发布于 2008-04-26 02:13:00
另外XOR加密的方法用了多少万年了,什么不中文不能加密,什么东西都是二进制,关键就是个内码问题!
9 楼
老大徒伤悲 [专家分:29120] 发布于 2008-04-26 09:20:00
我觉得关键在于加密文本必须使用二进制保存,不可以使用字符串保存。
10 楼
一江秋水 [专家分:9680] 发布于 2008-04-26 21:55:00
楼主,我不知道你是怎么做试验的,得出这段代码不能给汉字加密的结论?你从代码中就可以分析出来,异或的对象是字符(包括汉字)的ASCII码!至于<=10个密钥字符,是我怕你嫌麻烦而附加的的限制,其实你就是输入100、1000个字符的密钥也可以!看到一段代码,要耐心地、反复地做试验,直到克服代码中的BUG,并且符合自己的特定要求,不能指望别人的代码完封不动就能完全符合你的心愿,但愿马克思的一段话能够让我们共勉:“在科学的道路上是没有平坦的道路可走的,只有那在崎岖小路的攀登上不畏艰险的人,有希望达到光辉的顶点。”
下面是比较详细的代码:
Option Explicit
Dim DAT() As Byte, Z1 As String, i As Integer, j As Integer, k As Integer
Private Sub Command1_Click() '加密
DAT = StrConv(Text1.Text, vbFromUnicode)
加解密
Open "D:\加密文档.txt" For Binary As #1
Put #1, , DAT
Close #1
End Sub
Private Sub Command2_Click() '解密
Open "D:\加密文档.txt" For Binary As #1
Get #1, , DAT
Close #1
Text1 = ""
加解密
Text1.Text = StrConv(DAT, vbUnicode)
End Sub
Sub 加解密()
Z1 = InputBox("请输入密钥(≤10个可见的Ascii字符):", "加解密")
If Len(Z1) Then
For j = 1 To Len(Z1)
k = Asc(Mid(Z1, j, 1))
For i = 0 To UBound(DAT): DAT(i) = DAT(i) Xor k: Next
Next
End If
End Sub
我来回复