异或运算实现加密解密

异或运算中,如果某个字符(或数值)x 与 一个数值m 进行异或运算得到y,则再用y 与 m 进行异或运算就可以还原为 x ,因此应用这个原理可以实现数据的加密解密功能。

异或运算在java中通常有两个比较常用的方法,一个是两个变量的互换(不借助第三个变量),一个便是数据的简单加密解密。

两个变量的互换

java运算中,如果要交换两变量的值,通常的做法就是借助第三个临时变量,然后完成操作。

public static void main(String[] args) {
	int[] arr = {1, 6, 4, 2, 3, 8, 9, 10};
	for (int i=0; i<arr.length/2; i++) {
		swapNumber(arr, i, arr.length-1-i);
	}

	System.out.println(Arrays.toString(arr));
}

public static int[] swapNumber(int[] arr, int x, int y) {
	int temp = arr[x];
	arr[x] = arr[y];
	arr[y] = temp;
	return arr;
}

上面示例完成了数组的倒序操作,其中数组中两位置的数据交换是通过swapNumber 方法来完成的。

swapNumber 方法中借助了临时变量temp,先将arr[x] 的值赋给临时变量temp;再将arr[y]赋给arr[x],最后再将temp赋给arr[y]。

如果要求中不让使用临时变量temp,还要完成x 和 y 位置的数据交换,该如何处理呢?异或操作该派上用场了。

现在我们把上面的程序修改为异或运算来交换x 和 y 位置的变量值。

public static int[] swapNumber(int[] arr, int x, int y) {
	arr[x] = arr[x] ^ arr[y];
	arr[y] = arr[y] ^ arr[x];
	arr[x] = arr[x] ^ arr[y];
	return arr;
}

加密解密

public static void main(String[] args) {
        // 密码文明
        String str = "hello world";
        
        // 数据的加密过程
        System.out.println((decode(str)));
        
        // 对加密密文再加密即可实现解密
        System.out.println(decode(decode(str)));
}
    
public static String decode(String str) {
        char[] array = str.toCharArray();
        for (int i=0; i<array.length; i++) {
            array[i] = (char)(array[i] ^ 20000);
        }
        
        return new String(array);
}

加密方法的加密操作是对字符串中的每个字符进行异或运算,然后将异或运算后的字符串返回,得到密文。

根据 "字符(或数值)x 与 一个数值m 进行异或运算得到y,则再用y 与 m 进行异或运算就可以还原为 x" 原理,对密码中的每个字符进行再次异或运算,便可再次得到之前的明文信息,及达到解密的效果。

示例中,(decode(str)) 方法实现了加密过程,加密后的密文再加密即可实现解密,即 decode(decode(str))。

时间: 2024-10-12 14:06:12

异或运算实现加密解密的相关文章

异或运算实现加密与解密字符串

1 package com.yzy.test; 2 3 import java.util.Scanner; 4 5 public class Xor { 6 7 /** 8 * @param args 9 */ 10 public static void main(String[] args) { 11 // TODO Auto-generated method stub 12 System.out.println("请输入要加密的字符串:"); 13 Scanner scanner

Qt使用异或进行加密解密

在加密,解密中,异或运算应该时比较简单的一种.下面的代码,采用异或运算进行加密,解密: 点击(此处)折叠或打开 #include <QtCore/QCoreApplication> #include <QTextCodec> #include <QString> #include <QDebug> QString getXorEncryptDecrypt(const QString &, const char &); QString byte

Cocos2d-x 资源加密解密总结

本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee 本文针对的是cocos2d-x 3.4 版本进行研究. 做加密解密的思路 加密解密算法的简单介绍 首先,加密解密应该是一个单独的话题,一般不会涉及具体使用的引擎.框架和技术. 加密算法有Base64,DES等. Base64的原理类似于凯撒密码,啥是凯撒密码呢,就是一个字符用另一个字符来代替. 比如:a用i代替,b用k代替,以此类推.加密和解密的过程就是一个互相映射的过程. DES是

java加密解密算法位运算

一.实例说明 本实例通过位运算的异或运算符 “ ^ ” 把字符串与一个指定的值进行异或运算,从而改变每个字符串中字符的值,这样就可以得到一个加密后的字符串.当把加密后的字符串作为程序输入内容,异或运算会把加密后的字符串还原为原有字符串的值.效果图如下: 二.实现过程 1 package com.itxxz; 2 3 import java.util.Scanner; 4 5 /** 6 * java加密解密算法 7 * 8 * @author 螃蟹 9 * 网站:IT学习者 10 * 网址:ht

使用异或运算对数据及文件进行加密处理,附软件及源码

前几天写了一篇文章是在C语言中使用异或运算交换两个任意类型变量,其基础为使用^交换两个整数的算法: a ^= b; b ^= a; a ^= b; 如果你看明白这个算法,就会发现这样的规律:一个数异或另一个数两次后,该数保持不变.即: c = a^b; c = c^b; c == a; 这一规律就是使用异或运算对数据及文件进行加密处理的基本原理. 那就先贴下加密算法的代码: bool XorEncrypt(void* bufPtr, unsigned int bufSize, const cha

C#加密解密(DES,AES,Base64,md5,SHA256,RSA,RC4)

一:异或^简单加解密(数字类型) 1:原理: 异或用于比较两个二进制数的相应位,在执行按位"异或"运算时,如果两个二进制数的相应位都为1或者都为0,则返回0;如果两个二进制数的相应位其中一个为1另一个为0,则返回1. //对数字加密 int P_int_Num, P_int_Key;//定义两个值类型变量 string Encryptstr = (P_int_Num ^ P_int_Key).ToString();//加密数值 //对数字解密 int P_int_Key, P_int_

php加密解密函数

转自:http://www.jb51.net/article/51706.htm 很多项目的会员系统,都要求要有记住登录功能,在通过cookies实现功能是,由于要将客户信息直接保存到cookies,如果直接写入cookies势必会带来安全隐患,因此通过可逆加密后再保存到cookies相对就安全了 项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理.最常见的应用在用户登录以及一些API

2个比较经典的PHP加密解密函数分享

项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理. 最常见的应用在用户登录以及一些API数据交换的场景. 笔者收录了一些比较经典的PHP加密解密函数代码,分享给大家.加密解密原理一般都是通过一定的加密解密算法,将密钥加入到算法中,最终得到加密解密结果. 1.非常给力的authcode加密函数,Discuz!经典代码(带详解): function authcode($string, $

使用异或运算实现中两个变量互换的方法

按位异或运算可以在不引入临时变量的情况下实现两个变量值得互换. int main() {     int a = 10;     int b = 12;     cout<<"a="<<a<<";"<<"b="<<b<<endl;     a = a^b;                                            //异或运算     b = a^