简单的文本加解密算法

从古至今,信息安全都是一个很重要的问题,为此人们开发了许多用于加密信息的算法,比如凯撒密码,维吉尼亚密码等。(了解更多: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);	
	}
}

输出:

源文本:世界上只有两样东西值得我们敬畏:一个是我们心中崇尚的道德准则,一个是我们头顶的星空。——康德
加密文本:乸疸乿呏杬亝梘亊觡储怌扶住日疰?乢亖暤扶住怼于嵵屼盰郈怜利劒?乮二暛抆佑妗飯盥暍竜の??弚怰
解密文本:世界上只有两样东西值得我们敬畏:一个是我们心中崇尚的道德准则,一个是我们头顶的星空。——康德

(更复杂的加解密算法:浅谈常见的七种加密算法及实现

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值