JAVA的AES加密怎么转成delphi的,delphi的AES加解密与java的不同

huangpan_123 2016-05-12 11:32:57
package com.sjq.common.utils;

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

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

/**
* AES加密,解密类:用于用户密码加密解密
* @author lupb
*/
public class AESPassword {

public static String key="123321";

public static void main(String[] args) throws UnsupportedEncodingException {
String password = "123456";

String aesPassword = AESPassword.encrypt(password, key);
System.out.println("通过AES加密:" + aesPassword);

password = AESPassword.decrypt(aesPassword, key);
System.out.println("AES解密:" + password);

}

/**
* 加密
* @param content 需要加密的内容
* @param password 加密密码
* @return aes加密串
*/
public static String encrypt(String content, String password) {
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(password.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");// 创建密码器
byte[] byteContent = content.getBytes("utf-8");
cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
byte[] result = cipher.doFinal(byteContent);
return parseByte2HexStr(result);//.toString(); // 加密
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
}


/**
* 解密
* @param content 需要解密的内容
* @param password 解密密码
* @return 解密后的字符串
*/
public static String decrypt(String content, String password) {
try {
byte[] contents=parseHexStr2Byte(content);//.getBytes();
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(password.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");// 创建密码器
cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
byte[] result = cipher.doFinal(contents);
// return parseByte2HexStr(result);//.toString(); // 加密
return new String(result);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
}

public static String parseByte2HexStr(byte buf[]) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < buf.length; i++) {
String hex = Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex.toUpperCase());
}
return sb.toString();
}

public static byte[] parseHexStr2Byte(String hexStr) {
if (hexStr.length() < 1)
return null;
byte[] result = new byte[hexStr.length()/2];
for (int i = 0;i< hexStr.length()/2; i++) {
int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
result[i] = (byte) (high * 16 + low);
}
return result;
}
}


...全文
447 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangpan_123 2016-05-12
  • 打赏
  • 举报
回复
用delphi 的AES 算出的结果 跟 java算出来的不一样
huangpan_123 2016-05-12
  • 打赏
  • 举报
回复
java 内容:123456 key: 123321 加密后的16进制结果是 671F543C07AF8ADEAC226745EBC40D61 delphi转的 和网上转的就没有一个和这对的上的
huangpan_123 2016-05-12
  • 打赏
  • 举报
回复
http://www.cnblogs.com/freeliver54/archive/2011/10/08/2202136.html 妈蛋,对接的那边的java代码有bug。。
huangpan_123 2016-05-12
  • 打赏
  • 举报
回复
引用 1 楼 huangpan_123 的回复:
用delphi 的AES 算出的结果 跟 java算出来的不一样
parseByte2HexStr parseHexStr2Byte 这2个 看起来就是转16进制字符,转byte数组,delphi的aes库跟这java转出来的结果差异很大。跟网上在线aes加解密也不一样
chengangcsdn 2016-05-12
  • 打赏
  • 举报
回复
如果自己写的逻辑,应该是一样的哈.可以指定用unicode字符集.

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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