「java异或加密」java加密运算

博主:adminadmin 2023-03-18 06:45:05 614

今天给各位分享java异或加密的知识,其中也会对java加密运算进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

android,java 通用的加密解密方式有几种

移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道。为了让数据交互更安全,我们需要对数据进行加密传输。今天研究了一下,把几种语言的加密都实践了一遍,实现了.NET,java(android),iOS都同一套的加密算法,下面就分享给大家。

AES加密有多种算法模式,下面提供两套模式的可用源码。

加密方式:

先将文本AES加密

返回Base64转码

解密方式:

将数据进行Base64解码

进行AES解密

一、CBC(Cipher Block Chaining,加密块链)模式

是一种循环模式,前一个分组的密文和当前分组的明文异或操作后再加密,这样做的目的是增强破解难度.

密钥

密钥偏移量

java/adroid加密AESOperator类:

package com.bci.wx.base.util;

import javax.crypto.Cipher;

import javax.crypto.spec.IvParameterSpec;

import javax.crypto.spec.SecretKeySpec;

import sun.misc.BASE64Decoder;

import sun.misc.BASE64Encoder;

/**

* AES 是一种可逆加密算法,对用户的敏感信息加密处理 对原始数据进行AES加密后,在进行Base64编码转化;

*/

public class AESOperator {

/*

* 加密用的Key 可以用26个字母和数字组成 此处使用AES-128-CBC加密模式,key需要为16位。

*/

private String sKey = "smkldospdosldaaa";//key,可自行修改

private String ivParameter = "0392039203920300";//偏移量,可自行修改

private static AESOperator instance = null;

private AESOperator() {

}

public static AESOperator getInstance() {

if (instance == null)

instance = new AESOperator();

return instance;

}

public static String Encrypt(String encData ,String secretKey,String vector) throws Exception {

if(secretKey == null) {

return null;

}

if(secretKey.length() != 16) {

return null;

}

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

byte[] raw = secretKey.getBytes();

SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

IvParameterSpec iv = new IvParameterSpec(vector.getBytes());// 使用CBC模式,需要一个向量iv,可增加加密算法的强度

cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);

byte[] encrypted = cipher.doFinal(encData.getBytes("utf-8"));

return new BASE64Encoder().encode(encrypted);// 此处使用BASE64做转码。

}

// 加密

public String encrypt(String sSrc) throws Exception {

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

byte[] raw = sKey.getBytes();

SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());// 使用CBC模式,需要一个向量iv,可增加加密算法的强度

cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);

byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));

return new BASE64Encoder().encode(encrypted);// 此处使用BASE64做转码。

}

// 解密

public String decrypt(String sSrc) throws Exception {

try {

byte[] raw = sKey.getBytes("ASCII");

SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());

cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);

byte[] encrypted1 = new BASE64Decoder().decodeBuffer(sSrc);// 先用base64解密

byte[] original = cipher.doFinal(encrypted1);

String originalString = new String(original, "utf-8");

return originalString;

} catch (Exception ex) {

return null;

}

}

public String decrypt(String sSrc,String key,String ivs) throws Exception {

try {

byte[] raw = key.getBytes("ASCII");

SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

IvParameterSpec iv = new IvParameterSpec(ivs.getBytes());

cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);

byte[] encrypted1 = new BASE64Decoder().decodeBuffer(sSrc);// 先用base64解密

byte[] original = cipher.doFinal(encrypted1);

String originalString = new String(original, "utf-8");

return originalString;

} catch (Exception ex) {

return null;

}

}

public static String encodeBytes(byte[] bytes) {

StringBuffer strBuf = new StringBuffer();

for (int i = 0; i bytes.length; i++) {

strBuf.append((char) (((bytes[i] 4) 0xF) + ((int) 'a')));

strBuf.append((char) (((bytes[i]) 0xF) + ((int) 'a')));

}

return strBuf.toString();

}

如何利用异或运算进行简单加密解密

利用“^”异或运算对字符串进行加密

思路:1.先创建字符串输入的Scanner;

2.通过char[] array = password.toCharArray();// 获取字符数组;

3.遍历字符数组,按目前理解要用到遍历:数组所有元素进行访问,比如你要输出数组里所有的信息时,就要用到

4.进行异或运算

按位做“异或”运算是:位值相同得1,不同得0

例如:

加密过程:

原解释的二进制为 1 1 0 0 ----原文

设定的key的二进制为 0 1 1 0 ----密匙

两者做“异或”结果为 0 1 0 1 ----密文

解密过程:

0 1 0 1----密文

0 1 1 0----密匙

两者“异或”就得到了原文 1 1 0 0 ----原文

详细代码:

package com.lixiyu;

import java.util.Scanner;

public class Example {

public static void main(String[] args){

Scanner sca=new Scanner(System.in);

System.out.println("请输入一个英文字符串或解密字符串");

String line=sca.nextLine();//获取用户输入信息

char[] array=line.toCharArray();//获取字符数组

for (int i=0;iarray.length;i++){//历遍字符数组

array[i]=(char) (array[i]^20000);//对数组每个元素进行异或运算

}

System.out.println("加密解密结果如下:");

System.out.println(new String(array));//输出密钥

}

}

异或运算:

1 ^ 1 = 0

1 ^ 0 = 1

0 ^ 1 = 1

0 ^ 0 = 0

字符'A' 的ASCII编码为65 : 00000000 01000001

取整数7 : 00000000 00000000 00000000 00000111

XOR运算后 : 00000000 00000000 00000000 01000110

简单加密算法代码如下 :

public class Test {

public static final int KEY = 7;

public static void main(String[] args) {

String str = "Hello World!";

StringBuffer str2 = new StringBuffer(); //存储加密后的字符串

StringBuffer str3 = new StringBuffer(); //存储解密后的字符串

//加密过程

for(int i=0;istr.length();i++)

{

char c = (char)(str.charAt(i) ^ KEY);

str2.append(c);

}

//解密过程

for(int i=0;istr2.length();i++)

{

char c = (char)(str2.charAt(i) ^ KEY);

str3.append(c);

}

System.out.println("原始 的字符串为:" + str);

System.out.println("加密后 的字符串为:" + str2);

System.out.println("解密后 的字符串为:" + str3);

}

}

输出:

原始 的字符串为:Hello World!

加密后 的字符串为:Obkkh'Phukc

解密后 的字符串为:Hello World!

如何使用java对密码加密 加密方式aes

Java有相关的实现类:具体原理如下

对于任意长度的明文,AES首先对其进行分组,每组的长度为128位。分组之后将分别对每个128位的明文分组进行加密。

对于每个128位长度的明文分组的加密过程如下:

(1)将128位AES明文分组放入状态矩阵中。

(2)AddRoundKey变换:对状态矩阵进行AddRoundKey变换,与膨胀后的密钥进行异或操作(密钥膨胀将在实验原理七中详细讨论)。

(3)10轮循环:AES对状态矩阵进行了10轮类似的子加密过程。前9轮子加密过程中,每一轮子加密过程包括4种不同的变换,而最后一轮只有3种变换,前9轮的子加密步骤如下:

● SubBytes变换:SubBytes变换是一个对状态矩阵非线性的变换;

● ShiftRows变换:ShiftRows变换对状态矩阵的行进行循环移位;

● MixColumns变换:MixColumns变换对状态矩阵的列进行变换;

● AddRoundKey变换:AddRoundKey变换对状态矩阵和膨胀后的密钥进行异或操作。

最后一轮的子加密步骤如下:

● SubBytes变换:SubBytes变换是一个对状态矩阵非线性的变换;

● ShiftRows变换:ShiftRows变换对状态矩阵的行进行循环移位;

● AddRoundKey变换:AddRoundKey变换对状态矩阵和膨胀后的密钥进行异或操作;

(4)经过10轮循环的状态矩阵中的内容就是加密后的密文。

AES的加密算法的伪代码如下。

在AES算法中,AddRoundKey变换需要使用膨胀后的密钥,原始的128位密钥经过膨胀会产生44个字(每个字为32位)的膨胀后的密钥,这44个字的膨胀后的密钥供11次AddRoundKey变换使用,一次AddRoundKey使用4个字(128位)的膨胀后的密钥。

三.AES的分组过程

对于任意长度的明文,AES首先对其进行分组,分组的方法与DES相同,即对长度不足的明文分组后面补充0即可,只是每一组的长度为128位。

AES的密钥长度有128比特,192比特和256比特三种标准,其他长度的密钥并没有列入到AES联邦标准中,在下面的介绍中,我们将以128位密钥为例。

四.状态矩阵

状态矩阵是一个4行、4列的字节矩阵,所谓字节矩阵就是指矩阵中的每个元素都是一个1字节长度的数据。我们将状态矩阵记为State,State中的元素记为Sij,表示状态矩阵中第i行第j列的元素。128比特的明文分组按字节分成16块,第一块记为“块0”,第二块记为“块1”,依此类推,最后一块记为“块15”,然后将这16块明文数据放入到状态矩阵中,将这16块明文数据放入到状态矩阵中的方法如图2-2-1所示。

块0

块4

块8

块12

块1

块5

块9

块13

块2

块6

块10

块14

块3

块7

块11

块15

图2-2-1 将明文块放入状态矩阵中

五.AddRoundKey变换

状态矩阵生成以后,首先要进行AddRoundKey变换,AddRoundKey变换将状态矩阵与膨胀后的密钥进行按位异或运算,如下所示。

其中,c表示列数,数组W为膨胀后的密钥,round为加密轮数,Nb为状态矩阵的列数。

它的过程如图2-2-2所示。

图2-2-2 AES算法AddRoundKey变换

六.10轮循环

经过AddRoundKey的状态矩阵要继续进行10轮类似的子加密过程。前9轮子加密过程中,每一轮要经过4种不同的变换,即SubBytes变换、ShiftRows变换、MixColumns变换和AddRoundKey变换,而最后一轮只有3种变换,即SubBytes变换、ShiftRows变换和AddRoundKey变换。AddRoundKey变换已经讨论过,下面分别讨论余下的三种变换。

1.SubBytes变换

SubBytes是一个独立作用于状态字节的非线性变换,它由以下两个步骤组成:

(1)在GF(28)域,求乘法的逆运算,即对于α∈GF(28)求β∈GF(28),使αβ =βα = 1mod(x8 + x4 + x3 + x + 1)。

(2)在GF(28)域做变换,变换使用矩阵乘法,如下所示:

由于所有的运算都在GF(28)域上进行,所以最后的结果都在GF(28)上。若g∈GF(28)是GF(28)的本原元素,则对于α∈GF(28),α≠0,则存在

β ∈ GF(28),使得:

β = gαmod(x8 + x4 + x3 + x + 1)

由于g255 = 1mod(x8 + x4 + x3 + x + 1)

所以g255-α = β-1mod(x8 + x4 + x3 + x + 1)

根据SubBytes变换算法,可以得出SubBytes的置换表,如表2-2-1所示,这个表也叫做AES的S盒。该表的使用方法如下:状态矩阵中每个元素都要经过该表替换,每个元素为8比特,前4比特决定了行号,后4比特决定了列号,例如求SubBytes(0C)查表的0行C列得FE。

表2-2-1 AES的SubBytes置换表

它的变换过程如图2-2-3所示。

图2-2-3 SubBytes变换

AES加密过程需要用到一些数学基础,其中包括GF(2)域上的多项式、GF(28)域上的多项式的计算和矩阵乘法运算等,有兴趣的同学请参考相关的数学书籍。

2.ShiftRows变换

ShiftRows变换比较简单,状态矩阵的第1行不发生改变,第2行循环左移1字节,第3行循环左移2字节,第4行循环左移3字节。ShiftRows变换的过程如图2-2-4所示。

图2-2-4 AES的ShiftRows变换

3.MixColumns变换

在MixColumns变换中,状态矩阵的列看作是域GF(28)的多项式,模(x4+1)乘以c(x)的结果:

c(x)=(03)x3+(01)x2+(01)x+(02)

这里(03)为十六进制表示,依此类推。c(x)与x4+1互质,故存在逆:

d(x)=(0B)x3+(0D)x2+(0G)x+(0E)使c(x)•d(x) = (D1)mod(x4+1)。

设有:

它的过程如图2-2-5所示。

图2-2-5 AES算法MixColumns变换

七.密钥膨胀

在AES算法中,AddRoundKey变换需要使用膨胀后的密钥,膨胀后的密钥记为子密钥,原始的128位密钥经过膨胀会产生44个字(每个字为32位)的子密钥,这44个字的子密钥供11次AddRoundKey变换使用,一次AddRoundKey使用4个字(128位)的膨胀后的密钥。

密钥膨胀算法是以字为基础的(一个字由4个字节组成,即32比特)。128比特的原始密钥经过膨胀后将产生44个字的子密钥,我们将这44个密钥保存在一个字数组中,记为W[44]。128比特的原始密钥分成16份,存放在一个字节的数组:Key[0],Key[1]……Key[15]中。

在密钥膨胀算法中,Rcon是一个10个字的数组,在数组中保存着算法定义的常数,分别为:

Rcon[0] = 0x01000000

Rcon[1] = 0x02000000

Rcon[2] = 0x04000000

Rcon[3] = 0x08000000

Rcon[4] = 0x10000000

Rcon[5] = 0x20000000

Rcon[6] = 0x40000000

Rcon[7] = 0x80000000

Rcon[8] = 0x1b000000

Rcon[9] = 0x36000000

另外,在密钥膨胀中包括其他两个操作RotWord和SubWord,下面对这两个操作做说明:

RotWord( B0,B1,B2,B3 )对4个字节B0,B1,B2,B3进行循环移位,即

RotWord( B0,B1,B2,B3 ) = ( B1,B2,B3,B0 )

SubWord( B0,B1,B2,B3 )对4个字节B0,B1,B2,B3使用AES的S盒,即

SubWord( B0,B1,B2,B3 ) = ( B’0,B’1,B’2,B’3 )

其中,B’i = SubBytes(Bi),i = 0,1,2,3。

密钥膨胀的算法如下:

八.解密过程

AES的加密和解密过程并不相同,首先密文按128位分组,分组方法和加密时的分组方法相同,然后进行轮变换。

AES的解密过程可以看成是加密过程的逆过程,它也由10轮循环组成,每一轮循环包括四个变换分别为InvShiftRows变换、InvSubBytes变换、InvMixColumns变换和AddRoundKey变换;

这个过程可以描述为如下代码片段所示:

九.InvShiftRows变换

InvShiftRows变换是ShiftRows变换的逆过程,十分简单,指定InvShiftRows的变换如下。

Sr,(c+shift(r,Nb))modNb= Sr,c for 0 r 4 and 0 ≤ c Nb

图2-2-6演示了这个过程。

图2-2-6 AES算法InvShiftRows变换

十.InvSubBytes变换

InvSubBytes变换是SubBytes变换的逆变换,利用AES的S盒的逆作字节置换,表2-2-2为InvSubBytes变换的置换表。

表2-2-2 InvSubBytes置换表

十一.InvMixColumns变换

InvMixColumns变换与MixColumns变换类似,每列乘以d(x)

d(x) = (OB)x3 + (0D)x2 + (0G)x + (0E)

下列等式成立:

( (03)x3 + (01)x2 + (01)x + (02) )⊙d(x) = (01)

上面的内容可以描述为以下的矩阵乘法:

十二.AddRoundKey变换

AES解密过程的AddRoundKey变换与加密过程中的AddRoundKey变换一样,都是按位与子密钥做异或操作。解密过程的密钥膨胀算法也与加密的密钥膨胀算法相同。最后状态矩阵中的数据就是明文。

java异或加密的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java加密运算、java异或加密的信息别忘了在本站进行查找喔。