2010年3月23日 星期二

編碼加密

說明: 為確保傳輸資料的安全,常將資料編碼加密後傳輸。以偏移與置換二種方式編碼,
本題採偏移與置換編碼規則如下:(每次編碼加密以一個句子或一個單字為主。位移
值為N,傳輸資料只有大寫A-Z 共26 個英文字母與”*”表示空白,”**”表示開始
碼,”***” 表示結束碼,每次編碼需要有開始碼與結束碼。)
1. 偏移量:以 A、B、C、D、E、F……X、Y、Z、A、B…..循環方式,A 偏移量2
則為C,A 偏移量3 則為D,Y 偏移量2 則為A。如BOOK(明碼)經偏移量值4 處
理後為FSSO。偏移量為編碼句子(單字)的字母數除以10 之餘數。如編碼句子(單
字)為BOOK 有4 個字母則偏移量是4,編碼句子(單字)為THIS IS A BOOK 有11
個字母則偏移量是1。
2. 加密編碼步驟如下:
2-1.編碼1:轉換成”偏移編碼值”, 如下表1,A 為65。則FSSO 為70838379。
2-2.編碼2:阿拉伯數字轉成小寫英文字,a 為0,b 為1,餘如下表2。如70838379
為 haididhj 為 BOOK 偏移量4 的加密編碼結果。
3. 編碼字母數:此次編碼偏移量。編碼最後加入所編碼的字母個數,並加上#。如編
碼句子(單字)BOOK 有4 個字母,依下表2 則為#e。
表 1 偏移編碼值
A B C D E F G H I J K L M
65 66 67 68 69 70 71 72 73 74 75 76 77
N O P Q R S T U V W X Y Z
78 79 80 81 82 83 84 85 86 87 88 89 90
表 2 阿拉伯數字0-9 對應表
0 1 2 3 4 5 6 7 8 9
a b c d e f g h i j
輸入格式:明碼文字(大寫英文字母)。
輸出格式:加密編碼結果。
輸入範例 1:BOOK
輸出範例1:**haididhj#e***
輸入範例 2: BOOKS
輸出範例2:
**hbieieiaii#f***
輸入範例 3: THIS IS A BOOK
輸出範例3:
**ifhdheie*heie*gg*ghiaiahg#bb***

3 則留言:

  1. Private Sub Form_Load()
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Input #1, x
    a = Replace(x, " ", "*")
    b = Replace(x, " ", "")
    n = Len(a): r = Len(b)
    m = r Mod 10
    txt = "abcdefghij"
    For i = 1 To n
    k = Mid(a, i, 1)
    If k <> "*" Then k = Asc(k) + m
    Max = Max & k
    Next i
    For i = 1 To n + r
    p = Mid(Max, i, 1)
    If p <> "*" Then
    ans = ans & Mid(txt, p + 1, 1)
    Else
    ans = ans & p
    End If
    Next i
    For i = 1 To Len(r)
    k = r Mod 10
    ans2 = Mid(txt, k + 1, 1) & ans2
    r = r \ 10
    Next i
    Print #2, "**" & ans & "#" & ans2 & "***"
    Close #1
    Close #2
    End Sub

    回覆刪除
  2. 阿瑋好,
    起先以為
    for i = 1 to n+r
    這一行怪怪的,後來仔細想想,是對的。
    但是,似乎還是要將Max整個字串給處理完,直接用
    for i = 1 to len(Max)
    不是比較單純嗎。

    回覆刪除
  3. Dim St As String
    Private Sub Form_Load()
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Do While Not EOF(1)
    ans = "**"
    Input #1, St
    ct = Len(St)
    For i = 1 To Len(St)
    If Mid(St, i, 1) = " " Then ct = ct - 1
    s = Right(ct, 1)
    Next i
    For i = 1 To Len(St)
    strin = "abcdefghij"
    If Mid(St, i, 1) = " " Then
    ans = ans & "*"
    Else
    C = Asc(Mid(St, i, 1)) + s
    If C > 90 Then C = C - 26
    C1 = Left(C, 1) + 1
    C2 = Right(C, 1) + 1
    If C1 > 10 Then C1 = C1 - 10
    If C2 > 10 Then C2 = C2 - 10
    ans = ans & Mid(strin, C1, 1) & Mid(strin, C2, 1)
    End If
    Next i
    ans = ans & "#"
    For i = 1 To Len(ct)
    k = Mid(ct, i, 1) + 1
    ans = ans & Mid(strin, k, 1)
    Next i
    Print #2, ans & "***"
    Loop
    Close #2
    Close #1
    End Sub

    回覆刪除