开源:凯撒密码

程序介绍

本程序可以将用户输入的内容通过非固定的凯撒密码字典进行加/解密,是一种好用加密的加密聊天方式。

历史记载

Caesar cipher,发明者Caesar(凯撒),罗马人。
根据苏维托尼乌斯的记载,恺撒曾用此方法对重要的军事信息进行加密:
如果需要保密,信中便用暗号,也即是改变字母顺序,使局外人无法组成一个单词。如果想要读懂和理解它们的意思,得用第4个字母置换第一个字母,即以D代A,余此类推。
同样,奥古斯都也使用过类似方式,只不过他是把字母向右移动一位,而且末尾不折回。每当他用密语写作时,他都用B代表A,C代表B,其余的字母也依同样的规则;他用A代表Z。
另外,有证据表明,恺撒曾经使用过更为复杂的密码系统:文法学家普罗布斯曾经写过一份独具创新的手稿,研究恺撒书信中包含有秘密信息的字母。
已经无法弄清恺撒密码在当时有多大的效果,但是有理由相信它是安全的。因为恺撒大部分敌人都是目不识丁的,而其余的则可能将这些消息当作是某个未知的外语。即使有某个敌人获取了恺撒的加密信息,根据现有的记载,当时也没有任何技术能够解决这一最基本、最简单的替换密码。现存最早的破解方法记载在公元9世纪阿拉伯的阿尔·肯迪的有关发现频率分析的著作中。

原理

这是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以罗马共和时期凯撒的名字命名的,当年凯撒曾用此方法与其将军们进行联系。

使用方法

进入程序后,会有像下面这样的提示:

请在这输入你想加密/解密的内容文本:

随便输入一段英文(此程序仅支持英文和数字,原因看原理):例如Fuck you

然后回车:

请在这输入你想加密/解密的内容文本:Fuck you
您需要加密(输入数字1)还是解密(输入数字2)?:

我们在这输入的是可看的原文,所以我们要加密,输入1,回车:

请在这输入你想加密/解密的内容文本:Fuck you
您需要加密(输入数字1)还是解密(输入数字2)?:1
请输入要右移位移的字母(可以为负):

我们以位移+3(这是当年的默认值,输入其他值可以为负,但是必须加负号,正数的正号加不加无所谓)为例,输入并回车:

请在这输入你想加密/解密的内容文本:Fuck you
您需要加密(输入数字1)还是解密(输入数字2)?:1
请输入要右移位移的字母(可以为负):3
ixfn brx
---------------------------------
请在这输入你想加密/解密的内容文本:

程序里面用了循环,所以输出完后会自动进行下一次,这适合正在加密聊天的折腾者。

同样,我们把加密好的文本复制完后重新输入,选择2进行反加密(解密),位移了多少仍然填3:

……
---------------------------------
请在这输入你想加密/解密的内容文本:ixfn brx
您需要加密(输入数字1)还是解密(输入数字2)?:2
请在此处输入要解密的文本被向右移位了多少(可以为负):3
fuck you
请在这输入你想加密/解密的内容文本:

这样解密就成功了,是不是真的很适合爱折腾的你?赶紧发给你的朋友,约定一个固定的位移数(加密密钥)进行愉快的无限制聊天吧!

文件(夹)介绍

programs文件夹

存放主程序及图标文件

en-WW.exe

英文版主程序(在en-ww文件夹内)

ico.ico

程序图标,透明底的

zh-CN.exe

中文版主程序

records.log

日志文件,主要通过自编模块 keeplog 生成,内容为“日期(Y/M/D)+时间(h/m/s)+加密密钥+输入/输出内容+分割线”

Readme.md

本文件,程序说明文档,属于Markdown文档,建议使用Markdown编辑器查看。


开源说明

开源项目目的

为了大佬的指点和向小白提供更好的加密聊天类程序的写法教程

文件说明

programs(文件夹)

存放程序

en-ww.py

英文版程序源码

zh-CN.py

中文版程序源码

keeplog.py

模块源码

ico.ico

程序图标

records.log

程序使用会生成的日志文件


源码介绍

模块

keeplog.py

先导入时间模块,为了获取当前时间并输出到日志文件:

import time

定义函数keeplog(),并获取三个变量值,并使用输出到文件的方式记录日志:

def keeplog(Number_of_displacements,message,result):
    fp = open('..\\records.log','a+')
    print(time.strftime("%Y/%m/%d %H:%M:%S") + "\nAction type: Encryption\nNunber of displacements: " + str(Number_of_displacements) + "\nInput: " + message + "\nOutput:" + result + "\n----------------------------------------------------",file = fp)
    fp.close()

主程序(以英文版为例)

导入模块 keeplog :

import keeplog

生成加密字典和解密字典:

password_dict = {1 : 'a',2 : 'b',3 : 'c',4 : 'd',5 : 'e',6 : 'f',7 : 'g',8 : 'h',9 : 'i',10 : 'j',11 : 'k',12 : 'l',13 : 'm',14 : 'n',15 : 'o',16 : 'p',17 : 'q',18 : 'r',19 : 's',20 : 't',21 : 'u',22 : 'v',23 : 'w',24 : 'x',25 : 'y',26 : 'z'}
f_dict = {letter:x for x,letter in password_dict.items()}

开始 while 循环并获取用户输入,按要求进行操作,最后输出:

while True:

    result = ''  # Create a variable with empty value.
    message = input('Please enter what you want to encrypt/decrypt here:')  # User enters plaintext or ciphertext
    message = message.lower()  # Convert all input to lowercase

    text_type = str(input('Do you need to encrypt (enter the number 1) or decrypt (enter the number 2)?'))

    if text_type == '1':
        #Encryption_key = input('Enter your encryption equation here:')  # It is a Linear Function.
        Number_of_displacements = int(input('Please enter the letter to be shifted to the right by a few digits(can be negative):'))
        #z = x + Number_of_displacements
        if Number_of_displacements != 0:
            for i in message:
                if i in f_dict.keys():
                    z = f_dict[i]
                    y = z + Number_of_displacements
                    if y > 26:
                        y = y - 26
                    result += password_dict[y]
                else:
                    result += i
                #print(x)
            print("Small letter: " + result + " / Big letter: " + result.upper() + "\n---------------------------------")
            keeplog.keeplog(Number_of_displacements,message,result)  # Keep logs
        elif Number_of_displacements == 0 or '':
            print('The entered value is empty or does not meet the requirements...')

    elif text_type == '2':
        Number_of_displacements = int(input('Please enter here the text you want to decrypt has been shifted to the right by a few bits (can be negative):'))
        if Number_of_displacements != 0:
            for i in message:
                if i in f_dict.keys():
                    z = f_dict[i]
                    y = z - Number_of_displacements
                    if y < 0:
                        y = y + 26
                    result += password_dict[y]
                else:
                    result += i
            print("Small letter: " + result + " / Big letter: " + result.upper() + "\n---------------------------------")
            keeplog.keeplog(Number_of_displacements,message,result)
        elif Number_of_displacements == 0 or '':
            print('The entered value is empty or does not meet the requirements...')
    else:
        print("The entered value is empty or does not meet the requirements...")

开源地址(附成品)

https://moecloud.cn/s/PdoQIM

版权声明:
作者:灰尘疾客
链接:https://www.gkcoll.xyz/64.html
来源:极客藏源
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>