移位密碼雹姊,其基礎(chǔ)為數(shù)論中的模運算。其基本定義如下:
假設(shè)a 和 b 均為整數(shù),m 是正整數(shù)。若 m 整除 b-a 楼镐,則可將其表示為 a≡b(mod m)喷橙。讀為:"a與 b模 m 同余"啥么,正整數(shù) m稱為模數(shù);
密碼體制:
一個密碼體制必須滿足以下五元組(P,E,K,R贰逾,D):
- P表示所有可能的明文組成的有限集
- E表示所有可能的密文組成的有限集
- K代表密鑰空間悬荣,是所有可能的密鑰組成的有限集
- 對任意的k∈K,都存在一個加密法則Ek∈E和對應(yīng)的解密法則dk∈D。并且對每一個ek:P->E 和dk:E-> P疙剑,
對任意的明文x∈P,均有dk(Ek(x))=x.
對于移位密碼氯迂,其密碼體制為:
令P=E=X=Z26。對0<=K<=25,任意x,y∈Z26言缤,定義:
ek(x)=(x+K) mod 26
以及
dk(y)=(y-K) mod 26
Java 實現(xiàn)移位密碼
package Cryptography;
import java.util.HashMap;
import java.util.IllegalFormatException;
import java.util.Map;
public class ClassicalCryptography {
//private Map<Character,Integer> map=new HashMap<>(); // 字母映射為數(shù)字
private int K; // 密鑰K
public ClassicalCryptography(int K){
this.K=K;
}
public String EnCipher(String OrignalStr){ // 獲取密文
OrignalStr=OrignalStr.toLowerCase();
StringBuffer stringBuffer=new StringBuffer();
for (int i = 0; i <OrignalStr.length() ; i++) {
int c=OrignalStr.charAt(i)-'a';
if(c>25||c<0){ //跳過非小寫字母
stringBuffer.append(OrignalStr.charAt(i));
}
else {
stringBuffer.append((char)(('a'+EnK(K,c,26))));
}
}
return stringBuffer.toString();
}
public String DeCipher(String OrignalStr){ //獲取明文
OrignalStr=OrignalStr.toLowerCase();
StringBuffer stringBuffer=new StringBuffer();
for (int i = 0; i <OrignalStr.length() ; i++) {
int c=OrignalStr.charAt(i)-'a';
if(c>25||c<0){ //跳過非小寫字母
stringBuffer.append(OrignalStr.charAt(i));
}else {
stringBuffer.append((char)(('a'+DeK(K,c,26))));
}
}
return stringBuffer.toString();
}
private static int EnK(int K,int aim,int mod){ // 加密
int p=aim+K;
return p%mod;
}
private static int DeK(int K,int aim,int mod){ // 解密
int p=aim-K<0?aim-K+mod:aim-K;
return p%mod;
}
public static void main(String[] args) {
ClassicalCryptography c=new ClassicalCryptography(11);
String str="i am want to see you !";
System.out.println("原文為: "+str);
String ste=c.EnCipher(str);
System.out.println("密文為: "+ste);
System.out.println("解密后為: "+ c.DeCipher(ste));
}
}
RESULT
原文為: i am want to see you !
密文為: t lx hlye ez dpp jzf !
解密后為: i am want to see you !