暗号化、複合化プログラム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のところで、 切れてしまいます。仕様なので、これ以上の事は追求しないことにしました。
※コメントの受付件数を超えているため、この記事にコメントすることができません。