Algorithm Created 2023-03-20 | Updated 2023-06-03
| Post View:
凯撒密码
凯撒密码 是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是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 stringdef 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的长度.
💌看了上面的文字,你是不是也会有一定的疑惑,请接着看下面的图片,这将会使你恍然大悟!!!当然,如果你去看代码,你会发现
代码是根据你自己输入你想加密的内容,若有不懂,可以再下方留言哦!
🌤️下面直接上代码!
代码 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[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[j] = tmp; t = (s[i] + s[j]) % 256 ; Data[k] ^= s[t]; } } int main () { unsigned char s[256 ] = { 0 }, s2[256 ] = { 0 }; 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]; } printf ("已经初始化,现在加密:\n\n" ); rc4_crypt(s, (unsigned char *)pData, len); printf ("pData=%s\n\n" , pData); printf ("已经加密,现在解密:\n\n" ); rc4_crypt(s2, (unsigned char *)pData, len); printf ("pData=%s\n\n" , pData); return 0 ; }
结果
美国数学家维纳年龄
推算年龄
美国数学家维纳(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} ' )
结果