python实现下面这段java的aes加密,总是和java 的结果不一样
感觉原因是java 里对加密内容没要求,而python的pycryptodemo模块 加密内容要是16的倍数,不足要补足才行,不知道咋玩了,有没有同时懂java和python的 帮我看看
package com.ussd.util;
import java.security.Key;
import java.util.Arrays;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
public class AesEcbUtils {
// 算法名称
private final static String KEY_ALGORITHM = "AES";
// 字符集
final static String CHARSET_NAME = "UTF-8";
private static Key getKey(byte[] keyBytes) {
// 如果密钥不足 16 位,那么就补足
int base = 16;
if ((keyBytes.length % base) != 0) {
int groups = (keyBytes.length / base) + ((keyBytes.length % base) != 0 ? 1 : 0);
byte[] temp = new byte[groups * base];
Arrays.fill(temp, (byte) 0);
System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);
keyBytes = temp;
}
// 转化成 JAVA 的密钥格式
return new SecretKeySpec(keyBytes, KEY_ALGORITHM);
}
/*
* 加密方法
*
* @param content 要加密的字符串
* @param key 加密密钥
* @return
*/
public static String encrypt(String content, String key) throws Exception{
try {
byte[] enc = encrypt(content.getBytes(CHARSET_NAME), key.getBytes(CHARSET_NAME));
String base64Str = Base64.encodeBase64String(enc);
return new String(base64Str.getBytes(), CHARSET_NAME);
}
catch (Exception e) {
throw e;
}
}
/**
* 加密方法
*
* @param content 要加密的字符串
* @param keyBytes 加密密钥
* @return
* @throws Exception
*/
private static byte[] encrypt(byte[] content, byte[] keyBytes) throws Exception {
byte[] encryptedText = null;
try {
Key key = getKey(keyBytes);
Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, key);
encryptedText = cipher.doFinal(content);
}
catch (Exception e) {
throw e;
}
return encryptedText;
}
/**
* 解密方法
*
* @param encryptedData 要解密的字符串
* @param key 解密密钥
* @return
* @throws Exception
*/
public static String decrypt(String encryptedData, String key) throws Exception {
try {
byte[] enc = encryptedData.getBytes(CHARSET_NAME);
enc = Base64.decodeBase64(enc);
byte[] dec = decrypt(enc, key.getBytes(CHARSET_NAME));
return new String(dec, CHARSET_NAME);
}
catch (Exception e) {
throw e;
}
}
/**
* 解密方法
*
* @param encryptedData 要解密的字符串
* @param keyBytes 解密密钥
* @return
* @throws Exception
*/
private static byte[] decrypt(byte[] encryptedData, byte[] keyBytes) throws Exception {
byte[] encryptedText = null;
try {
Key key = getKey(keyBytes);
Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, key);
encryptedText = cipher.doFinal(encryptedData);
}
catch (Exception e) {
throw e;
}
return encryptedText;
}
public static void main(String[] args) throws Exception {
// 加解密 密钥
String key = "hg62159393"; // 此为密钥
String content = "aaaaaa";
// 加密字符串
System.out.println("加密前的内容:" + content);
System.out.println("加密密钥:" + key);
// 加密方法
String enc = AesEcbUtils.encrypt(content, key);
System.out.println("加密后的内容:" + enc);
// 解密方法
enc = AesEcbUtils.decrypt(enc, key);
System.out.println("解密后的内容:" + enc);
}
}
我看代码并不是要求加密内容必须是16的倍数,而是密钥长度吧。你用python写的话,保持和java一直的算法也不行吗(不足16补充一样的字节)
我的问题是java没有要求,python的那个加密方法要求加密内容也要16的倍数,这样与java不一样,
@MrG: 我看你贴的java代码了,不是java没要求,是java已经把补齐的操作封装起来了,而python没有,把决定权留给了调用者。
@MrG: 你是说不仅是密钥,加密对象也要是16的倍数?
@会长: 不行 第24行也是对加密内容做了手脚,java里没有这个步骤,不知道为啥python的aes总是要加密内容是16的倍数
@MrG: 那吧java代码改成和python一样的算法行吗
不行。。。我要让python和JAVA一样