2005-03-18

最乐观的悲观主义者的乌鸦嘴又命中了

工作的忙乱之中,突然又看到某某网站被封(或说基本被封,差不多了),不过这回的名头更大,赫然就是水木。这年头,连水木这样的老实人都混不下去,你我还有什么好说的。虽然我是一个乐观主义者,但在官老爷与言论自由的对峙中,我一向是持悲观主义态度。其实我早就说过,上次的HT不会是最后一个,肯定还有更倒霉的。言犹在耳,就又出了这么一档子事,我都不禁对自己的乌鸦嘴佩服起来。还好,前些日子琢磨自己blog的去向,思前想后,还是固守了blogger这片地儿,虽然要自己找空间存放才能在国内看到,但毕竟不用担心那天被连窝端了。现在想想,还真是有先见之明了。唉,要是什么时候,我们在网上闲扯蛋之前不需要这种“先见之明”来提醒管住自己的嘴巴该有多好。

再扯一句:水木去的不多,最近想换个地方租房,本来还想到水木上转转、找找的,这下可找的地方又少了一个。唉。眼看网站一个又一个的“无疾而终”,不免有兔死狐悲之感。

一个值得纪念的时刻,不过已经溜走了

0$ date +%s
1111151035

千载难逢,可惜。

2005-03-12

用 twofish 做块加密

Twofish是一种块加密算法。块加密算法适合进行流加密,倒是一个发展趋势。Twofish的运算速度比以前的Blowfish之类要快一点,今天终于有机会在Python里试验了一下。虽然这种算法已经出现了好几年,并且是被置于公共领域的算法,但我还是发现现在可以利用的Twofish算法库种类好象不多,也良莠不齐。算起来,还是从GnuPG项目中衍生的libgcrypt加密算法库比较完善,而且维护也比较及时,项目活跃程度比较高,用起来放心一点。

在Debian中,安装libgcrypt比较方便:
sudo apt-get install libgcrypt11 libgcrypt11-dev

不过libgcrypt是一个标准C代码库,为了在Python中使用,需要包装一下,把它做成Python扩展模块。在sf.net上,我找到了libgcrypt-py。在Debian下,编译安装很顺利;但在FreeBSD下,好象gcc不会自己到/usr/local中查找对应的libgcrypt的库和头文件,导致编译失败。在对setup.py做了修改之后,终于安装成功了。
--- libgcrypt-py-0.1.0/setup.py 2004-07-22 11:47:15.000000000 +0800
+++ libgcrypt-py-0.1.0-new/setup.py 2005-03-12 21:37:24.122370040 +0800
@@ -11,16 +11,25 @@
url="http://libgcrypt-py.sourceforge.net",
download_url="http://sourceforge.net/projects/libgcrypt-py/",
py_modules=['Gcrypt'],
+ packages=['_Gcrypt'],
ext_package="_Gcrypt",
ext_modules=[
Extension("_Cipher", ["_Gcrypt/ciphermodule.c"],
- libraries=["gcrypt", "gpg-error"]),
+ libraries=["gcrypt", "gpg-error"],
+ library_dirs=["/lib", "/usr/lib", "/usr/local/lib"],
+ include_dirs=["/usr/include", "/usr/local/include"]),
Extension("_Hash", ["_Gcrypt/hashmodule.c"],
- libraries=["gcrypt", "gpg-error"]),
+ libraries=["gcrypt", "gpg-error"],
+ library_dirs=["/lib", "/usr/lib", "/usr/local/lib"],
+ include_dirs=["/usr/include", "/usr/local/include"]),
Extension("_Random", ["_Gcrypt/randommodule.c"],
- libraries=["gcrypt", "gpg-error"]),
+ libraries=["gcrypt", "gpg-error"],
+ library_dirs=["/lib", "/usr/lib", "/usr/local/lib"],
+ include_dirs=["/usr/include", "/usr/local/include"]),
Extension("_Pk", ["_Gcrypt/pkmodule.c"],
- libraries=["gcrypt", "gpg-error"]),
+ libraries=["gcrypt", "gpg-error"],
+ library_dirs=["/lib", "/usr/lib", "/usr/local/lib"],
+ include_dirs=["/usr/include", "/usr/local/include"]),
]
)

下面就打开一个Python,来测试一下:
import Gcrypt
from binascii import hexlify, unhexlify

key16 = '1234567890123456'
mode = 'ECB'
plaintext = '1234567812345678'

t=Gcrypt.Cipher('TWOFISH-128', mode, key16)
ciphertext = t.Encrypt(plaintext)
shouldbe = '8dfc2c5cbc722c3eda60b6f6d5d64adaa08113c4a107dc0967880359b686c1d7'
hexlify(ciphertext) == shouldbe
hexlify(ciphertext) == shouldbe
t.Decrypt(unhexlify(shouldbe)) == plaintext
t.Decrypt(unhexlify(shouldbe)) == plaintext
a=shouldbe.upper()
' '.join([a[i:i+2] for i in range(0, len(a), 2)])

key32 = key16 + '\0'*(32-len(key16))
t=Gcrypt.Cipher('TWOFISH-256', mode, key32)
ciphertext = t.Encrypt(plaintext)
shouldbe = '2d74e616829cc6d036081177fd2bd231d8858c5d39bcb2336c2071b331beee9b'
hexlify(ciphertext) == shouldbe
hexlify(ciphertext) == shouldbe
t.Decrypt(unhexlify(shouldbe)) == plaintext
t.Decrypt(unhexlify(shouldbe)) == plaintext
a=shouldbe.upper()
' '.join([a[i:i+2] for i in range(0, len(a), 2)])

好了,结论是,基本可用。不过和我用C编写的libgcrypt测试程序比起来,Python版本的256位key的加密结果后16字节竟然不太一样!怎么回事?!难道这两只鱼非得要把每16字节一块单独进行运算吗?没办法,理论功底不够,暂且放下,等回头再试试吧。

补:有人提到import Gcrypt会出错,系统提示“No module named _Gcrypt._Random”。出现这种情况一是在libgcrypt-py-0.1.0中执行的import命令,python在现有的目录结构中找不到_Random.so所致;另一个原因是,原代码中的setup.py缺少上面patch中的“packages=['_Gcrypt'],”这一行,这导致_Gcrypt/__init__.py没有被安装到系统中,这也同样会使import出错。

2005-03-10

在Python中接收和处理信号量

今天写程序,用到了信号量,做一下下笔记:
#!/usr/bin/env python
# sig.py
# signal test
import time
import signal
import sys

NEEDEXIT=False
def SignalHandler(sig, id):
global NEEDEXIT
if sig == signal.SIGUSR1:
print 'received signal USR1'
elif sig == signal.SIGHUP:
print 'received signal HUP'
elif sig == signal.SIGTERM:
print 'received SIGTERM, shutting down'
NEEDEXIT = True

signal.signal(signal.SIGUSR1, SignalHandler)
signal.signal(signal.SIGHUP, SignalHandler)
signal.signal(signal.SIGTERM, SignalHandler)

while 1:
if NEEDEXIT:
sys.exit()
time.sleep(1)

在我的debian上,可以使用的信号量:
0$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO
30) SIGPWR 31) SIGSYS 33) SIGRTMIN 34) SIGRTMIN+1
35) SIGRTMIN+2 36) SIGRTMIN+3 37) SIGRTMIN+4 38) SIGRTMIN+5
39) SIGRTMIN+6 40) SIGRTMIN+7 41) SIGRTMIN+8 42) SIGRTMIN+9
43) SIGRTMIN+10 44) SIGRTMIN+11 45) SIGRTMIN+12 46) SIGRTMIN+13
47) SIGRTMIN+14 48) SIGRTMIN+15 49) SIGRTMAX-15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

启动一下程序,测试一下:
0$ python sig.py &
[1] 29465
0$ kill -1 29465
received signal HUP
0$ kill -SIGHUP 29465
received signal HUP
0$ kill -10 29465
received signal USR1
0$ kill -SIGUSR1 29465
received signal USR1
0$ kill -15 29465
received SIGTERM, shutting down
0$
[1]+ Done python sig.py
0$

程序还是挺配合的 :) 这样以后就可以直接用 kill PID 来让我的程序“协议”退出了,哈哈。

Post by Gnome-blog

sudo apt-get install gnome-blog


gnome-blog-poster



Gnome-blog功能简洁,支持blogger.com,很适合快速发布blog。

可惜,最后的试验不成功--不仅文章没有标题,而且所有中文都变成了乱码,难道是对我utf8的汉字编码水土不服!?

2005-03-09

我使用的Blogger模板

Zope平台的ftp换到真正纯文件的ftp,又调整了一下自己的blogger模板。在自己手里放着也是放着,还是发布出来,说不定以后会帮到某位也用blogger和ftp发布的朋友呢。

最初的模板是来自于blogger.com的一个素雅的例子,手工调整了一点布局;增加了HaloScan提供的Trackback功能;增加了计数器;增加了trueFresco提供的List referrers功能:

2005-03-07

庆祝我的Blog又获新生!

哈哈,太棒了!

不用再等freezope.org修复ftp的问题了,从linuxfire找到了空间存放我的blog。感谢linuxfire的主人hf_linux,也要感谢FKtPp的热心帮助。