>
Z1206: hello
Published on

小技巧

Authors
  • avatar
    Name
    Z1206
    Twitter

数学、计算机安全和加密技术里面有一个概念叫做“逆元”,汉文看着容易云里雾里,直接看英文名字我觉得更容易理解——inverse Element或者直接叫inverse。

加法和乘法都有逆元这个东西:加法逆元,也叫反数opposite——比如a的反数就是-a;乘法逆元,也叫倒数reciprocal——比如a的倒数就是1/a。在计算机安全和加密技术里面提到的逆元更多时候指的模运算逆元,简单说就是对与某个数n,存在一个ab满足(a * b) mod n = 1,那么ab就是互相逆元。充分必要的前提是an需要互素。

举个例子,对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,以此类推。这么做的好处我觉得有两个,一是复杂的二维信息可以被一个唯一的字符表达,二是规则只有你知道,因为字典是你指定的它可以是任何东西。