暗号化2014年11月22日 21:39

暗号化、複合化プログラムcryptです。

入力文字と暗号化キーのXORをとることで暗号化しています。複合も同じです。

XORをとるには、組み込みのieorがありますが、ここでは、自作しました。

cryptのratfor版は下記の通り。

# crypt.r4 -- encrypt and decrypt
      character getc,xor
      character c,key(MAXKEY)
      integer getarg
      integer mod,i,keylen

      keylen = getarg(1,key,MAXKEY)
      if (keylen == EOF)
          call error('usage: crypt key.')
      for (i = 1; getc(c) != EOF; i = mode(i,keylen) + 1)
          call putc(xor(c,key(i)))
      stop
      end

とても単純ですね。Watcom Fortran 77版は下記の通り。

c crypt.for -- encrypt and decrypt
      program crypt
      integer*1 getc
      integer*1 c,key(11)               ! MAXKEY(11)
      integer getarg,ieor
      integer i,keylen

      keylen = getarg(1,key,11)         ! MAXKEY(11)
      if (keylen .eq. -1) then          ! EOF(-1)
          call error('usage: crypt key.')
      end if
      i = 1
      while (getc(c) .ne. -1) do        ! EOF(-1)
          call putc(xor(c,key(i)))
          i = mod(i,keylen) + 1
      end while
      stop
      end

xor()は、以下の通り。下請けルーチンbin2bit()は、integer*1の正の数を8ビットに分割します。bit2bin()は、8ビットに分割された数をinteger*1の数に戻します。いずれのルーチンも、負の数には対応できません。

c xor.for -- bit width xor
      integer*1 function xor(bin1,bin2)
      integer*1 bin1, bin2
      integer*1 bit2bin
      integer bit1(8),bit2(8),bit3(8),i

      call bin2bit(bin1,bit1)
      call bin2bit(bin2,bit2)
      do 10 i=1,8
          if (((bit1(i) .eq. 1) .and. (bit2(i) .eq. 0)) .or.
     1        ((bit1(i) .eq. 0) .and. (bit2(i) .eq. 1))) then
              bit3(i) = 1
          else
              bit3(i) = 0
          endif
   10 continue
      xor = bit2bin(bit3)
      return
      end

bin2bit()は、以下の通り。

c bin2bit.for -- convert bin to bit(i)
      subroutine bin2bit(bin8,bit)
      integer*1 bin8
      integer bit(8)
      integer abs,mod
      integer i,b

      b = bin8
      do 10 i=1,8
          bit(i) = abs(mod(b,2))
          b = b / 2
   10 continue
      return
      end

bit2bin()は、以下の通り。

c bit2bin.for -- convert bit(8) to bin
      integer*1 function bit2bin(bit)
      integer bit(8)

      bit2bin = bit(8)*128 + bit(7)*64 + bit(6)*32 + bit(5)*16
     1     + bit(4)*8 + bit(3)*4 + bit(2)*2 + bit(1)
      return
      end

実は、大きな落とし穴がありました。暗号化した文字が26、すなわち、0x1aになることがあります。 0x1aは、Windowsでは、テキストファイルの終わりのマークです。暗号化したファイルを読み込むと、0x1aのところで、 切れてしまいます。仕様なので、これ以上の事は追求しないことにしました。