JavaAES加密解密⼯具--GUI、在线传输⽂件
原理
对于任意长度的明⽂,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轮循环的状态矩阵中的内容就是加密后的密⽂。
步骤
主要⽤到的java类有:
类 Cipher
java.lang.Object
类 KeyGenerator
java.lang.Object
接⼝ SecretKey
所有超级接⼝:
Key, Serializable
所有已知⼦接⼝:
PBEKey
所有已知实现类:
KerberosKey, SecretKeySpec
加密步骤
1. 构造密钥⽣成器,指定为AES算法,不区分⼤⼩写
2. 根据ecnodeRules规则初始化密钥⽣成器
⽣成⼀个128位的随机源,根据传⼊的字节数组
3. 产⽣原始对称密钥
4. 获得原始对称密钥的字节数组
5. 根据字节数组⽣成AES密钥
6. 根据指定算法AES⾃成密码器
7. 初始化密码器,第⼀个参数为加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第⼆个参数为使⽤的KEY
8. 获取加密内容的字节数组(这⾥要设置为utf-8)不然内容中如果有中⽂和英⽂混合中⽂就会解密为乱码
9. 根据密码器的初始化⽅式--加密:将数据加密
10. 将加密后的数据转换为字符串
这⾥⽤Base64Encoder中会不到包
解决办法:
在项⽬的Build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就⼀切正常了。
11. 将字符串返回
效果演⽰及代码
效果图
代码AesJM.java
package AesMmx;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.SecureRandom;
pto.Cipher;
pto.KeyGenerator;
pto.SecretKey;
pto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class AesJM {
public static String MmxEncode(String theKey, String theText) {
try {
KeyGenerator k = Instance("AES");//密钥⽣成器
k.init(128, new Bytes()));//初始化128位⽣成器
SecretKey ori_key = k.generateKey();//产⽣密钥
byte[] sz = Encoded();//密钥转为⼆进制数组
SecretKey key = new SecretKeySpec(sz, "AES");//转为AES密钥
Cipher c = Instance("AES");//定义AES密码器
c.init(Cipher.ENCRYPT_MODE, key);//传⼊密码初始化密码器
byte[] content_b = Bytes("utf-8");//获取⽂本的utf-8⼆进制数组
byte[] miwen_b = c.doFinal(content_b);//加密
String miwen = new String(new BASE64Encoder().encode(miwen_b));//加密后的⼆进制转为String
return miwen;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String MmxDncode(String theKey, String theText) throws UnsupportedEncodingException, IOException {        try {
KeyGenerator k = Instance("AES");
k.init(128, new Bytes()));
SecretKey ori_key = k.generateKey();
byte[] sz = Encoded();
SecretKey key = new SecretKeySpec(sz, "AES");
Cipher c = Instance("AES");
c.init(Cipher.DECRYPT_MODE, key);
byte[] content_b = new BASE64Decoder().decodeBuffer(theText);
byte[] mingwen_b = c.doFinal(content_b);//解密
String mingwen = new String(mingwen_b, "utf-8");
return mingwen;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
Net.java
package AesMmx;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.ServerSocket;
import java.Socket;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Net {
/
/⽹络功能,实现互相传数据功能
private static int po = 6666;
//默认端⼝号
public static void setPo(int port) {    //设置端⼝号
po = port;
}
public static void ListenNet() throws IOException {    //监听端⼝功能,接受数据        while (true) {
ServerSocket serverSocket = new ServerSocket(po);  //创建服务器socket            Socket socket = serverSocket.accept();      //监听端⼝
InputStream is = InputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);        //输⼊流
String info = null;
Date time = new Date();
String theTime = "" + Time();  //获取时间戳
File file = new File(theTime + ".txt");
System.out.println(theTime + ".txt");      //收到的信息保存到⽂件
BufferedWriter bufw = new BufferedWriter(new FileWriter(file));
while ((info = br.readLine()) != null) {
bufw.write(info);
System.out.println("客户端消息" + info);
}
socket.shutdownInput();
bufw.close();
br.close();
isr.close();
is.close();
socket.close();
serverSocket.close();
java源代码加密
}
}
public static void send(String ip, int ipport, String str) throws IOException {
Socket socket = new Socket(ip, ipport);    //创建socket
OutputStream os = OutputStream();
PrintWriter pw = new PrintWriter(os);      //输出流
pw.write(str);      //将数据写出
pw.flush();
socket.shutdownOutput();
pw.close();
os.close();
socket.close();
}
public void run(int port) {
while (true) {
try {
ListenNet();        //⼀直监听
} catch (IOException ex) {

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。