winsphinx 发表于 2013-8-30 12:59:44

[已解决]_StringEncrypt()能正常使用吗?

本帖最后由 winsphinx 于 2013-9-9 01:01 编辑

UDF有个_StringEncrypt(),但是无法正常使用,即:我输入字符串abcd,加密为$x,再把$x解密,却不是原来的。
例子中的_StringEncrypt.au3是这样,为自己写的简单语句也这样,是不是这个UDF本身有问题?如果想实现简单的加密,该怎么实现?

附上简单代码#include <String.au3>

Local $x=_StringEncrypt(1,"abcdefg","passwd")
MsgBox(0,"",$x)

Local $y=_StringEncrypt(0,$x,"passwd")
MsgBox(0,"",$y)

lsb968 发表于 2013-8-30 22:00:16

本帖最后由 lsb968 于 2013-8-30 22:02 编辑

用这个代替



Func _StringEncryptX($i_Encrypt, $s_EncryptText, $s_EncryptPassword, $i_EncryptLevel = 1)
      If $i_Encrypt <> 0 And $i_Encrypt <> 1 Then
                SetError(1)
                Return ''
      ElseIf $s_EncryptText = '' Or $s_EncryptPassword = '' Then
                SetError(1)
                Return ''
      Else
                If Number($i_EncryptLevel) <= 0 Or Int($i_EncryptLevel) <> $i_EncryptLevel Then $i_EncryptLevel = 1
                Local $v_EncryptModified, $i_EncryptCountH, $i_EncryptCountG, $v_EncryptSwap, $av_EncryptBox
                Local $i_EncryptCountA, $i_EncryptCountB, $i_EncryptCountC, $i_EncryptCountD, $i_EncryptCountE
                Local $v_EncryptCipher, $v_EncryptCipherBy
                If $i_Encrypt = 1 Then
                        For $i_EncryptCountF = 0 To $i_EncryptLevel Step 1
                              $i_EncryptCountG = ''
                              $i_EncryptCountH = ''
                              $v_EncryptModified = ''
                              For $i_EncryptCountG = 1 To StringLen($s_EncryptText)
                                        If $i_EncryptCountH = StringLen($s_EncryptPassword) Then
                                                $i_EncryptCountH = 1
                                        Else
                                                $i_EncryptCountH += 1
                                        EndIf
                                        $v_EncryptModified = $v_EncryptModified & ChrW(BitXOR(AscW(StringMid($s_EncryptText, $i_EncryptCountG, 1)), AscW(StringMid($s_EncryptPassword, $i_EncryptCountH, 1)), 255))
                              Next
                              $s_EncryptText = $v_EncryptModified
                              $i_EncryptCountA = ''
                              $i_EncryptCountB = 0
                              $i_EncryptCountC = ''
                              $i_EncryptCountD = ''
                              $i_EncryptCountE = ''
                              $v_EncryptCipherBy = ''
                              $v_EncryptCipher = ''
                              $v_EncryptSwap = ''
                              $av_EncryptBox = ''
                              Local $av_EncryptBox
                              For $i_EncryptCountA = 0 To 255
                                        $av_EncryptBox[$i_EncryptCountA] = AscW(StringMid($s_EncryptPassword, Mod($i_EncryptCountA, StringLen($s_EncryptPassword)) + 1, 1))
                                        $av_EncryptBox[$i_EncryptCountA] = $i_EncryptCountA
                              Next
                              For $i_EncryptCountA = 0 To 255
                                        $i_EncryptCountB = Mod(($i_EncryptCountB + $av_EncryptBox[$i_EncryptCountA] + $av_EncryptBox[$i_EncryptCountA]), 256)
                                        $v_EncryptSwap = $av_EncryptBox[$i_EncryptCountA]
                                        $av_EncryptBox[$i_EncryptCountA] = $av_EncryptBox[$i_EncryptCountB]
                                        $av_EncryptBox[$i_EncryptCountB] = $v_EncryptSwap
                              Next
                              For $i_EncryptCountA = 1 To StringLen($s_EncryptText)
                                        $i_EncryptCountC = Mod(($i_EncryptCountC + 1), 256)
                                        $i_EncryptCountD = Mod(($i_EncryptCountD + $av_EncryptBox[$i_EncryptCountC]), 256)
                                        $i_EncryptCountE = $av_EncryptBox + $av_EncryptBox[$i_EncryptCountD]), 256)]
                                        $v_EncryptCipherBy = BitXOR(AscW(StringMid($s_EncryptText, $i_EncryptCountA, 1)), $i_EncryptCountE)
                                        $v_EncryptCipher &= Hex($v_EncryptCipherBy, 2)
                              Next
                              $s_EncryptText = $v_EncryptCipher
                        Next
                Else
                        For $i_EncryptCountF = 0 To $i_EncryptLevel Step 1
                              $i_EncryptCountB = 0
                              $i_EncryptCountC = ''
                              $i_EncryptCountD = ''
                              $i_EncryptCountE = ''
                              $v_EncryptCipherBy = ''
                              $v_EncryptCipher = ''
                              $v_EncryptSwap = ''
                              $av_EncryptBox = ''
                              Local $av_EncryptBox
                              For $i_EncryptCountA = 0 To 255
                                        $av_EncryptBox[$i_EncryptCountA] = AscW(StringMid($s_EncryptPassword, Mod($i_EncryptCountA, StringLen($s_EncryptPassword)) + 1, 1))
                                        $av_EncryptBox[$i_EncryptCountA] = $i_EncryptCountA
                              Next
                              For $i_EncryptCountA = 0 To 255
                                        $i_EncryptCountB = Mod(($i_EncryptCountB + $av_EncryptBox[$i_EncryptCountA] + $av_EncryptBox[$i_EncryptCountA]), 256)
                                        $v_EncryptSwap = $av_EncryptBox[$i_EncryptCountA]
                                        $av_EncryptBox[$i_EncryptCountA] = $av_EncryptBox[$i_EncryptCountB]
                                        $av_EncryptBox[$i_EncryptCountB] = $v_EncryptSwap
                              Next
                              For $i_EncryptCountA = 1 To StringLen($s_EncryptText) Step 2
                                        $i_EncryptCountC = Mod(($i_EncryptCountC + 1), 256)
                                        $i_EncryptCountD = Mod(($i_EncryptCountD + $av_EncryptBox[$i_EncryptCountC]), 256)
                                        $i_EncryptCountE = $av_EncryptBox + $av_EncryptBox[$i_EncryptCountD]), 256)]
                                        $v_EncryptCipherBy = BitXOR(Dec(StringMid($s_EncryptText, $i_EncryptCountA, 2)), $i_EncryptCountE)
                                        $v_EncryptCipher = $v_EncryptCipher & ChrW($v_EncryptCipherBy)
                              Next
                              $s_EncryptText = $v_EncryptCipher
                              $i_EncryptCountG = ''
                              $i_EncryptCountH = ''
                              $v_EncryptModified = ''
                              For $i_EncryptCountG = 1 To StringLen($s_EncryptText)
                                        If $i_EncryptCountH = StringLen($s_EncryptPassword) Then
                                                $i_EncryptCountH = 1
                                        Else
                                                $i_EncryptCountH += 1
                                        EndIf
                                        $v_EncryptModified &= ChrW(BitXOR(AscW(StringMid($s_EncryptText, $i_EncryptCountG, 1)), AscW(StringMid($s_EncryptPassword, $i_EncryptCountH, 1)), 255))
                              Next
                              $s_EncryptText = $v_EncryptModified
                        Next
                EndIf
                Return $s_EncryptText
      EndIf
EndFunc   ;==>_StringEncryptX

winsphinx 发表于 2013-8-31 09:32:48

非常感谢!

fcurrk 发表于 2013-9-1 11:02:26

我也需要这个,感谢

menfan1 发表于 2013-9-5 10:12:21

升级到最新版可以实现。
页: [1]
查看完整版本: [已解决]_StringEncrypt()能正常使用吗?