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

摩卡王伟 发布于 2013/06/24 16:49
阅读 3K+
收藏 0

我写了一个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));
	}

 

加载中
0
无名飞非

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

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


两个都不对。


返回顶部
顶部