Java AES 加密 解密 结果不一致

qyvlik 2016-12-18 03:41:33


import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class AES1 {

public static byte[] encryptAES(byte key[], byte data[]) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");

Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");

cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(new byte[16]));

return cipher.doFinal(data);
}


public static byte[] decryptAES(byte key[], byte msg[]) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");

Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");

cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(new byte[16]));

return cipher.doFinal(msg);
}


public static void main(String[] args) {
String key = "1234567890123456";
String text = "1234567890";
String encrypt = "";
String decrypt = "";


try {
encrypt = new String(encryptAES(key.getBytes("UTF-8"), text.getBytes("UTF-8")));
System.out.println("encrypt : " + byte2hex(encrypt.getBytes("UTF-8")));

decrypt = new String(decryptAES(key.getBytes("UTF-8"), encrypt.getBytes("UTF-8")));
System.out.println("decrypt : " + decrypt);

System.out.println("text.equals(decrypt): " + text.equals(decrypt));

} catch (Exception e) {
e.printStackTrace();
}
}

public static String byte2hex(byte[] b) {
String a = "";
for (int i = 0; i < b.length; i++) {
String hex = Integer.toHexString(b[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
a = a + hex;
}
return a;
}
}


代码如上,使用的是 AES 的 CTR 无填充加密算法,但是解密后所得串与原串不相等。
...全文
802 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianfang 2016-12-19
  • 打赏
  • 举报
回复
byte2hex, 需要和这个对应的反向操作方法
游一游走一走 2016-12-19
  • 打赏
  • 举报
回复

            encrypt = new String(encryptAES(key.getBytes("UTF-8"), text.getBytes("UTF-8"))); //问题出在此处,由于加密后的字节数组不一定满足UTF-8格式导致信息丢失
            System.out.println((text.equals(new String(decryptAES(key.getBytes("UTF-8"), encryptAES(key.getBytes("UTF-8"), text.getBytes("UTF-8"))), "UTF-8")))); //你写的加解密代码是正确的
qyvlik 2016-12-19
  • 打赏
  • 举报
回复
引用 4 楼 zyz1985 的回复:

            encrypt = new String(encryptAES(key.getBytes("UTF-8"), text.getBytes("UTF-8"))); //问题出在此处,由于加密后的字节数组不一定满足UTF-8格式导致信息丢失
            System.out.println((text.equals(new String(decryptAES(key.getBytes("UTF-8"), encryptAES(key.getBytes("UTF-8"), text.getBytes("UTF-8"))), "UTF-8")))); //你写的加解密代码是正确的
谢谢指点,我再去研究研究~
qyvlik 2016-12-19
  • 打赏
  • 举报
回复
引用 3 楼 fangmingshijie 的回复:
import java.security.Key;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.IvParameterSpec;

public class MainClass {
	public static void main(String[] args) throws Exception {

		SecureRandom random = new SecureRandom("1234567890123456".getBytes());
		byte[] ivBytes = new byte[16];
		IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
		KeyGenerator generator = KeyGenerator.getInstance("AES");
		generator.init(128, random);
		Key key = generator.generateKey();
		
		Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
		String input = "trefferwrsfsd";
		cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);

		byte[] cipherText = cipher.doFinal(input.getBytes());

		cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);

		byte[] plainText = cipher.doFinal(cipherText);

		System.out.println("plain : " + new String(plainText));
	}

}
我试的没问题。你参考下把
谢谢大兄弟,但是我的为何有问题呢?没想明白。。。。
  • 打赏
  • 举报
回复
import java.security.Key;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.IvParameterSpec;

public class MainClass {
	public static void main(String[] args) throws Exception {

		SecureRandom random = new SecureRandom("1234567890123456".getBytes());
		byte[] ivBytes = new byte[16];
		IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
		KeyGenerator generator = KeyGenerator.getInstance("AES");
		generator.init(128, random);
		Key key = generator.generateKey();
		
		Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
		String input = "trefferwrsfsd";
		cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);

		byte[] cipherText = cipher.doFinal(input.getBytes());

		cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);

		byte[] plainText = cipher.doFinal(cipherText);

		System.out.println("plain : " + new String(plainText));
	}

}
我试的没问题。你参考下把
qyvlik 2016-12-18
  • 打赏
  • 举报
回复
引用 1 楼 fangmingshijie 的回复:
解密的时候要16进制转为二进制吧
二进制?应该不用吧。。
  • 打赏
  • 举报
回复
解密的时候要16进制转为二进制吧
我将带领大家全面分析HLS(M3U8),包括直播、点播、多码流、AES加密、切片、等。您将亲自动手来操练,搭建环境、学习理论,分析总结:m3u8+Nginx+OpenSSL+FFmpeg具体包括包括如下:HLS直播协议详解FFmpeg+Nginx+VLC打造M3U8点播FFmpeg+Nginx+VLC打造M3U8直播FFmpeg:M3U8的多码流自适应Win10快速安装OpenSSL(不用编译源码)FFmpeg:M3U8的AES加密 -------------------------------------------------------------------音视频是一门很复杂的技术,涉及的概念、原理、理论非常多,很多初学者不学基础理论,而是直接做项目,往往会看到c/c++的代码时一头雾水,不知道代码到底是什么意思,这是为什么呢? 因为没有学习音视频的基础理论,就比如学习英语,不学习基本单词,而是天天听英语新闻,总也听不懂。所以呢,一定要认真学习基础理论,然后再学习播放器、转码器、非编、流媒体直播、视频监控、等等。 梅老师从事音视频与流媒体行业18年;曾在永新视博、中科大洋、百度、美国Harris广播事业部等公司就职,经验丰富;曾亲手主导广电直播全套项目,精通h.264/h.265/aac,曾亲自参与百度app上的网页播放器等实战产品。 目前全身心自主创业,主要聚焦音视频+流媒体行业,精通音视频加密、流媒体在线转码快编等热门产品。

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧