凯撒密码

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

原理

💻 首先我是使用的python进行编写的,先导入python中的string库,这样我们就很方便的使用库函数 把大写字母和小写字母引入进来,然后在通过ASCILL码对里面的值进行判断和移动其中的值。

🌤️下面直接上代码!

两种方法
方法1 对字母加密
方法2 对中文和字母都加密

代码

方法1

1
2
3
4
5
6
7
8
def kaisa():
s = input("加密的密文:")
dt={}
for ch in (65,97):
for i in range(26):
dt[chr(i+ch)]=chr((i+13)%26+ch)
ms = "".join([dt.get(ch,ch) for ch in s])
print(ms)

方法二

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import string
def kaisa(encryption, move):
lower = string.ascii_lowercase
upper = string.ascii_uppercase
before = string.ascii_letters
after = lower[move:] + lower[:move] + upper[move:] + upper[:move]
print(after)
table = ''.maketrans(before, after)
print(table)
return encryption.translate(table)


def jiemi(deciphering,move):
list = []
for i in deciphering:
ascl = ord(i) - move
list.append(chr(ascl))
print(f'解密结果:{list}')

encryption = input("输入一个字符串:")
move = int(input("输入一个位移下标:"))
kaisa1 = kaisa(encryption, move)
print(f'加密结果:{kaisa1}')
deciphering = jiemi(kaisa1,move)

结果

凯撒算法

RC4序列密码

RC4序列密码是大名鼎鼎的RSA三人组中的头号人物Ron Rivest在1987年设计的密钥长度可变的流加密算法簇。RC4算法是一种在电子信息领域加密的技术手段,用于无线通信网络,是一种电子密码,只有经过授权(缴纳相应费用)的用户才能享受该服务。

原理

💻 RC4算法的原理很简单,包括初始化算法(KSA)和伪随机子密码生成算法(PRGA)两大部分。假设S-box的长度为256,密钥长度为Len。先来看看算法的初始化部分(用C代码表示):

    参数1是一个256长度的char型数组,定义为: unsigned char sBox[256];
    参数2是密钥,其内容可以随便定义:char key[256];
    参数3是密钥的长度,Len = strlen(key);

在初始化的过程中,密钥的主要功能是将S-box搅乱,i确保S-box的每个元素都得到处理,j保证S-box的搅乱是随机的。而不同的S-box在经过伪随机子密码生成算法的处理后可以得到不同的子密钥序列,将S-box和明文进行xor运算,得到密文,解密过程也完全相同。 再来看看算法的加密部分(用C代码表示):

    参数1是上边rc4_init函数中,被搅乱的S-box;
    参数2是需要加密的数据data;
    参数3是data的长度.

💌看了上面的文字,你是不是也会有一定的疑惑,请接着看下面的图片,这将会使你恍然大悟!!!当然,如果你去看代码,你会发现 代码是根据你自己输入你想加密的内容,若有不懂,可以再下方留言哦!

RC4算法

🌤️下面直接上代码!

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <stdio.h>
#include <string.h>
typedef unsigned long ULONG;

/*初始化函数*/
void rc4_init(unsigned char*s, unsigned char*key, unsigned long Len)
{
int i = 0, j = 0;
char k[256] = { 0 };
unsigned char tmp = 0;
for (i = 0; i<256; i++)
{
s[i] = i;
k[i] = key[i%Len];
}
for (i = 0; i<256; i++)
{
j = (j + s[i] + k[i]) % 256;
tmp = s[i];
s[i] = s[j];//交换s[i]和s[j]
s[j] = tmp;
}
}

/*加解密*/
void rc4_crypt(unsigned char*s, unsigned char*Data, unsigned long Len)
{
int i = 0, j = 0, t = 0;
unsigned long k = 0;
unsigned char tmp;
for (k = 0; k<Len; k++)
{
i = (i + 1) % 256;
j = (j + s[i]) % 256;
tmp = s[i];
s[i] = s[j];//交换s[x]和s[y]
s[j] = tmp;
t = (s[i] + s[j]) % 256;
Data[k] ^= s[t];
}
}

int main()
{
unsigned char s[256] = { 0 }, s2[256] = { 0 };//S-box
char key[256];
puts("请输入需要加密的明文:");
gets(key);
char pData[512];
puts("请输入一个用来加密的数据Data:");
gets(pData);
unsigned long len = strlen(pData);
printf("这是Pdata的长度:%d\n\n",len);
int i;
printf("pData=%s\n", pData);
printf("key=%s,length=%d\n\n", key, strlen(key));
rc4_init(s, (unsigned char*)key, strlen(key));//已经完成了初始化
printf("完成对S[i]的初始化,如下:\n\n");
for (i = 0; i<256; i++)
{
printf("%02X", s[i]);
if (i && (i + 1) % 16 == 0)putchar('\n');
}
printf("\n\n");
for (i = 0; i<256; i++)//用s2[i]暂时保留经过初始化的s[i],很重要的!!!
{
s2[i] = s[i];
}
printf("已经初始化,现在加密:\n\n");
rc4_crypt(s, (unsigned char*)pData, len);//加密
printf("pData=%s\n\n", pData);
printf("已经加密,现在解密:\n\n");
//rc4_init(s,(unsignedchar*)key,strlen(key));//初始化密钥
rc4_crypt(s2, (unsigned char*)pData, len);//解密
printf("pData=%s\n\n", pData);
return 0;
}

结果

RC4算法

美国数学家维纳年龄

推算年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。 他曾在1935~1936年应邀来中国清华大学讲学。一次,他参加某个重要会议,年轻的脸孔引人注目 。于是有人询问他的年龄,他回答说:“我年龄的立方是个4位数。我年龄的4次方是个6位数。 这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。”请你推算一下,他当时到底有多年轻。

原理

💻 首先根据题意可以大胆的把年龄进行划定范围10到100岁之间其次根据年龄的立方是个4位数,当然30岁可能不好推理,年龄的4次方是个6位数找到所有的可能 最后根据10个数字正好包含了从0到9这10个数字,每个都恰好出现1次这个条件筛选出最终答案。

具体思路:
1.确定这位美国数学家的年龄应该是在10岁~100岁之间 
2.确定年龄的立方是四位数
3.确定年龄的立方是六位数
4.确定这十个数字恰好出现一次
    

💌看了上面的文字,你是不是也会有一定的疑惑,请接着看下面的图片,这将会使你恍然大悟!!!可以再下方留言哦!

代码

看代码之前必须要学会的函数哦
# str() 它将参数转换成字符串类型
# set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
# len() 计算字符串的长度

🌥️上代码

1
2
3
4
5
6
for i in range(10, 100):
age_1 = str(i ** 3)
age_2 = str(i ** 4)
if len(age_1) == 4 and len(age_2) == 6:
if len(set(age_1 + age_2)) == 10:
print(f'他的年龄是: {i}')

结果

推算年龄