java aes加密与网上在线加密不同。谁能告诉我为啥?求个正确的例子,谢谢了!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java aes加密与网上在线加密不同。谁能告诉我为啥?求个正确的例子,谢谢了!相关的知识,希望对你有一定的参考价值。

我的代码如下:内容:test 密码:12345678
测试结果:73C58BAFE578C59366D8C995CD0B9D6D
在线结果:fdc2a7ef5a761218fd4c10294e3b516c
public static byte[] encrypt(String content, String password)
try
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(password.getBytes("utf-8")));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();

SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
byte[] byteContent = content.getBytes("utf-8");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] result = cipher.doFinal(byteContent);
return result;
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;

Cipher.getInstance("AES/ECB/PKCS5Padding");
就是这个东西有很多标准的,你得看下线上用的是什么标准

AES/CBC/NoPadding (128)
AES/CBC/PKCS5Padding (128)
AES/ECB/NoPadding (128)
AES/ECB/PKCS5Padding (128)
DES/CBC/NoPadding (56)
DES/CBC/PKCS5Padding (56)
DES/ECB/NoPadding (56)
DES/ECB/PKCS5Padding (56)
DESede/CBC/NoPadding (168)
DESede/CBC/PKCS5Padding (168)
DESede/ECB/NoPadding (168)
DESede/ECB/PKCS5Padding (168)
RSA/ECB/PKCS1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024, 2048)追问

你能给个精确一点的回答吗?这里用的是AES,也就是前四条。NoPadding的话加密内容不是16的整数直接异常,其它组合我都试过了。调不出。

追答

细看了一下你的代码,我不太明白这段的含义

KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(password.getBytes("utf-8")));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();

SecureRandom指的是一个随机数,参数是种子,而不是key的内容


修改了下代码就会得出线上的内容,一般密码都会用MD5生成个摘要,才用来作Key的值(MD5刚好是16个字节)

   SecretKeySpec key = new SecretKeySpec(Arrays.copyOf(password.getBytes("utf-8"), 16), "AES");
   Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
   byte[] byteContent = content.getBytes("utf-8");
   cipher.init(Cipher.ENCRYPT_MODE, key);
   byte[] result = cipher.doFinal(byteContent);
   return result;

参考技术A 这个都是统一的啊

向 VC++ 应用程序添加 AES 加密

【中文标题】向 VC++ 应用程序添加 AES 加密【英文标题】:Adding AES encryption to VC++ application 【发布时间】:2010-10-13 00:01:04 【问题描述】:

我在 VC++ 中创建了一个 GUI 应用程序,现在我想对数据进行 AES128 加密,我正在写它。

谁能告诉我如何在 VC++ 中做到这一点。

【问题讨论】:

我强烈建议您进行研究并选择现成的加密解决方案,如果此数据非常敏感,因为正确加密很难。 【参考方案1】:

Microsoft 提供了 CryptoAPI,它内置于 Windows。

文档的起点在这里:

http://msdn.microsoft.com/en-us/library/aa380255(v=VS.85).aspx

一般用法概述:

http://msdn.microsoft.com/en-us/library/ms867086.aspx

用 C 编写的示例程序:

http://msdn.microsoft.com/en-us/library/aa382016(v=VS.85).aspx

这里是支持的算法列表,包括 AES128:

http://msdn.microsoft.com/en-us/library/bb931357(VS.85).aspx

【讨论】:

【参考方案2】:

我推荐使用 http://www.openssl.org/ 有一个使用 vc++ 的指南@http://www.devside.net/guides/windows/openssl

--编辑

您应该使用 openssl 网站上的最新版本,而不是该指南中的旧版本,指南中的所有其他内容都适用。

【讨论】:

以上是关于java aes加密与网上在线加密不同。谁能告诉我为啥?求个正确的例子,谢谢了!的主要内容,如果未能解决你的问题,请参考以下文章

向 VC++ 应用程序添加 AES 加密

AES 加密算法 跨语言

Java对称与非对称加密解密,AES与RSA

AES 128 加密目标 C

如何使用java对密码加密 加密方式aes

钛 AES/CBC/PKCS5Padding