凯撒密码

276 阅读2分钟

解密主要找偏移量

确定是否是可以用词频分析,找偏移量可以穷举,一般是0-25,27相当于1。不能通过多次加密提升安全性,如先A后B,相当于‘A+B’偏移。

只对字母进行操作,并且变换不会超出原范围。

偏移量为13即为ROT13 实现代码如下:

str='EmBmP5Pmn7QcPU4gLYKv5QcMmB3PWHcP5YkPq3=cT6QckkPckoRG'
key=3
enstr=''
l=len(str)
for i in range(l):
    k=ord(str[i])
    if 65<=k<=90:
        if k+key<=90:
            enstr+=chr(k+key)
        else:
            enstr+=chr(k+key-90+65)
    elif 97<=k<=122:
        if k+key<=122:
            enstr+=chr(k+key)
        else:
            enstr+=chr(k+key-122+97)
    elif 48<=k<=57:
        if k+key<=57:
            enstr+=chr(k+key)
        else:
            enstr+=chr(k+key-57+48)
    else:
        enstr+=str[i]
print(enstr)
################################################
def caesar_cipher(text, key):
    result = ''
    for char in text:
        if char.isalpha():  # 检查字符是否是字母
            shift = 65 if char.isupper() else 97  # 如果是大写字母则为65,小写字母则为97
            result += chr((ord(char) - shift + key) % 26 + shift)  # 加密字符
        else:
            result += char  # 如果不是字母则直接添加到结果中
    return result
# 测试
text = 'EmBmP5Pmn7QcPU4gLYKv5QcMmB3PWHcP5YkPq3=cT6QckkPckoRG'
key = 3
encrypted_text = caesar_cipher(text, key)
print("加密后的文本:", encrypted_text)

第一个是自定义的,第二个取余的不太清楚,有时间再写一篇相关的

解密就是进行反操作

enc = 'EmBmP5Pmn7QcPU4gLYKv5QcMmB3PWHcP5YkPq3=cT6QckkPckoRG'
l = len(enc)
key=3
# print(l, 52 / 13)
# deenc = []
# for i in range(l):
#     if 65 <= ord(enc[i]) <= 90:
#         deenc.append((ord(enc[i]) - 62) // 26 + 65)
#     elif 97 <= ord(enc[i]) <= 122:
#         deenc.append((ord(enc[i]) - 94) // 26 + 97)
#     elif 48 <= ord(enc[i]) <= 57:
#         deenc.append((ord(enc[i]) - 45) // 10 + 48)
#     else:
#         deenc.append(ord(enc[i]))
# print(deenc)
# for j in range(l):
#     print(chr(deenc[j]), end='')
destr=''
for i in range(l):
    m=ord(enc[i])
    if 65<=m<=90:
        if m-key<65:
            destr+=chr(m-key+26)
        else:
            destr+=chr(m-key)
    elif 97<=m<=122:
        if m-key<97:
            destr+=chr(m-key+26)
        else:
            destr+=chr(m-key)
    elif 48<=m<=57:
        if m-key<48:
            destr+=chr(m-key+10)
        else:
            destr+=chr(m-key)
    else:
        destr+=enc[i]
print(destr)

加密解密差不多感觉