自己写的AES加密工具类的加密结果为什么与在线AES加密网站的加密结果不一致?

发布于 2021-11-16 00:51:24 字数 3510 浏览 916 评论 1

我写了一个AES加密工具类,对明文进行AES加密,相关参数如下:

加密算法:AES
明文:A
算法模式:CBC
密钥长度:256
密钥:1qaz@WSX1qaz@WSX
密钥偏移量:1234567890123456
补码方式:PKCS7Padding
加密结果编码方式:base64

我的加密结果是:WP58v5NfB+3Eo72KBAabGw==
网站上的加密结果是:5CqrZd+/SANPAEF3+Y9XfFKcsC99XywOmJUlRVehFb8=
不知2个结果哪个正确?如果是我的结果不正确,请问问题出在哪?

在线AES加密网站地址:http://www.seacha.com/tools/aes.php?src=A&mode=CBC&keylen=256&key=1qaz%40WSX1qaz%40WSX&iv=1234567890123456&bpkcs=pkcs7padding&encoding=base64&type=0

附AES加密工具类代码:

package com.demo.aes.util;

import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.Security;

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

import org.apache.commons.codec.DecoderException;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class AESUtils {
	private static final String PWD = "1qaz@WSX1qaz@WSX";
	private static final String IV = "1234567890123456";

	public static SecretKeySpec makeKey() throws NoSuchAlgorithmException,
			UnsupportedEncodingException, DecoderException {
		Security.addProvider(new BouncyCastleProvider());
		KeyGenerator kgen = KeyGenerator.getInstance("AES");
		kgen.init(256, new SecureRandom(PWD.getBytes("UTF-8")));
		SecretKey key = kgen.generateKey();
		SecretKeySpec keySpec = new SecretKeySpec(key.getEncoded(), "AES");

		// SecretKeySpec keySpec = new SecretKeySpec(PWD.getBytes("UTF-8"),
		// "AES");
		return keySpec;
	}

	public static IvParameterSpec makeIv() throws UnsupportedEncodingException,
			DecoderException {
		return new IvParameterSpec(IV.getBytes("UTF-8"));
	}

	/**
	 * 加密
	 * 
	 * @param content
	 *            需要加密的内容
	 * @param password
	 *            加密密码
	 * @return
	 */
	public static byte[] encrypt(String content) {
		try {
			Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
			cipher.init(Cipher.ENCRYPT_MODE, makeKey(), makeIv());
			return cipher.doFinal(content.getBytes("utf-8"));
		} catch (Exception e) {
			e.printStackTrace();
		}

		return null;
	}

	/**
	 * 解密
	 * 
	 * @param content
	 *            待解密内容
	 * @param password
	 *            解密密钥
	 * @return
	 */
	public static byte[] decrypt(byte[] content, String password) {

		try {
			Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
			cipher.init(Cipher.DECRYPT_MODE, makeKey(), makeIv());
			return cipher.doFinal(content);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	public static void main(String[] args) throws UnsupportedEncodingException {
		String content = "A";
		System.out.println("TLV加密前:" + content);
		byte[] encryptResult = encrypt(content);
		System.out.println("Base64加密后:" + BASE64Utils.encode(encryptResult));
	}

 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

谁的新欢旧爱 2021-11-18 18:07:44

密码才16字节,32位才能创建AES 256。

加密内容也才1字节,最好也先自己补成32字节的再试。

两个都不对。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文