Emacs 23 之所以能支持多种编码系统,是因为它内部是采用 unicode 编码表示 字符的。只要有一张 charset --> unicode 的转换表,理论上 Emacs23 可以支 持任何编码系统。Emacs23源码的 etc/charsets/ 目录下有很多 *.map 文件,就 是这种转换表。
利用 Emacs 23 的这个特性,我们可以创造自己的编码系统,从而实现加解密。
用下面这个小程序可以生成一个 MYKEY.map 文件:
(defun encrypt-make-new-map ()
(interactive)
(let ((filename (read-file-name "New map file: " nil "MYKEY.map"))
(table (make-vector #x10000 0))
(idx 0))
(while (<= idx #xFFFF)
(aset table idx idx)
(setq idx (1+ idx)))
(shuffle-vector table)
(get-buffer-create filename)
(with-current-buffer filename
(setq idx 0)
(while (<= idx #xFFFF)
(setq elt (aref table idx))
(insert (concat (format "0x%04X" elt) " " (format "0x%04X" idx) "\n"))
(setq idx (1+ idx)))
(write-file filename)
(display-buffer (current-buffer)))))
然后,把 MYKEY.map 文件复制到这个目录下:
/usr/local/share/emacs/23.0/etc/charsets/
最后在 ~/.emacs 中加入:
(define-charset 'encrypt-charset "An encrypt charset in the range (U+0000..U+FFFF)" :short-name "Encrypt charset" :code-space [0 255 0 255] :map "MYKEY") (define-coding-system 'encrypt-coding "Encrypt coding system." :coding-type 'charset :mnemonic ?e :charset-list '(encrypt-charset))
这样我们就创建了一个名为 encrypt-coding 的编码系统,我们用这个编码系统 书写的文档就是密文,要想解密就必须有 MYKEY.map 文件,因此 MYKEY.map 就 是密码本。
这种加密方式至少能达到国共内战时期的加密强度。想当年钱壮飞为了搞到徐恩 增的密码本是要冒生命危险的。
怎么样,想不想试试自己做一套密码?不过切记不要弄丢了 MYKEY.map,否则你 的文档就很难破译了。
PS. happierbee 提出了一个更好的方法,可以用一个密码来产生 map, 这样只要记住这个密码和当时选用的参数就可以产生相同的 map 了,你可以在 水木社区 Emacs 版精华区 x-5-5 找到这个程序。
Date: 2006/11/02 02时20分31秒