按指定要求加密字符串,給出實用解決方法的就給分!


現有一不定長字符串,由英文字母、數字和常用符號組成,即這些字符的ASC碼范圍在32-127之間,例如“Ue:KcPj5c>o !c$m-&Pm.wc”。
我現在想把該字符串加密為只由大小寫字母和數字組成的字符串,即不要那些符號。而且加密后的字符串要可以解密還原為原來的字符串。

我想應該不太難吧,哪位大俠幫忙試試?
請勿貼上什么加密的文章或例子,哪位先寫出解決方法我就給分!

24 个解决方案

#1


等一下我馬上找來

#2


等一下我馬上找來

#3


不要貼文章!我只要針對解決這個問題的方法,謝謝!

#4


這是一個名為Base64的類
使用方法很簡單

dim A as New Base64
dim B() as Byte
dim C as String

B=sYourString

C=a.Byte2Base64(B)
Debug.print C
B=a.Base642Byte(C)

C=B
Debug.print C

#5


Option Explicit

Private Biao(0 To 64) As Byte
Private ReBiao(0 To 255) As Byte

Public Base64BeingLeft As String '遺留的未處理的Base64字符串

Private Sub InitBiao()
Dim I As Long
Dim J As Long
    '生成轉化表
    'A-Z
    For I = 0 To 25
        Biao(I) = 65 + I
    Next
    
    'a-z
    For I = 0 To 25
        Biao(I + 26) = 97 + I
    Next
    
    '0-9
    For I = 0 To 9
        Biao(52 + I) = 48 + I
    Next
    
    Biao(62) = 43 '+
    Biao(63) = 47 '/
    Biao(64) = 61 '=

'生成反轉表
    For I = 0 To 255
        ReBiao(I) = 255
        For J = 0 To 64
            If Biao(J) = I Then
                ReBiao(I) = J
                Exit For
            End If
        Next J
    Next I
End Sub

Public Function Byte2Base64(Bytes() As Byte) As String
    Dim Top As Long
    Dim I As Long
    Dim pos1 As Long
    Dim pos2 As Long
   
    Top = IIf((UBound(Bytes) + 1) Mod 3 = 0, ((UBound(Bytes) + 1) \ 3) * 4, ((UBound(Bytes) + 1) \ 3 + 1) * 4) - 1
    Dim Base64() As Byte
    ReDim Base64(0 To Top)
    
    If (UBound(Bytes) + 1) \ 3 = 0 Then pos1 = -4
    
    For I = 0 To (UBound(Bytes) + 1) \ 3 - 1
        pos1 = 4 * I
        pos2 = 3 * I
        Base64(pos1) = Biao((Bytes(pos2) And &HFC&) / 4)
        Base64(pos1 + 1) = Biao((Bytes(pos2) And &H3&) * &H10& + (Bytes(pos2 + 1) And &HF0&) / &H10&)
        Base64(pos1 + 2) = Biao(((Bytes(pos2 + 1) And &HF&) * 4 + (Bytes(pos2 + 2) And &HC0&) / &H40&))
        Base64(pos1 + 3) = Biao((Bytes(pos2 + 2) And &H3F&))
    Next
    pos2 = 3 * I
    Select Case (UBound(Bytes) + 1) Mod 3
        Case 0
            
        Case 1
            Base64(pos1 + 4) = Biao((Bytes(pos2) And &HFC&) / 4)
            Base64(pos1 + 5) = Biao((Bytes(pos2) And &H3&) * &H10&)
            Base64(pos1 + 6) = Biao(64)
            Base64(pos1 + 7) = Biao(64)
        Case 2
            Base64(pos1 + 4) = Biao((Bytes(pos2) And &HFC&) / 4)
            Base64(pos1 + 5) = Biao((Bytes(pos2) And &H3&) * &H10& + (Bytes(pos2 + 1) And &HF0&) / &H10&)
            Base64(pos1 + 6) = Biao(((Bytes(pos2 + 1) And &HF&) * 4))
            Base64(pos1 + 7) = Biao(64)
    End Select
    
    Dim temp() As Byte
    ReDim temp(0 To (UBound(Base64) + 1) * 2 - 1)
    For I = 0 To (UBound(Base64) + 1) * 2 - 1
        If I Mod 2 = 0 Then
            temp(I) = Base64(I \ 2)
        Else
            temp(I) = 0
        End If
    Next I

    Byte2Base64 = temp
End Function


Public Function Base642Byte(sBase As String) As Byte()
    Dim I As Long
    Dim pos As Long
    Dim temp() As Byte
    Dim Ret() As Byte
    
    If sBase = "" Then Exit Function
    
    ReDim temp(0 To Len(sBase) - 1)
    
    pos = 0
    For I = 1 To Len(sBase)
        temp(I - 1) = ReBiao(Asc(Mid(sBase, I, 1)))
        If temp(I - 1) <> 255 Then pos = pos + 1
    Next I
    
    If pos = 0 Then Exit Function
    
    '刪去無用字符
    ReDim Ret(0 To pos - 1)
    pos = 0
    For I = 0 To Len(sBase) - 1
        If temp(I) <> 255 Then
            Ret(pos) = temp(I)
            pos = pos + 1
        End If
    Next I
    
    Base64BeingLeft = ""
    For I = 1 To (pos Mod 4)
         Base64BeingLeft = Base64BeingLeft & Chr(Biao(Ret(pos \ 4 + I)))
    Next I
    
    ReDim temp(0 To (pos \ 4) * 3 - 1)
    
    For I = 0 To pos \ 4 - 2
        temp(3 * I) = Ret(4 * I) * 4 + (Ret(4 * I + 1) And &H30&) / &H10&
        temp(3 * I + 1) = (Ret(4 * I + 1) And &HF&) * &H10& + (Ret(4 * I + 2) And &H3C&) / 4
        temp(3 * I + 2) = (Ret(4 * I + 2) And &H3&) * &H40& + Ret(4 * I + 3)
    Next I
    
    If Ret(pos - 1) = 64 Then ' 64為 Rebiao("=")
        If Ret(pos - 2) = 64 Then '一個字符
            temp(3 * I) = Ret(4 * I) * 4 + (Ret(4 * I + 1) And &H30&) / &H10&
            ReDim Preserve temp(3 * I)
        Else    '兩個字符
            temp(3 * I) = Ret(4 * I) * 4 + (Ret(4 * I + 1) And &H30&) / &H10&
            temp(3 * I + 1) = (Ret(4 * I + 1) And &HF&) * &H10& + (Ret(4 * I + 2) And &H3C&) / 4
            ReDim Preserve temp(3 * I + 1)
        End If
    Else
        temp(3 * I) = Ret(4 * I) * 4 + (Ret(4 * I + 1) And &H30&) / &H10&
        temp(3 * I + 1) = (Ret(4 * I + 1) And &HF&) * &H10& + (Ret(4 * I + 2) And &H3C&) / 4
        temp(3 * I + 2) = (Ret(4 * I + 2) And &H3&) * &H40& + Ret(4 * I + 3)
        I = I + 1
        ReDim Preserve temp(3 * I - 1)
    End If
    
    Base642Byte = temp
End Function

Private Sub Class_Initialize()
    InitBiao
End Sub

#6


這是標准的Base64編碼方案主要用於電子郵件,編碼結果字符使用范圍字母數字和+/=,這是一個沒有完成的Base64編碼方案但是用於你的要求完全滿足

#7


你能保證不會出錯嗎?我要做軟件的注冊碼,如果出錯那就慘了。
我用過很多這類加密方案,但大多都出錯!
我需要驗證是否適合,請等待!

#8


對不起我沒看清題意,不過你的要求很簡單,
只要你定義一個換碼序列就行了,就像C里面的\n表示回車
比如你可以這樣定義:
A為換碼符 :=A1 >=A2 !=A3 " "=A4 $=A5 &=A6 .=A7
Ue:KcPj5c>o !c$m-&Pm.wc  可以這樣表示:
UeA1KcPj5cA2A4A3cA5mA6PmA7wc
而所有的A變為AA

那么只要用一個循環語句加一個Select就行了

#9


'試試這個
Private Sub Command1_Click()
Dim s As String
x = StringToEncodeString("jhskdhfkj阿卡計划的科技哈哈打開")
MsgBox x
MsgBox EncodeStringToString(x)
End Sub
Public Function StringToEncodeString(ByVal strX As String, Optional key As Long = 100) As String
Dim aByte() As Byte, i As Long
    Randomize
    strX = strX & Chr(Int((255 * Rnd)))
    If key = 0 Then key = 100
    aByte = StrConv(strX, vbFromUnicode)
    For i = LBound(aByte) To UBound(aByte)
        aByte(i) = aByte(i) Xor key
    Next i
    StringToEncodeString = StrConv(aByte, vbUnicode)
End Function
Public Function EncodeStringToString(ByVal strX As String, Optional key As Long = 100) As String
Dim aByte() As Byte, i As Long
    If strX = "" Then
        EncodeStringToString = Chr(Int((255 * Rnd)))
        Exit Function
    End If
    If key = 0 Then key = 100
    aByte = StrConv(strX, vbFromUnicode)
    For i = LBound(aByte) To UBound(aByte)
        aByte(i) = aByte(i) Xor key
    Next i
    EncodeStringToString = StrConv(aByte, vbUnicode)
    EncodeStringToString = Left(EncodeStringToString, Len(EncodeStringToString) - 1)
End Function

#10


如果你要作注冊碼建議你修改一下源代碼易保證別人不知道,因為這個算法比較通用

#11


To playyuer(女愛㊣):
你的不符合要求。

***************************************
請各位看清楚題目再來回答,請不要隨手從某處拿段代碼來就叫我試,希望各位就題論題。

***************************************
補充一個要求,轉換后字符串長度不變。

#12


老兄127-32+1=96種字符要用26+26+10=62種來表示似乎不太可能長度不變

#13


除非...

#14


最好字符串長度不變,若不行,也必須不少於原來長度,盡量不要太長。

#15


那就自己做換碼解釋程序嘍。平均情況增加50%的長度,最壞情況增加100%

#16


換碼方法上面講了嘛!

#17


UP

#18


我也一種最簡易的方法,每個字和ASC碼加上一數:加密;反之則解密。

#19


cqq_chen(我是誰)的方法應該不行,不合我的要求。
誰有好辦法?再加分。

#20


換碼肯定不行!一統計頻率就解密了,建議用哈夫曼編碼,可以使所有字母出現的頻率相同。建議分段加密,使用不同的哈夫曼編碼表,別人很難解密。

#21


哈夫曼編碼如何做?符合我的要求嗎?
我也不要什么很高深的算法,我只是想用戶輸入注冊碼方便一些,不需輸入奇形怪狀的符號

#22


UP!!!

#23


哈夫曼編碼很簡單,找一本編碼的書籍看一下就行了。本身是用來做壓縮的算法。

#24


沒有好的方法嗎?

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com