古い記事
ランダムジャンプ
新しい記事

手軽な暗号化

2003-07-24-1 [Idea]
アイディアというよりも「情報求む」 (google で探してみたけど、
見つけられず、断念)。なければ誰か作って! (他力本願)

Emacs 上で、簡単にバッファごと暗号化・復号化できないのであろう
か。暗号化されたものは、バイナリではなく、uuencode や url エン
コードみたいな素直なテキストになる。で、そのまま元のファイル名
でセーブする。次にそのファイルを開いたら、まずデコード (M-x
ango-decode) して閲覧。修正したら、またエンコード (M-x
ango-encode) して保存。

暗号アルゴリズムは XOR みたいな単純なので十分。キーを長くすれ
ば良いだけだし。「ファイルを指定すると、その中味のバイト列がな
がーいキーになる」みたいな感じで。例えば、 ~/Mail/inbox/1234
や ~/image/portrait-1.jpg がキーとか。

できれば elisp 1 ファイルでインストールの手間要らず、ってのが
良いな。

参考までに、Perl で書くとこんな感じです。
ango-encode.pl
#!/usr/bin/env perl
use strict;
my ($target_file, $key_file) = @ARGV;
my ($t, $k);
open(F, $target_file) and $t = join('', <F>) and close(F);
open(F, $key_file) and $k = join('', <F>) and close(F);
for (my ($i, $j) = (0, 0); $i < length($t); $i++, $j++) {
    $j = 0 if ($j >= length($k));
    substr($t, $i, 1, pack("C", unpack("C", substr($t, $i, 1)) ^
        unpack("C", substr($k, $j, 1))));

}
$t =~ s/([^\.\*\-_a-zA-Z0-9])/sprintf("%%%02lX",unpack("C",$1))/eg;
print $t;

ango-decode.pl
#!/usr/bin/env perl
use strict;
my ($target_file, $key_file) = @ARGV;
my ($t, $k);
open(F, $target_file) and $t = join('', <F>) and close(F);
open(F, $key_file) and $k = join('', <F>) and close(F);
$t =~ s/%([A-F0-9][A-F0-9])/pack("C", hex($1))/gie;
for (my ($i, $j) = (0, 0); $i < length($t); $i++, $j++) {
    $j = 0 if ($j >= length($k));
    substr($t, $i, 1, pack("C", unpack("C", substr($t, $i, 1)) ^
        unpack("C", substr($k, $j, 1))));
}
print $t;