【ヴィジュネル暗号】暗号化と復号を実装【COBOL】

ヴィジュネル暗号

ビジュアル系
ビジュアル系

外出自粛の週末、ビジュネル系暗号を実装してみました。

アルゴリズムはこちら(ウィキペディアより)。

ヴィジュネル暗号数式
ヴィジュネル暗号数式

とりあえず5文字のベタ書きで。

こんな感じになるはず

実行結果

$ ./vigenere 
平文
0301090800
鍵
050407
--
暗号化..
->0805161304
復号..
->0301090800

うまくいってそうですね。

コード

コードはこんな感じに書きました。

COBOLでやるもっと良いやり方ありましたら教えてくださいね。

       IDENTIFICATION DIVISION.
       PROGRAM-ID. VIGENERE.
      * ------------------------------
      * ヴィジュネル暗号
      * ------------------------------
       ENVIRONMENT DIVISION.
       DATA DIVISION.
         WORKING-STORAGE SECTION.
      * 平文PX文字列
         01 PX5.
           03 PX OCCURS 5.
             05 PX_I PIC X(2).
      * 暗号文CX文字列
         01 CX5.
           03 CX OCCURS 5.
             05 CX_I PIC X(2).
      * 鍵KX文字列
         01 KX3.
           03 KX OCCURS 3.
             05 KX_I PIC X(2).
      * 平文P数値
         01 P5.
           03 P OCCURS 5.
             05 P_I PIC S9(2).
      * 暗号文C数値
         01 C5.
           03 C OCCURS 5.
             05 C_I PIC S9(2).
      * 鍵K数値
         01 K3.
           03 K OCCURS 3.
             05 K_I PIC S9(2).
      * 鍵の文字数
         01 K_SIZE PIC S9(2) VALUE 3.
      * アルファベットの文字数
         01 A26 PIC S9(2) VALUE 26.
      * 添字
         01 I PIC S9(1).
         01 J PIC S9(1).
      * 商
         01 W_S PIC S9(2).
      * 平文i + 鍵i
         01 W_PK PIC S9(2).
      * 暗号化文i + 鍵i
         01 W_CK PIC S9(2).
      * ------------------------------
       PROCEDURE DIVISION.
      * MAIN SECTION
         MAIN-S.
      *    平文
           MOVE "03" TO PX_I(1).
           MOVE "01" TO PX_I(2).
           MOVE "09" TO PX_I(3).
           MOVE "08" TO PX_I(4).
           MOVE "00" TO PX_I(5).
           DISPLAY "平文".
           DISPLAY PX5.
           MOVE PX5 TO P5.
      *    鍵
           MOVE "05" TO KX_I(1).
           MOVE "04" TO KX_I(2).
           MOVE "07" TO KX_I(3).
           DISPLAY "鍵".
           DISPLAY KX3.
           DISPLAY "--".
           MOVE KX3 TO K3.
      * ------------------------------
      * 暗号化
      * ------------------------------
           DISPLAY "暗号化..".
           MOVE LOW-VALUE TO C5.
           PERFORM VARYING I FROM 1 BY 1
             UNTIL I > 5
      *        鍵の文字位置計算
      *        平文5文字、鍵3文字のため
      *          剰余
               COMPUTE W_S = I / K_SIZE
               COMPUTE J = I - K_SIZE * W_S
      *          0ならK_SIZE
               IF J = ZERO
                 THEN
                   MOVE K_SIZE TO J
                 ELSE
                   CONTINUE
               END-IF
      *        平文i + 鍵i
               COMPUTE W_PK = P_I(I) + K_I(J)
      *          剰余
               COMPUTE W_S = W_PK / A26
               COMPUTE C_I(I) = W_PK - A26 * W_S
           END-PERFORM.
           DISPLAY "->" C5.
      * ------------------------------
      * 復号
      * ------------------------------
           DISPLAY "復号..".
           MOVE LOW-VALUE TO P5.
           MOVE LOW-VALUE TO PX5.
           PERFORM VARYING I FROM 1 BY 1
             UNTIL I > 5
      *        鍵の文字位置計算
      *        平文5文字、鍵3文字のため
      *          剰余
               COMPUTE W_S = I / K_SIZE
               COMPUTE J = I - K_SIZE * W_S
      *          0ならK_SIZE
               IF J = ZERO
                 THEN
                   MOVE K_SIZE TO J
                 ELSE
                   CONTINUE
               END-IF
      *        暗号化文i - 鍵i
               COMPUTE W_CK = C_I(I) - K_I(J)
      *          剰余
               COMPUTE W_S = W_CK / A26
               COMPUTE P_I(I) = W_CK - A26 * W_S
           END-PERFORM.
           MOVE P5 TO PX5.
           DISPLAY "->" PX5.
      *
         MAIN-E.