回 帖 发 新 帖 刷新版面

主题:[讨论]加密 中文字符如何加密后再还原

回复列表 (共10个回复)

沙发

一般用密钥来与明文异或吧

板凳

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 楼


二楼你讲的是对的,是其中的一种方法,但是你讲的xor,它只能对字母或者是字符进行加密,但是如果是中文呢,那就不能加密了.给你加20分鼓励分吧

4 楼

[quote]
二楼你讲的是对的,是其中的一种方法,但是你讲的xor,它只能对字母或者是字符进行加密,但是如果是中文呢,那就不能加密了.给你加20分鼓励分吧[/quote]

中文不是一样吗?你动点脑子好吗?

5 楼

[quote][quote]
二楼你讲的是对的,是其中的一种方法,但是你讲的xor,它只能对字母或者是字符进行加密,但是如果是中文呢,那就不能加密了.给你加20分鼓励分吧[/quote]

中文不是一样吗?你动点脑子好吗?
[/quote]
 你眼睛挣大点好吗?
题目你可看清楚了?你可试了?用此方法,中文是不可加密的,即使加密了,部分中文是不可以还原的,你先试试再发言吧

6 楼

另外,2楼那种加密是受限制的,一定就要<=10个可见字符吗?我加密想要用20,50,100等等个字符不行吗?一定要可见的字符吗,我用一个大的数字来加密不行吗?等等这都是问题,而且那种方法是有弊端的

7 楼

我的意思是说,你自己动点脑子,想想别人实现的原理,自己推一下不就成了吗?另外你自己多注意点基础知识,别成天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 楼

另外XOR加密的方法用了多少万年了,什么不中文不能加密,什么东西都是二进制,关键就是个内码问题!

9 楼

我觉得关键在于加密文本必须使用二进制保存,不可以使用字符串保存。

10 楼

楼主,我不知道你是怎么做试验的,得出这段代码不能给汉字加密的结论?你从代码中就可以分析出来,异或的对象是字符(包括汉字)的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

我来回复

您尚未登录,请登录后再回复。点此登录或注册