凯撒密码的加密代换和解密代换分别为
c
=
E
k
(
m
)
=
m
+
3
(
m
o
d
26
)
c=E_{k}(m)=m + 3(mod 26)
c=Ek(m)=m+3(mod26)
0
<
=
m
<
=
25
0<= m <= 25
0<=m<=25
m
=
D
k
(
c
)
=
c
−
3
(
m
o
d
26
)
m=D_{k}(c)=c - 3(mod 26)
m=Dk(c)=c−3(mod26)
0
<
=
c
<
=
25
0<=c<=25
0<=c<=25
其中,3是加解密使用的密钥,即
k
=
3
k=3
k=3,加密时,每个字母向后移3位(循环移位,字母
x
x
x移到
a
a
a,
y
y
y移到
b
b
b,
z
z
z移到
c
c
c)。解密时,每个字母向前移3位(循环移位)
移位变换的加解密分别是
c
=
E
k
(
m
)
=
m
+
k
(
m
o
d
26
)
c=E_{k}(m)=m+k(mod 26)
c=Ek(m)=m+k(mod26)
0
<
=
m
,
k
<
=
25
0<=m,k<=25
0<=m,k<=25
m
=
D
k
(
c
)
=
c
−
k
(
m
o
d
26
)
m=D_{k}(c)=c - k(mod 26)
m=Dk(c)=c−k(mod26)
0
<
=
c
,
k
<
=
25
0<=c,k<=25
0<=c,k<=25
仿射变换的加解密分别是
c
=
E
a
,
b
(
m
)
=
a
m
+
b
(
m
o
d
26
)
c=E_{a,b}(m)=am+b(mod 26)
c=Ea,b(m)=am+b(mod26)
m
=
D
a
,
b
(
c
)
=
a
−
1
(
c
−
b
)
(
m
o
d
26
)
m=D_{a,b}(c)=a^{-1}(c-b)(mod 26)
m=Da,b(c)=a−1(c−b)(mod26)
其中,
a
,
b
a,b
a,b是密钥,为满足
0
<
=
a
,
b
<
=
25
0<=a,b<=25
0<=a,b<=25和
g
c
d
(
a
,
26
)
=
1
gcd(a,26)=1
gcd(a,26)=1的整数,其中
g
c
d
(
a
,
26
)
gcd(a,26)
gcd(a,26)表示
a
,
26
a,26
a,26的最大公因子,
g
c
d
(
a
,
26
)
=
1
gcd(a,26)=1
gcd(a,26)=1表示
a
a
a和
26
26
26是互素的,
a
−
1
a^{-1}
a−1表示
a
a
a的逆元,即
a
−
1
∗
a
=
1
m
o
d
26
a^{-1}*a=1mod 26
a−1∗a=1mod26
package com.cqu;
public class KaiSaEncryptionTest {
public static void main(String args[]) {
String input = "Hello World";
Integer key = 3;
String c1 = encryptionByKasStra(input);
System.out.println(c1);
String p1 = decryptByKasStra(c1);
System.out.println("解密后的明文为: " + p1);
}
/**
* 凯撒加密
*/
private static String encryptionByKasStra(String input) {
char[] inputArray = input.toCharArray();
StringBuilder cipherText = new StringBuilder();
for (char ia : inputArray) {
int b = ia;
b = (b + 3);
char newb = (char) b;
cipherText.append(newb);
}
return cipherText.toString();
}
/**
* 凯撒解密
*/
private static String decryptByKasStra(String cipherText) {
char[] cipherArray = cipherText.toCharArray();
StringBuilder plainText = new StringBuilder();
for (char ca : cipherArray) {
int m = ca;
m = m - 3;
char newm = (char) m;
plainText.append(newm);
}
return plainText.toString();
}
}