凯撒密码是一种非常古老的加密方法,相传当年凯撒大地行军打仗时为了保证自己的命令不被敌军知道,就使用这种特殊的方法进行通信,以确保信息传递的安全。他的原理很简单,说到底就是字母于字母之间的替换。下面让我们看一个简单的例子:“baidu”用凯撒密码法加密后字符串变为“edlgx”,它的原理是什么呢?把“baidu”中的每一个字母按字母表顺序向后移3位,所得的结果就是刚才我们所看到的密文。
#include stdio.h
main()
{
char M[100];
char C[100];
int K=3,i;
printf("请输入明文M(注意不要输入空白串)\n");
gets(M);
for(i=0;M[i]!='\0';i++)
C[i]=(M[i]-'a'+K)%26+'a';
C[i]='\0';
printf("结果是:\n%s\n",C);
}
凯撒密码是罗马扩张时期朱利斯• 凯撒(Julius Caesar)创造的,用于加密通过信使传递的作战命令。它将字母表中的字母移动一定位置而实现加密。例如如果向右移动 2 位,则 字母 A 将变为 C,字母 B 将变为 D,…,字母 X 变成 Z,字母 Y 则变为 A,字母 Z 变为 B。
因此,假如有个明文字符串“Hello”用这种方法加密的话,将变为密文: “Jgnnq” 。而如果要解密,则只要将字母向相反方向移动同样位数即可。如密文“Jgnnq”每个字母左移两位 变为“Hello” 。这里,移动的位数“2”是加密和解密所用的密钥。
该程序既可用于加密又可用于解密。只要传入明文和偏移量即可加密,解密需要传入密文和负的偏移量就可以解密。
输出的结果:
凯撒密码由于加解密比较简单,密钥总共只有 26 个,攻击者得到密文后即使不知道密钥,也可一个一个地试过去,最多试 26 次就可以得到明文。
这里不光根据 offset 偏移进行加密,还加上了字符所在的下标进行混合加密。
输出的结果:
这个很简单嘛,用ASC 和 CHR 转换一下嘛
打开Vb,添加2个label控件,2个text控件 1个command按钮
代码如下:
Private Function f(ByVal a As String, k As Integer, n As Integer) As String
If ((Asc(a) = 65 And Asc(a) = 97) Or (Asc(a) = 97 And Asc(a) = 122)) And Len(a) = 1 Then '判断是否为一个字母
'利用公式计算
If Asc(a) = 65 And Asc(a) = 97 Then f = Chr((Asc(a) - 64 + k) Mod n + 64) '当为大写的时候
If Asc(a) = 97 And Asc(a) = 122 Then f = Chr((Asc(a) - 96 + k) Mod n + 96) '当为小写的时候
Else
f = "error" '若不满足要求,则返回错误
End If
End Function
Private Sub Command1_Click()
Dim strold As String
Dim strnew As String
Dim k As Integer
Dim n As Integer
Dim i As Long
Dim tmp As String
k = 3
n = 26
strold = Text1.Text '要加密的字符串
For i = 1 To Len(strold)
tmp = Mid(strold, i, 1)
tmp = f(tmp, k, n)
If tmp "error" Then
strnew = strnew + tmp
Else
MsgBox "字符串中含有非法字符"
Exit Sub
End If
Next i
Text2.Text = strnew
End Sub
Private Sub Form_Load()
Text1.Text = "PROGRAM"
Text2.Text = ""
Command1.Caption = "加密"
Label1.Caption = "源字符串:"
Label2.Caption = "加密字符串:"
End Sub
凯撒密码是对字母表整体进行偏移的一种变换加密。因此,建立一个字母表,对明文中每个字母,在这个字母表中偏移固定的长度即可得到对应的密文字母。
最基本的实现如下:
def caesarcipher(s: str,rot: int=3) -str:
_ = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
encode = ''
i = 0
for c in s:
try:
encode += _[(_.index(c.upper()) + rot) % len(_)]
except (Exception,) as e:
encode += c
return encode
print(caesarcipher('hellow'))
print(caesarcipher('KHOORZ', -3))
如果要求解密后保持大小写,那么,字母表_还需要包含所有小写字母并且index时不对c做upper处理.
同样的,也可以在字母表中追加数字,各种符号,空格等.