各种密码原理(边积累边更新)

时间:2019-02-11
本文章向大家介绍各种密码原理(边积累边更新),主要包括各种密码原理(边积累边更新)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

也有看过很多大佬的总结,本来想转载一个过来,但还是决定把自己用过的亲自总结一遍,欢迎指教。

1、凯撒加密

古典密码之一,原理:移位,一般是ASCII码移位。

很多在线工具和软件都只进行26个字母的移位,不处理符号,且在26个字母之间循环移位(Z移位变成A)。

例:aZZg/x\ZbavpZiEZp+n)o+用凯撒之后为

bAAh/y\AcbwqAjFAq+o)p+
cBBi/z\BdcxrBkGBr+p)q+
dCCj/a\CedysClHCs+q)r+
eDDk/b\DfeztDmIDt+r)s+
fEEl/c\EgfauEnJEu+s)t+
gFFm/d\FhgbvFoKFv+t)u+
hGGn/e\GihcwGpLGw+u)v+
iHHo/f\HjidxHqMHx+v)w+
jIIp/g\IkjeyIrNIy+w)x+
kJJq/h\JlkfzJsOJz+x)y+
lKKr/i\KmlgaKtPKa+y)z+
mLLs/j\LnmhbLuQLb+z)a+
nMMt/k\MonicMvRMc+a)b+
oNNu/l\NpojdNwSNd+b)c+
pOOv/m\OqpkeOxTOe+c)d+
qPPw/n\PrqlfPyUPf+d)e+
rQQx/o\QsrmgQzVQg+e)f+
sRRy/p\RtsnhRaWRh+f)g+
tSSz/q\SutoiSbXSi+g)h+
uTTa/r\TvupjTcYTj+h)i+
vUUb/s\UwvqkUdZUk+i)j+
wVVc/t\VxwrlVeAVl+j)k+
xWWd/u\WyxsmWfBWm+k)l+
yXXe/v\XzytnXgCXn+l)m+
zYYf/w\YazuoYhDYo+m)n+
aZZg/x\ZbavpZiEZp+n)o+

可以看到只在大小写字母间循环移位,对符号不予理睬,但有的题目是需要符号移位的,下面给出一个ASCII范围在33-126之内的循环移位脚本(94种结果):

代码转自:https://blog.csdn.net/dongyanwen6036/article/details/76447628

# 实现33-126ASCII能打印的字符循环平移
# 和通常凯撒加密不同注意
def change(c, i):
    num = ord(c)
    if (num >= 33 and num <= 126):
        num = 33 + (num + i - 33) % (94)  # 126-33=93
    return chr(num)


def kaisa_jiAmi(string, i):
    string_new = ''
    for s in string:
        string_new += change(s, i)
    print(string_new)
    return string_new


# 本题有种暴力解密感觉
def kaisa_jiEmi(string):
    for i in range(0, 94):
        print('第' + str(i + 1) + '种可能:', end='   ')
        # 区别在于 string 是该对象原本就是字符串类型, 而 str()则是将该对象转换成字符串类型。
        kaisa_jiAmi(string, i)


# 你要知道input输入的数据类型都是string
def main():
    print('请输入操作,注意不是平常26种:')
    choice = input('1:恺撒加密,2:凯撒穷举解密.请输入1或2:')
    if choice == '1':
        string = input('请输入需要加密字符串: ')
        num = int(input('请输入需要加密的KEY: '))
        kaisa_jiAmi(string, num)
    elif choice == '2':
        string = input('请输入需要解密字符串: ')
        kaisa_jiEmi(string)
    else:
        print('输入错误,请重试')
        main()


if __name__ == '__main__':
    main()

2、栅栏加密

古典密码之一,原理:就是把要加密的明文分成N个一组,然后把每组的第1个字分别连起来,然后再把每个组按顺序依次连接,形成一段无规律密文。

所以一般密文个数不是质数

例:2栏的栅栏密码。

比如明文:THERE IS A CIPHER

去掉空格后变为:THEREISACIPHER

两个一组,得到:TH ER EI SA CI PH ER

先取出第一个字母:TEESCPE

再取出第二个字母:HRIAIHR

连在一起就是:TEESCPEHRIAIHR

解码用工具就可以。