- Published on
小技巧
- Authors
- Name
- Z1206
数学、计算机安全和加密技术里面有一个概念叫做“逆元”,汉文看着容易云里雾里,直接看英文名字我觉得更容易理解——inverse Element或者直接叫inverse。
加法和乘法都有逆元这个东西:加法逆元,也叫反数opposite——比如a
的反数就是-a
;乘法逆元,也叫倒数reciprocal——比如a
的倒数就是1/a
。在计算机安全和加密技术里面提到的逆元更多时候指的模运算逆元,简单说就是对与某个数n
,存在一个a
和b
满足(a * b) mod n = 1
,那么a
和b
就是互相逆元。充分必要的前提是a
和n
需要互素。
举个例子,对11来讲3和4就是相互逆元。
模逆元有一个挺有趣也挺实用的特性,它可以用来给一个比n
小的自然数加密解密。比如用上面的例子如果输入是5,用a = 3
加密计算5 * a mod 11
能得到加密结果为4,如果拿着加密结果4和b = 4
解密计算4 * b mod 11
就可以得到5这个原始明文。另外一个例子,比如输入是9,用3加密你得到5,用4解密得回9。
另外一个小技巧是有个坐标,或者其他的二维的信息如何映射成单维线性的信息。一个暴力但是简单的方式就是直接生成线形的字典,或者可以解释成多进制。比如我们知道十进制是0123456789
组成的,比如十六进制是0123456789abcdef
,有了这个映射字典,所有的信息都可以在该进制内表达。相同的道理,我们可以创建自己的进制字典。举个例子,比如有一栋居民楼有5个楼道,有8层楼,每一层住着一户人家。那么这栋楼就一共有40户(5 * 8 = 40),我们如果有一串40进制的字典,就可以一个字符表达一户的位置。比如假设我们的字典是abcdefghijklmnopqrstuvwxyz0123456789!@#$
,每一户都可以被一个唯一的字符表示。比如一单元1楼那就是a
,二单元2楼那就是k
,以此类推。这么做的好处我觉得有两个,一是复杂的二维信息可以被一个唯一的字符表达,二是规则只有你知道,因为字典是你指定的它可以是任何东西。