利用 Emacs 实现加解密

利用 Emacs 实现加解密

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 找到这个程序。

返回主页

返回主页

Author: Brep <Brep@smth.org>

Date: 2006/11/02 02时20分31秒