从古至今,信息安全都是一个很重要的问题,为此人们开发了许多用于加密信息的算法,比如凯撒密码,维吉尼亚密码等。(了解更多:4种古典密码算法的设计与实现——C++)
我们知道,对于a,a^k^a=a,所以我们可以用异或运算来对文本进行加密。
import java.util.*;
public class Main {
public static void main(String[] args) {
String str = "世界上只有两样东西值得我们敬畏:一个是我们心中崇尚的道德准则,一个是我们头顶的星空。——康德";
System.out.println("源文本:"+str);
char key = 'k';//密钥
char strC[] = str.toCharArray();
for (int i=0; i<strC.length; i++) {//将strC[]的每个字符与密钥做异或运算,加密
strC[i] ^= key;
}
String strCode = new String(strC);
System.out.println("加密文本:"+strCode);
for (int i=0; i<strC.length; i++) {//将strC[]的每个字符再次与密钥做异或运算,解密
strC[i] ^= key;
}
String strUnCode = new String(strC);
System.out.println("解密文本:"+strUnCode);
}
}
输出:
源文本:世界上只有两样东西值得我们敬畏:一个是我们心中崇尚的道德准则,一个是我们头顶的星空。——康德
加密文本:乽甧乡厁杢乏桜乷褔偗忼扺亇攇甤?乫乁晄扺亇徨乆嵬山盯逸応冭割?乫乁晄扺亇奟頝盯晴稑ど??廜応
解密文本:世界上只有两样东西值得我们敬畏:一个是我们心中崇尚的道德准则,一个是我们头顶的星空。——康德
仅仅这样加密的话,我们的密钥就只能是一个字符,这怎么能行?所以我们对程序进行修改,让它能够处理多个字符的密钥。
import java.util.*;
public class Main {
public static void main(String[] args) {
String str = "世界上只有两样东西值得我们敬畏:一个是我们心中崇尚的道德准则,一个是我们头顶的星空。——康德";
System.out.println("源文本:"+str);
char key[] = {'b','l','u','e','c','y','a','n'};//密钥
int k = 0;
//将strC[]的字符序列按顺序以key.length个字符为一组(最后一组中的字符数可少于key.length),
//对每一组中的字符用密钥数组key的对应字符做异或运算,加密
char strC[] = str.toCharArray();
for (int i=0; i<strC.length; i++) {
strC[i] ^= key[k++%key.length];
}
String strCode = new String(strC);
System.out.println("加密文本:"+strCode);
//类似加密,只不过采用加密运算的逆运算,解密
k = 0;
for (int i=0; i<strC.length; i++) {
strC[i] ^= key[k++%key.length];
}
String strUnCode = new String(strC);
System.out.println("解密文本:"+strUnCode);
}
}
输出:
源文本:世界上只有两样东西值得我们敬畏:一个是我们心中崇尚的道德准则,一个是我们头顶的星空。——康德
加密文本:乴甠乿厏杪九桖乲褝偐忢扴亏攕甮?乢乆晚扴亏徺乌嵩屸盨逦忒冥剠?乮么晃扤争套頏盥晱稘の??廔忎
解密文本:世界上只有两样东西值得我们敬畏:一个是我们心中崇尚的道德准则,一个是我们头顶的星空。——康德
现在我们的程序可以使用多个字符的密钥了。那么如果我们想换个加密算法运算呢?这也很容易实现,比如我们可以把异或运算实现加解密换成用加法加密,用减法解密。
import java.util.*;
public class Main {
public static void main(String[] args) {
String str = "世界上只有两样东西值得我们敬畏:一个是我们心中崇尚的道德准则,一个是我们头顶的星空。——康德";
System.out.println("源文本:"+str);
char key[] = {'b','l','u','e','c','y','a','n'};//密钥
int k = 0;
//将strC[]的字符序列按顺序以key.length个字符为一组(最后一组中的字符数可少于key.length),
//对每一组中的字符用密钥数组key的对应字符做加法运算,加密
char strC[] = str.toCharArray();
for (int i=0; i<strC.length; i++) {
strC[i] += key[k++%key.length];
}
String strCode = new String(strC);
System.out.println("加密文本:"+strCode);
//类似加密,只不过采用加密运算的逆运算——减法,解密
k = 0;
for (int i=0; i<strC.length; i++) {
strC[i] -= key[k++%key.length];
}
String strUnCode = new String(strC);
System.out.println("解密文本:"+strUnCode);
}
}
输出:
源文本:世界上只有两样东西值得我们敬畏:一个是我们心中崇尚的道德准则,一个是我们头顶的星空。——康德
加密文本:乸疸乿呏杬亝梘亊觡储怌扶住日疰?乢亖暤扶住怼于嵵屼盰郈怜利劒?乮二暛抆佑妗飯盥暍竜の??弚怰
解密文本:世界上只有两样东西值得我们敬畏:一个是我们心中崇尚的道德准则,一个是我们头顶的星空。——康德
(更复杂的加解密算法:浅谈常见的七种加密算法及实现)