参考,我们任课老师的WORD和PPT,结合自己的理解,在结合网上文章的理解。
BASE64编码中,特征和所拥有的字符字母:A-Z a-z;数字:0-9;符号:+ / ,然后末尾经常有一个“=”或者两个“==”。
原理,先把需要加密的字符串每个字符转换成ASCII码,然后ASCII码转换成二进制为8位二进制数字表示,然后在以六位二进制为一组转十进制,最后查找对应的BASE64对照表即可。
ASCII表,常用的无非就是大写字母和小写字母,大写字母的A开始是97,小写字母的a开始是65,推算下即可。
比如,这里需要加密“Ken”这个字符串,里面有大写和小写,查找ASCII码表,分别对应的是75 101 110,转换成二进制75:01001011; 101:01100101; 110:01101110;,先并排在一起,就是010010110110010101101110,然后在以六个为一组排序?010010 | 110110 | 010101 | 101110,将这六个二进制重新转换成十进制,分别对应的是,18 54 21 46,然后对应base64码表,找出对应的上面重新转换成的十进制数字即可,分别是?S2Vu,所以Ken这个字符串BASE64加密编码之后是S2Vu,如果不太清楚,看如下表格。
| 文本 | K | e | n | NULL |
|---|---|---|---|---|
| ASCII编码 | 75 | 101 | 110 | NULL |
| 二进制位 | 01001011 | 01100101 | 01101110 | NULL |
| 分组 | 010010 | 110110 | 010101 | 101110 |
| 转换后的十进制&BASE64码表索引 | 18 | 54 | 21 | 46 |
| 结果&Base64码表 | S | 2 | V | u |
这样应该就差不多了,附上BASE64索引表,如下
| 数值 | 字符 | 数值 | 字符 | 数值 | 字符 | 数值 | 字符 | |||
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | A | 16 | Q | 32 | g | 48 | w | |||
| 1 | B | 17 | R | 33 | h | 49 | x | |||
| 2 | C | 18 | S | 34 | i | 50 | y | |||
| 3 | D | 19 | T | 35 | j | 51 | z | |||
| 4 | E | 20 | U | 36 | k | 52 | 0 | |||
| 5 | F | 21 | V | 37 | l | 53 | 1 | |||
| 6 | G | 22 | W | 38 | m | 54 | 2 | |||
| 7 | H | 23 | X | 39 | n | 55 | 3 | |||
| 8 | I | 24 | Y | 40 | o | 56 | 4 | |||
| 9 | J | 25 | Z | 41 | p | 57 | 5 | |||
| 10 | K | 26 | a | 42 | q | 58 | 6 | |||
| 11 | L | 27 | b | 43 | r | 59 | 7 | |||
| 12 | M | 28 | c | 44 | s | 60 | 8 | |||
| 13 | N | 29 | d | 45 | t | 61 | 9 | |||
| 14 | O | 30 | e | 46 | u | 62 | + | |||
| 15 | P | 37 | f | 47 | v | 63 | / |
在附上一张ASCII码表图,如下图,图来自于网络。

比如a这个字母,ASCII码是65,转换成二进制是01000001,转换成六个一组010000 | 01,就会发现后面不足以组成六位数,就可以在后面添零,就变成了?010000 | 010000,转换成十进制就是16,然后根据BASE64码表对应的是Q,那么a的加密后就是QQ,但是我自己的理解是,加密后的长度也就是编码后的长度必须能整除4,才可以,这里QQ不能整除4所以不行,就可以加上=,长度就可以了,所以最终的编码就是QQ==。
另外一种理解,如果要进行编码的字符串,不能被3整除,后面会多出一个字节或者两个字节,就可以使用“”来代替,比如编码a,不能被三整除,还差两位就可以被三整除,就可以在最终编码结果加上两个"",结合如下图理解更好。

和base64加密差不多,这里直接举例子,先看下表是base32的索引表,比如这里我要BASE32编码,Ken,对应的ASCII码分别是,75 101 110,转换成二进制分别对应的是75:01001011; 101:01100101; 110:01101110,然后合在一起,是0100101101100101011011100,然后在以五个一组排序?01001 | 01101 | 10010 | 10110 | 11100,然后在转换成十进制就是,9 13 18 22 28,根据下面的索引表,就是,JNSW4,这里只有五个数,必须要四个四个一组,不足四个就用=,来填充,所以就是JNSW4===。
| 数值 | 字符 | 数值 | 字符 | 数值 | 字符 | 数值 | 字符 | |||
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | A | 9 | J | 18 | S | 27 | 3 | |||
| 1 | B | 10 | K | 19 | T | 28 | 4 | |||
| 2 | C | 11 | L | 20 | U | 29 | 5 | |||
| 3 | D | 12 | M | 21 | V | 30 | 6 | |||
| 4 | E | 13 | N | 22 | W | 31 | 7 | |||
| 5 | F | 14 | O | 23 | X | |||||
| 6 | G | 15 | P | 24 | Y | |||||
| 7 | H | 16 | Q | 25 | Z | |||||
| 8 | I | 17 | R | 26 | 2 |
可以看如下表格
| 文本 | K | e | n | NULL | NULL |
|---|---|---|---|---|---|
| ASCII编码 | 75 | 101 | 110 | NULL | NULL |
| 二进制位 | 01001011 | 01100101 | 01101110 | NULL | NULL |
| 分组 | 01001 | 01101 | 10010 | 10110 | 11100 |
| 分组后的十进制 | 9 | 13 | 18 | 22 | 28 |
| 索引值 | J | N | S | W | 4 |
如果理解了,base64加密和base32加密方式,那么base16加密方式就很好理解了,先看如下base16索引表。
| 数值 | 字符 | 数值 | 字符 | |
|---|---|---|---|---|
| 0 | 0 | 8 | 8 | |
| 1 | 1 | 9 | 9 | |
| 2 | 2 | 10 | A | |
| 3 | 3 | 11 | B | |
| 4 | 4 | 12 | C | |
| 5 | 5 | 13 | D | |
| 6 | 6 | 14 | E | |
| 7 | 7 | 15 | F |
先还是和base64和base32一样将需要加密的字符串转换成ASCII码然后转换成二进制,区别就是分组排序的时候是以4个为一组来排序,base64是六个为一组,base32是以五个为一组,如下图理解即可,图来自CSDN。

特征是以\u数字或者字母加数字,比如,\u6211,转换中文就是“我”,\u过后是每四个为一组,最简单解码方式可以使用python的print函数输出即可,编码?\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064,解码效果如下图?,成功解码出字符串Hello World

上面是解密,加密如下。
编码原理,先将需要加密的字符转换成ASCII编码,然后把ASCII编码转换成十六进制即可,不足四位前面添0即可,比如a这个字符,编码之后是0x61,就需要加零就是0x0061,如下是python实现,非常简单。
最重要的就是ord函数和hex函数,ord函数把字符转ASCII,然后hex把数字转十六进制。
str='flag'
dict = []
for i in str:
result = hex(ord(i)).replace(r'0x',r'\u')
dict.append(result)
print("".join(dict))
在浏览器地址栏经常能看见,特征是%数字加字母,比如?%E4%BD%A0%E5%A5%BD%E4%B8%96%E7%95%8C,这种类型的,解码之后的原文是,你好世界,还是需要用到python,当然也可以在线编码解码,需要用到的是python的urllib模块下面的parse模块,如下代码。
quote是编码
import urllib.parse as url
str = '你好世界'
print(url.quote(str))
输入效果如下
%E4%BD%A0%E5%A5%BD%E4%B8%96%E7%95%8C
如何解码,如下python代码。
import urllib.parse as url
str = '%E4%BD%A0%E5%A5%BD%E4%B8%96%E7%95%8C'
print(url.unquote(str))
解码效果为你好世界
可以用到一个函数bin函数,可以之间转换,如下代码。
print(bin(10))
输出结果是0b1010
可以用到一个int函数,如下代码,int函数里面的2代表的是进制。
str = '1010'
print(int(str,2))
输出的数字是10。
需要用到一个oct函数,如下代码。
print(oct(100))
输入结果是0o144
和上面二进制转十进制差不多,如下代码,只需要更改数字即可
str = '144'
print(int(str,8))
需要用到一个hex函数,如下代码。
print(hex(255))
输出结果是0xff,十六进制转换十进制和上面差不多,只需要更改数字即可。
可以直接参考百度百科?进制转换。
1.明文:State Key Laboratory of Networking and Switching
2.加密密钥:key=(1,5,6,2,3)
3.将明文分组,按照六个字母一组来分,总共可以分为七组,不足六个字母的可以用双方事先规定好的字符来填充比如空格,如下是分组过后的样子?。
P = (StateK)(eyLabo)(ratory)(ofNetw)(orking)(andSwi)(tching)
4.对每组字符进行加密,根据加密密钥key,把每组的第1位字符放在第5位字符上面,第5位字符放在第6位字符上面,第6位字符放在第2位字符上面,第2位字符放在第3位字符上面,第3位字符放在第1位字符上面,这样排序即可,如下?。
P = (aKttSe)(Loyaeb)(tyaorr)(Nwfeot)(kgrion)(dinSaw)(hgcitn)
最终密文就是aKttSeLoyaebtyaorrNwfeotkgriondinSawhgcitn
解密需要的是把密钥给反向过来,原本的密钥是(1,5,6,2,3)需要逆置换变成(1,3,2,6,5),然后在按照加密的方法即可解密。
栅栏密码潜规则,字符不会超过30个。
假设明文是:THEREISACIPHER,然后根据上下上下排序,就是
T E E S C P E
H R I A I H R
最后连在一起就是TEESCPEHRIAIHR。
加密的另外一种方法,明文是THEREISACIPHER,先两个两个分一组,就是,TH ER EI SA CI PH ER。
先取出第一个字母:TEESCPE
在取出第二个字母:HRIAIHR
最后连在一起即可。
加密密文:TEESCPEHRIAIHR
解密只需要将密文从中间分开,变位两行。
T E E S C P E
H R I A I H R
最后在上下上下组合起来即可。
THEREISACIPHER
假设明文是:helloWorld
假设密钥是:KENSSB,去掉重复的字母就是KENSB,然后按照字母顺序排列剩余的字母即可得到一个方阵表,如下表。
| K | E | N | S | B |
|---|---|---|---|---|
| A | C | D | F | G |
| H | I | J | L | M |
| O | P | Q | R | T |
| U | V | W | X | Y |
| Z |
然后在从左边下边开始一直到右边排序,即可得到代换密文,代换密码表如下表所示。
| 明文字母 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 密文字母 | K | A | H | O | U | Z | E | C | I | P | V | N | D | J | Q | W | S | F | L | R | X | B | G | M | T | Y |
然后按照,明文字母所对应的密文字母,找到排序即可,helloword加密之后的密文是CUNNQGQFNO
最后一个字母代表的十第一个字母,倒数第二个字母代表的十第二个字母,如下表所示。
| 明文字母 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 密文字母 | Z | Y | X | W | V | U | T | S | R | Q | P | O | N | M | L | K | J | I | H | G | F | E | D | C | B | A |
根据如下表排序,如下表是最基础的凯撒密码,就是往右移位,A对应的B,B对应的是C,比如明文是KEN,那么按照下表密文对应的就是LFO。
| 明文字母 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 密文字母 | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A |
python代码如下,1代表的是移位。
def caser():
flag = 'HelloWorld'.upper()
dict_txt = 'abcdefghijklmnopqrstuvwxyz'.upper()
dec = []
for i in flag:
dec.append(dict_txt[dict_txt.index(i)+1])
print("".join(dec))
if __name__ == '__main__':
caser()
原理是,先将26个字母按照0-25排序也就是(0,1,2,3...25),密钥为k(a,b),加密公式为c=Ea,b(m)≡am+b(mod26),解密公式为m=Da,b(c)≡a-1(c-b)(mod26)。
如下表是字母索引表
| A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 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 |
例如我这里要加密helloworld加密过程并且密钥是k(7,21):
h=7,7*7+21(mod26)=18,h=s
e=4,7*4+21(mod26)=23,e=x
l=11,7*11+21(mod26)=20,l=u
l=11,7*11+21(mod26)=20,l=u
o=14,7*14+21(mod26)=15,o=p
w=22,7*22+21(mod26)=19,w=t
o=14,7*14+21(mod26)=15,o=p
r=17,7*17+21(mod26)=10,r=k
l=11,7*11+21(mod26)=20,l=u
d=3,7*3+21(mod26)=16,d=q
所以helloworld加密之后的成果是sxuuptpkuq。
知道解密公式是m=Da,b(c)≡a-1(c-b)(mod26)&m=D7,21(c)≡7-1(c-21)(mod26) ,密文是sxuuptpkuq,解密过程如下。
s=18,7^-1*(18-21)(mod26)
x=23,7^-1*(23-21)(mod26)
省略。。。。
如下是加密代码。
def affine_cipher_en():
flag = input('请输入你要加密的明文:')
k_a = int(input("请输入密钥中的第一个值a:"))
k_b = int(input("请输入密钥中的第一个值b:"))
flag_list = list(flag.lower())
flag_en = []
for i in flag_list:
flag_en.append(chr(((k_a * (ord(i)-97) + k_b) % 26)+97))
print(''.join(flag_en))
affine_cipher_en()
如下是python解密代码
#解密脚本
def affine_cipher_de():
flag = input('请输入你要解密的明文:')
k_a = int(input("请输入密钥中的第一个值a:"))
k_b = int(input("请输入密钥中的第一个值b:"))
flag_list = list(flag.lower())
flag_de = []
for i in flag_list:
flag_de.append(chr((15 * (ord(i) - 97 - k_b)) % 26 + 97))
print(''.join(flag_de))
棋盘密码就是将26个字母放在5x5的方格子里面,ij放在一个格子里面,具体如下表?。
| 1 | 2 | 3 | 4 | 5 | |
|---|---|---|---|---|---|
| 1 | a | b | c | d | e |
| 2 | f | g | h | i/j | k |
| 3 | l | m | n | o | p |
| 4 | q | r | s | t | u |
| 5 | v | w | x | y | z |
其中特点就是每两个数字编做一组,所有的数字都在1-5之间浮动,并且是先列后行的顺序排序。
比如25 15 33,所对应的就是Ken
假设密钥是kensb,那么排序之后如下表,前面和单表代换一样,假设明文是stegab
| k | e | n | s | b |
|---|---|---|---|---|
| A | C | D | F | G |
| H | I/J | L | M | O |
| P | Q | R | T | U |
| V | W | X | Y | Z |
加密原理就是如果假设需要加密明文里面的s对应的是p1,t对应的是p2,
1.那么p1,p2在同一行则对应的密文就是紧靠p1,p2右端的字母。
2.如果p1,p2在同一列则对应的密文分别是仅靠p1,p2下端的字母。
3.如果p1,p2不在同一列也不再同一行,那么对应的密文应该是p1,p2为对角顶点确定的矩阵的另外的两个顶点字母,按照同行原则对应。
加密效果如下表。
| st | eg | ab |
|---|---|---|
| FY | BC | GK |
解密就是加密过程。
维吉尼亚密码就是一些偏移量不同的凯撒密码组成的,首先需要如下表。
| A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 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 |
假设密钥是TAKAGISAN,则对应上面?表转换成数字密钥就是key=(19,0,10,0,6,8,18,0,13)。
假设明文是TAKAGISAN IS THE FIRST IN THE WORLD,然后按照密钥分为九个一组,密钥数字排序如果不够,可以从头开始排序,如下表操作即可,假设下面对应的索引数字为a,密钥数字为b,那么加密之后的数字c就是(a+b)mod26取余数即可,最后在按照上表对应的数字排序即可得到密文。
| 明文 | T | A | K | A | G | I | S | A | N | I | S | T | H | E | F | I | R | S | T | I | N | T | H | E | W | O | R | L | D |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 对应的索引数字 | 19 | 0 | 10 | 0 | 6 | 8 | 18 | 0 | 13 | 8 | 18 | 19 | 7 | 4 | 5 | 8 | 17 | 18 | 19 | 8 | 13 | 19 | 7 | 4 | 22 | 14 | 17 | 11 | 3 |
| 密钥数字 | 19 | 0 | 10 | 0 | 6 | 8 | 18 | 0 | 13 | 19 | 0 | 10 | 0 | 6 | 8 | 18 | 0 | 13 | 19 | 0 | 10 | 0 | 6 | 8 | 18 | 0 | 13 | 19 | 0 |
| 加密之后的数字 | 12 | 0 | 20 | 0 | 12 | 16 | 10 | 0 | 0 | 1 | 18 | 3 | 7 | 10 | 13 | 0 | 17 | 5 | 12 | 8 | 23 | 19 | 13 | 12 | 14 | 14 | 4 | 4 | 3 |
| 密文 | M | A | U | A | M | Q | K | A | A | B | S | D | H | K | N | A | R | F | M | I | X | T | N | M | O | O | E | E | D |
所以TAKAGISAN IS THE FIRST IN THE WORLD加密之后的密文是MAUAMQKAABSDHKNARFMIXTNMOOEED。公式就是(a+b)mod26=c。
假设已经知道了密钥是TAKAGISAN密钥是key=(19,0,10,0,6,8,18,0,13),公式是(c-b)mod26=a,也就是对应的索引数字减去密钥数字再来mod26即可,如下表。
| 密文 | M | A | U | A | M | Q | K | A | A | B | S | D | H | K | N | A | R | F | M | I | X | T | N | M | O | O | E | E | D |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 对应的索引数字 | 12 | 0 | 20 | 0 | 12 | 16 | 10 | 0 | 0 | 1 | 18 | 3 | 7 | 10 | 13 | 0 | 17 | 5 | 12 | 8 | 23 | 19 | 13 | 12 | 14 | 14 | 4 | 4 | 3 |
| 密钥数字 | 19 | 0 | 10 | 0 | 6 | 8 | 18 | 0 | 13 | 19 | 0 | 10 | 0 | 6 | 8 | 18 | 0 | 13 | 19 | 0 | 10 | 0 | 6 | 8 | 18 | 0 | 13 | 19 | 0 |
| 解密之后的数字 | 19 | 0 | 10 | 0 | 6 | 8 | 18 | 0 | 13 | 8 | 18 | 19 | 7 | 4 | 5 | 8 | 17 | 18 | 19 | 8 | 13 | 19 | 7 | 4 | 22 | 14 | 17 | 11 | 3 |
| 明文 | T | A | K | A | G | I | S | A | N | I | S | T | H | E | F | I | R | S | T | I | N | T | H | E | W | O | R | L | D |
当然也是字符对应字母,如下表
字母表
| 字符 | 电码符号 | 字符 | 电码符号 | 字符 | 电码符号 | 字符 | 电码符号 |
|---|---|---|---|---|---|---|---|
| A | .- | B | -... | C | -.-. | D | -.. |
| E | . | F | ..-. | G | --. | H | .... |
| I | .. | J | .--- | K | -.- | L | .-.. |
| M | -- | N | -. | O | --- | P | .--. |
| U | ..- | V | ...- | W | .-- | X | -..- |
| Y | -.-- | Z | --.. |
标点符号
| 字符 | 电码符号 | 字符 | 电码符号 | 字符 | 电码符号 | 字符 | 电码符号 |
|---|---|---|---|---|---|---|---|
| . | .-.-.- | : | ---... | , | --..-- | ; | -.-.-. |
| ? | ..--.. | = | -...- | ' | .---- | / | -..-. |
| ! | -.-.-- | - | -....- | - | ..--.- | " | .-..-. |
| ( | -.--. | ) | -.--.- | $ | ...-..- | & | .... |
| @ | .--.-. | + | .-.-. |
数字长码
| 字符 | 电码符号 | 字符 | 电码符号 | 字符 | 电码符号 | 字符 | 电码符号 |
|---|---|---|---|---|---|---|---|
| 0 | ----- | 1 | .---- | 2 | ..--- | 3 | ...-- |
| 4 | ....- | 5 | ..... | 6 | -.... | 7 | --... |
| 8 | ---.. | 9 | ----. |
在线解密网址?摩斯电码在线解密。
MD5不可逆,只能通过枚举,MD5的特征是,(1)长度固定,(2)只可能小写和数字32个字符?在线CMD加密解密,比如加密123456,如下。
MD5:e10adc3949ba59abbe56e057f20f883e。
用格子来做的简单替换,加密,如下图格子适应,和对应图。

如下是字母对应图?。

按照图表来加密解密即可。
也是简单的替换密码,如下表替换。
| 1 | 2 abc | 3 def |
|---|---|---|
| 4 ghi | 5 jkl | 6 mno |
| 7 pqrs | 8 tuv | 9 wxyz |
没有1,比如a在第二个格子那么就是21,z在第9个格子就是94,k在第五个格子就是52。
指的是按照QWE键盘顺序来加密也就是QWERTYUIOP这种,如下表所示。
| A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Q | W | E | R | T | Y | U | I | O | P | A | S | D | F | G | H | J | K | L | Z | X | C | V | B | N | M |
入?表加密即可。
先如下图所示,如果是(红色,黄色)也就是先行后列的顺序,(1,1)=Q,(1,2)=W,(2,1)=A,(2,2)=S。
如果是(黄色,红色)也就是先列后行的顺序,(1,1)=Q,(1,2)=A,(2,1)=W,(2,2)=S。

也是一种换位密码,需要双方事先约定好密钥(曲路路线)
假设明文是Takagisan is the best in the world。
填入4行七列表(需要事先约定好)
| T | a | k | a | g | i | s |
|---|---|---|---|---|---|---|
| a | n | i | s | t | h | e |
| b | e | s | t | i | n | t |
| h | e | w | o | r | l | d |
如下图?加密回环路线,从右往左(需要事先声明好),最终加密效果就是,dtesihnlritgastowsjkaneehbat,解密也非常简单,按照约定,4行7列,回环路线从右往左,密文从左到右,重新排序即可。

当铺密码就是中文与数字的结合,当前的汉字有多少笔画出头,就是转换成数字几。
如下表,就是当铺密码所对应的汉字和所对应的数字。
| 汉字 | 所对应的数字 |
|---|---|
| 由 | 1 |
| 中 | 2 |
| 人 | 3 |
| 工 | 4 |
| 大 | 5 |
| 王 | 6 |
| 夫 | 7 |
| 井 | 8 |
| 羊 | 9 |
比如夫大 工大 夫井,就是75 45 78,对应ASCII码就是KEN。
第一种方法如下表
| 字母 | 加密后 | 字母 | 加密后 | 字母 | 加密后 | 字母 | 加密后 | 字母 | 加密后 | 字母 | 加密后 | 字母 | 加密后 | 字母 | 加密后 | 字母 | 加密后 | 字母 | 加密后 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| A | aaaaa | B | aaaab | C | aaaba | D | aaabb | E | aabaa | F | aabab | G | aabba | H | aabbb | I | abaaa | J | abaab |
| K | ababa | L | ababb | M | abbaa | N | abbab | O | abbba | P | abbbb | Q | baaaa | R | baab | S | baaba | T | baabb |
| U | babaa | V | babab | W | babba | X | babbb | Y | bbaaa | Z | bbaab |
第二种方法如下表
| 字母 | 加密后 | 字母 | 加密后 | 字母 | 加密后 | 字母 | 加密后 |
|---|---|---|---|---|---|---|---|
| a | AAAAA | g | AABBA | n | ABBAA | t | BAABA |
| b | AAAAB | h | AABBB | o | ABBAB | u-v | BAABB |
| c | AAABA | i-j | ABAAA | p | ABBBA | w | BABAA |
| d | AAABBA | k | ABAAB | q | ABBBB | x | BABAB |
| e | AABAA | l | ABABA | r | BAAAA | y | BABBA |
| f | AABAB | m | ABABB | s | BAAAB | z | BABBB |
加密解密python程序如下?,源自于网络,自己经过了一些修改。
import re
alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
first_cipher = ["aaaaa","aaaab","aaaba","aaabb","aabaa","aabab","aabba","aabbb","abaaa","abaab","ababa","ababb","abbaa","abbab","abbba","abbbb","baaaa","baaab","baaba","baabb","babaa","babab","babba","babbb","bbaaa","bbaab"]
second_cipher = ["aaaaa","aaaab","aaaba","aaabb","aabaa","aabab","aabba","aabbb","abaaa","abaaa","abaab","ababa","ababb","abbaa","abbab","abbba","abbbb","baaaa","baaab","baaba","baabb","baabb","babaa","babab","babba","babbb"]
def encode():
string = input("请输入字符来加密:\n")
e_string1 = ""
e_string2 = ""
for index in string:
for i in range(0,26):
if index == alphabet[i]:
e_string1 += first_cipher[i]
e_string2 += second_cipher[i]
break
print("第一种加密方式结果是:\n"+e_string1)
print("第二种加密方式结果是:\n"+e_string2)
return
def decode():
e_string = input("请输入字符来解密:\n")
e_array = re.findall(".{5}",e_string)
d_string1 = ""
d_string2 = ""
for index in e_array:
for i in range(0,26):
if index == first_cipher[i]:
d_string1 += alphabet[i]
if index == second_cipher[i]:
d_string2 += alphabet[i]
print("第一种解密结果是:\n"+d_string1)
print("第二种解密结果是:\n"+d_string2)
return
if __name__ == '__main__':
while True:
print("\t*******培根密码加密解密*******")
print("输入应该是小写密码只包含ab")
print("1.加密\n2.解密\n3.退出")
s_number = input("请输入数字来选择\n")
if s_number == "1":
encode()
input()
elif s_number == "2":
decode()
input()
elif s_number == "3":
exit()
else:
continue
RSA算法,应该算难的一种了,视频可以去看李永乐老师的?李永乐老师讲RSA,首先需要知道的东西如下?。
1.两个质数:p q(只有1和他本身两个约数的数叫做质数)
2.n=p*q
3.φ(n) = (p-1)(q-1) 欧拉函数
4.公钥e是一个1<e<φ(n)的整数,e和φ(n)必须要互质
私钥d 必须是(e*d)modφ(n)=1,假设φ(n)是20,那
e取值为3,d取值为7,就是(3*7)mod20=1,余数就
可以是1,那么私钥就可以是为7。
5.加密,假设M是明文,m的e的平方除以n余数就是c
6.解密,C为密文,同时私钥d,c的d次方除以n余数就是m
看懂如上即可看不懂怎么办,我也看不懂,如下的带数操作。
m=14 e=3 p=5 q=11 请写出RSA加密解密过程和结果
求n:p*q=5*11=55
求φ(n):φ(n)=(p-1)*(q-1)=(5-1)(11-1)=40
求d:已知求d公式为(e*d)modφ(n)=1,就是(3*d)mod40=1,算出d为27。
加密:已知公式为(m^e)modn=c套用(14^3)mod55=c,算出c为49
解密:已知公式为(c^d)modn=m套用(49^27)mod55=m,算出m为14
第二测试题如下?
p=43 q=59 e=13 m=134879475204 用RSA对m进行加密
加密公式为(m^e)modn=c,我们需要知道e和n即可算出c。
求n:n=p*q=43*59=2537
加密m:(134879475204^e)mod2537=1202
未完待续.....
有没有办法在Rails中为确认字段自定义消息?例如在设计中我必须输入密码和password_confirmation并且错误消息是:Passwordconfirmationdoesn'tmatchPassword我可以更改事件记录语言环境消息(“不匹配”),但它会在该语言环境消息的开头和结尾输出密码确认和密码,所以我得到如下内容:"PasswordconfirmationmustmatchPassword"有没有办法将其更改为不同的字符串?PasswordconfirmationandPasswordmustmatch.编辑另一件事是拥有完全自定义的消息,例如:'Setpassword
我正在尝试对某些帖子的评论使用简单的身份验证。用户使用即时ID和密码输入评论我使用“bcrypt”gem将密码存储在数据库中。在comments_controller.rb中像这样@comment=Comment.new(comment_params)bcrypted_pwd=BCrypt::Password.create(@comment.user_pwd)@comment.user_pwd=bcrypted_pwd当用户想要删除他们的评论时,我使用data-confirm-modalgem来确认数据在这部分,我必须解密用户输入的密码以与数据库中的加密密码进行比较我怎样才能解密密码,
我有一个允许更新用户记录的表单。它包含:password和:password_confirmation字段,但我不希望在数据库中已存储加密密码时对它们运行验证。View文件中的字段:'ConfirmPassword'%>在互联网上搜索时,我发现了这段代码,我认为它是针对以前版本的Ruby/Rails的。(我会把它放在我的用户模型中。)validates_presence_of:password,:on=>create由于我的用户模型中密码验证的语法不同(如下),我对我需要的语法感到困惑。validates:password,:presence=>true,:confirmation=>
我正在使用devise,当用户更改密码时,网站会将他们注销。我在网上读到,添加sign_in可以解决问题但不起作用,并且当密码更改时用户会注销。这是我的代码if@user.errors[:base].empty?and@user.update_attributes(params[:user])sign_in(current_user,:bypass=>true)flash[:success]="Useraccounthasbeensuccessfullyupdated"redirect_toedit_user_path(params[:site_id],@user)elserender
如果我构建了一个应用程序来访问来自Gmail、Twitter和Facebook的一些数据,并且我希望用户只需输入一次他们的身份验证信息,并且在几天或几周后重置,那会怎样是在Ruby中动态执行此操作的最佳方法吗?我看到很多人只是拥有他们客户/用户凭证的配置文件,如下所示:gmail_account:username:myClientpassword:myClientsPassword这看起来a)非常不安全,b)如果我想为成千上万的用户存储此类信息,它就无法工作。推荐的方法是什么?我希望能够在这些服务之上构建一个界面,因此每次用户进行交易时都必须输入凭据是不可行的。
关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭8年前。Improvethisquestion我需要实现具有各种灵活需求的密码安全。这些要求基本上取自Sanspasswordpolicy:Strongpasswordshavethefollowingcharacteristics:Containatleastthreeofthe
我一直在尝试使用Thor编写一个小型库,以帮助我快速创建新项目和站点。我写了这个小方法:defssh(cmd)Net::SSH.start(server_ip,user,:port=>port)do|session|session.execcmdendend只是协助我在需要时在远程服务器上运行快速命令。问题是当我需要在远程端的sudo下运行命令时,脚本似乎卡在我身上。例如当执行这个...ssh("sudocp#{file_from_path}#{file_to_path}")脚本会提示我输入密码[sudo]passwordforuser:但是在输入之后整个事情就挂起。有人会碰巧知道它为
我想使用nokogiri和mechanize自动化一个计时网络客户端。我需要通过代理服务器连接,但问题是,我不知道所述代理服务器的用户名和密码。我想获取存储在计算机上的此代理的缓存凭据..例如,在c#中你可以使用:stringproxyUri=proxy.GetProxy(requests.RequestUri).ToString();requests.UseDefaultCredentials=true;requests.Proxy=newWebProxy(proxyUri,false);requests.Proxy.Credentials=System.Net.Credential
我正在用RubyonRails重写Django应用程序,并希望为用户保留旧密码。Django使用PBKDF2SHA1作为加密机制。所以我有一个加密密码是这个pbkdf2_sha256$10000$YsnGfP4rZ1IZ$Tpf4922MoNEjuJQA9EG2Elptyt3dMAyzBPUgmunFOW4=原密码是2bulls在Ruby中,我使用PBKDF256gem和base64进行检查。Base64.encode64PBKDF256.dk("2bulls","YsnGfP4rZ1IZ",10000,32)我很期待Tpf4922MoNEjuJQA9EG2Elptyt3dMAyzBP
我正在尝试通过rvm安装ruby2.0.0-p247。但是,它要求输入密码。提供sudo密码正常吗?我没有在sudoers文件中配置sudo密码。我正在使用OracleEnterpriseLinux6x64。 最佳答案 sudo用于autolibs-这意味着RVM将安装所需的软件,如openssh或libyaml,这是标准ruby正常工作所必需的。您可以更改autolibs以查看所需的包而不是安装它们:rvmautolibsread-fail并恢复到安装要求的默认设置:rvmautolibsreset