暗号化 ― 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のところで、 切れてしまいます。仕様なので、これ以上の事は追求しないことにしました。
最近のコメント