25.5.6 实例:简单加密

接下来,我们实现一个简单的加密算法:微型加密算法(Tiny Encryption Algorithm,TEA),作为位/字节级别数据处理的一个实例。这个算法最初是由剑桥大学的David Wheeler设计的(见22.2.1节)。它很简单,但应付一般攻击还是绰绰有余的。

你不必过于仔细地阅读加密程序(除非你真的需要理解算法,而且对困难有心理准备)。我们给出这个加密程序只是为了让你体会一下如何编写实用的位处理代码。如果你希望学习加密的知识,请查阅专门的教材。至于用其他语言实现TEA算法的相关内容,请参考http://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm以及英国布拉福德大学Simon Shepherd教授关于TEA的网站。

加密/解密的基本思想是很简单的。我想发送给你一些文本,但我不想让其他人看懂发送的内容。因此,我先把要发送的文本进行转换,然后再发送,使得不知道确切转换方式的人就无法看懂转换后的内容;而你是知道转换方法的,可以通过逆变换得到原始文本。这个转换过程就称为加密。进行加密需要一个算法(我们必须假定所有人都能获得这个算法)和一个称为“密钥”的字符串。你和我都知道密钥(我们希望窃听者不知道)。当你获得密文时,可以使用“密钥”对其解密,即,重新构造出我要发送的“明文”。

TEA算法接受三个参数,v是包含两个无符号long(v[0],v[1])的数组,表示要加密的8个字符,w是用来保存密文的,也是包含两个无符号long(w[0],w[1])的数组,而k是密钥,是包含4个无符号long(k[0]...k[3])的数组:

注意,所有数组都是无符号类型,这样我们就可以放心地进行位运算,而不必担心突然出现负数。移位(<<和>>)、异或(^)以及位与(&)这些位运算结合无符号数加法运算形成了完整的加密算法。这段代码只能用于long的大小是4字节的机器。也就是说,代码中散布着“魔数”(即sizeof(long)==4)。如前所述,这通常不是一种好的程序设计策略,但这样写程序,代码能放在一页纸内。而相应的数学公式也能写在一个信封的背面,或者,按照最初的设想,牢牢地记在程序员的头脑中。David ...

Get C++程序设计:原理与实践(进阶篇)(原书第2版) now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.